리눅스 치트 시트
Offering: Self-managed
이 문서는 GitLab 지원 팀이 리눅스를 다룰 때 문제 해결을 위해 사용하는 정보 모음입니다.
투명성을 위해 여기 나열하며,
리눅스 경험이 있는 사용자들을 위한 것입니다. 현재 GitLab에 문제가 발생한 경우
이 정보를 사용하기 전에 지원 옵션을 확인하는 것이 좋습니다.
시스템 관리에 대한 도움을 제공하는 것은 GitLab 지원의 범위를 넘어섭니다.
GitLab 관리자는 선택한 배포에 대한 이러한 명령을 알고 있어야 합니다.
GitLab 지원 엔지니어인 경우 yum
-> apt-get
과 같은 명령을 번역하기 위한 교차 참조로 고려하세요.
아래의 대부분의 명령어에는 어떤 배포에 적용되는지에 대한 레이블이 없습니다.
기여를 통해 추가할 수 있도록 환영합니다.
시스템 명령어
배포 정보
# Debian/Ubuntu
uname -a
lsb_release -a
# CentOS/RedHat
cat /etc/centos-release
cat /etc/redhat-release
# 더 많은 정보를 제공합니다.
cat /etc/os-release
시스템 종료 또는 재부팅
shutdown -h now
reboot
권한
# 파일/디렉토리의 소유자:그룹 소유권 변경
chown root:git <file_or_dir>
# 파일을 실행 가능하게 만들기
chmod u+x <file>
파일 및 디렉토리
# 새 디렉토리 및 모든 하위 디렉토리 생성
mkdir -p dir/dir2/dir3
# 명령의 출력을 file.txt로 보내고 STDOUT 없음
ls > file.txt
# 명령의 출력을 file.txt로 보내고 STDOUT에서도 보기
ls | tee /tmp/file.txt
# 파일 내에서 검색 및 대체
sed -i 's/original-text/new-text/g' <filename>
설정된 모든 환경 변수 보기
env
검색
파일 이름
# 파일 시스템에서 파일 검색
find . -name 'filename.rb' -print
# 파일 위치 확인
locate <filename>
# 명령어 기록 보기
history
# CLI 이력 검색
<ctrl>-R
파일 내용
# -B/A = search_term 이전/이후 2줄 표시
grep -B 2 -A 2 search_term <filename>
# -<number>는 이전과 이후 둘 다 표시
grep -2 search_term <filename>
# 디렉토리의 모든 파일에서 검색(재귀적)
grep -r search_term <directory>
# GitLab 저장소의 네임스페이스/프로젝트/이름 검색
grep 'fullpath' /var/opt/gitlab/git-data/repositories/@hashed/<repo hash>/.git/config
# *.gz 파일을 검색하는 것은 zgrep과 동일
zgrep search_term <filename>
# 문자열 패턴을 포함하는 줄을 출력하는 빠른 grep
fgrep -R string_pattern <filename or directory>
CLI
# 명령어 기록 보기
history
# 'his'로 시작하는 마지막 명령 실행 (최소 3글자)
!his
# 명령어 기록 검색
<ctrl>-R
# 마지막 명령을 sudo로 실행
sudo !!
자원 관리
메모리, 디스크 및 CPU 사용량
# 디스크 공간 정보. '-h'는 사람이 읽을 수 있는 값으로 데이터를 제공합니다.
df -h
# 현재 디렉토리의 각 파일/디렉토리 및 그 내용의 크기
du -hd 1
# 또는 대안
du -h --max-depth=1
# 특정 크기(k, M, G) 이상의 파일을 찾고 정렬하여 나열
# 정확한 것을 위해 +를 제거하고, 미만은 -로
find / -type f -size +100M -print0 | xargs -0 du -hs | sort -h
# 시스템의 무료 메모리 찾기
free -m
# 메모리/CPU를 사용하는 프로세스 찾기 및 정렬
# 부하 평균은 1/CPU로 1, 5, 15분 동안
top -o %MEM
top -o %CPU
Strace
# 프로세스의 strace
strace -tt -T -f -y -yy -s 1024 -p <pid>
# -tt 마이크로초 단위의 타임스탬프를 출력합니다.
# -T 각 시스템 호출에 소요된 시간을 출력합니다.
# -f 포크된 자식 프로세스도 추적합니다.
# -y 파일 핸들과 관련된 경로를 출력합니다.
# -yy 소켓 및 장치 파일 핸들 세부정보를 출력합니다.
# -s 이벤트에 대해 출력할 최대 문자열 길이입니다.
# -o 출력 파일
# 모든 puma 프로세스에서 strace 실행
ps auwx | grep puma | awk '{ print " -p " $2}' | xargs strace -tt -T -f -y -yy -s 1024 -o /tmp/puma.txt
strace를 실행할 때 시스템 성능에 큰 영향을 미칠 수 있습니다.
Strace 리소스
- 빠른 안내를 원하시면 strace zine를 참조하세요.
- Brendan Gregg는 strace 사용 방법에 대한 더 자세한 설명을 제공합니다.
- GitLab을 이해하기 위한 strace 사용에 대한 GitLab Unfiltered 비디오 시리즈도 있습니다.
Strace 파서 도구
우리의 strace-parser 도구는
strace
출력의 높은 수준 요약을 제공하는 데 사용될 수 있습니다. strace -C
와 유사하지만
훨씬 더 자세한 통계를 제공합니다.
MacOS 및 Linux 바이너리 이용 가능하며, Rust 컴파일러가 있다면 소스에서 빌드할 수 있습니다.
도구 사용 방법
먼저 summary
플래그와 함께 도구를 실행하여
활동적으로 작업을 수행하는 데 소요된 시간으로 정렬된 상위 프로세스의 요약을 가져옵니다.
또한 -s
또는 --sort
플래그를 사용하여 총 시간, 발생한 시스템 호출의 수, PID 번호 및 자식 프로세스 수에 따라 정렬할 수 있습니다.
결과 수는 기본적으로 25개의 프로세스이지만
-c
/--count
옵션을 사용하여 변경할 수 있습니다. 전체 세부정보는 --help
를 참조하십시오.
$ ./strace-parser sidekiq_trace.txt summary -c15 -s=pid
상위 15개 PID별 PID #
-----------
pid actv (ms) wait (ms) user (ms) total (ms) % of actv syscalls children
------- ---------- ---------- ---------- ---------- --------- --------- ---------
16706 0.000 0.000 0.000 0.000 0.00% 0 0
16708 0.000 0.000 0.000 0.000 0.00% 0 0
16716 0.000 0.000 0.000 0.000 0.00% 0 0
16717 0.000 0.000 0.000 0.000 0.00% 0 0
16718 0.000 0.000 0.000 0.000 0.00% 0 0
16719 0.000 0.000 0.000 0.000 0.00% 0 0
16720 0.389 9796.434 1.090 9797.912 0.02% 16 0
16721 0.000 0.000 0.000 0.000 0.00% 0 0
16722 0.000 0.000 0.000 0.000 0.00% 0 0
16723 0.000 0.000 0.000 0.000 0.00% 0 0
16804 0.218 11099.535 1.881 11101.634 0.01% 36 0
16813 0.000 0.000 0.000 0.000 0.00% 0 0
16814 1.740 11825.640 4.616 11831.996 0.10% 57 0
16815 2.364 12039.993 7.669 12050.026 0.14% 80 0
16816 0.000 0.000 0.000 0.000 0.00% 0 0
PIDs 93
real 0m12.287s
user 0m1.474s
sys 0m1.686s
요약을 기반으로 특정 프로세스에 대한 시스템 호출의 세부정보를 보려면
-p
/--pid
플래그를 사용하거나 정렬된 목록을 위해 -s
/--stats
플래그를 사용할 수 있습니다.
--stats
는 요약과 동일한 정렬 및 개수 옵션을 사용합니다.
./strace-parser sidekiq_trace.txt p 16815
PID 16815
80 syscalls, active time: 2.364ms, user time: 7.669ms, total time: 12050.026ms
start time: 22:46:14.830267 end time: 22:46:26.880293
syscall count total (ms) max (ms) avg (ms) min (ms) errors
----------------- -------- ---------- ---------- ---------- ---------- --------
futex 5 10100.229 5400.106 2020.046 0.022 ETIMEDOUT: 2
restart_syscall 1 1939.764 1939.764 1939.764 1939.764 ETIMEDOUT: 1
getpid 33 1.020 0.046 0.031 0.018
clock_gettime 14 0.420 0.038 0.030 0.021
stat 6 0.277 0.072 0.046 0.031
read 6 0.170 0.036 0.028 0.020
openat 3 0.126 0.045 0.042 0.038
close 3 0.099 0.034 0.033 0.031
lseek 3 0.089 0.035 0.030 0.021
ioctl 3 0.082 0.033 0.027 0.023 ENOTTY: 3
fstat 3 0.081 0.034 0.027 0.022
---------------
PID 16815의 느린 파일 열기 시간:
dur (ms) timestamp error filename
---------- --------------- --------------- ---------
0.045 22:46:16.771318 - /opt/gitlab/embedded/service/gitlab-rails/config/database.yml
0.043 22:46:26.877954 - /opt/gitlab/embedded/service/gitlab-rails/config/database.yml
0.038 22:46:22.174610 - /opt/gitlab/embedded/service/gitlab-rails/config/database.yml
위의 예에서는 PID 16815
에 대해 어떤 파일이 열리는 데 더 많은 시간이 소요되었는지 확인할 수 있습니다.
결과에서 특별한 사항이 없을 때는
고객이 수행한 작업을 수행하는 동안 자신의 GitLab 인스턴스에서 strace
를 실행하고
두 결과의 요약을 비교한 후 차이점을 탐색하는 것이 좋은 방법입니다.
open 시스템 호출에 대한 통계
파일에 접근하기 위해 사용되는 open
및 openat
에 대한 호출에 대한 대략적인 수치입니다.
느린 스토리지는 Gitaly에서 악명 높은 DeadlineExceeded
오류를 발생시킬 수 있습니다.
또한 고객이 파일 시스템 성능을 확인하기 위해 수행할 수 있는 빠른 테스트에 대한 이항목을 참조하세요.
strace
에서의 타이밍 정보는 종종 다소 부정확할 수 있으므로
작은 차이는 중요한 것으로 간주되지 않아야 합니다.
설정 | 접근 시간 |
---|---|
EFS | 10 - 30 ms |
로컬 스토리지 | 0.01 - 1 ms |
네트워킹
포트
# 포트에서 수신 대기 중인 프로그램 찾기
netstat -plnt
ss -plnt
lsof -i -P | grep <port>
인터넷/DNS
# 도메인 IP 주소 표시
dig +short example.com
nslookup example.com
# 특정 네임서버를 사용하여 DNS 확인
# 8.8.8.8 = google, 1.1.1.1 = cloudflare, 208.67.222.222 = opendns
dig @8.8.8.8 example.com
nslookup example.com 1.1.1.1
# 호스트 제공자 찾기
whois <ip_address> | grep -i "orgname\|netname"
# 리디렉션이 있는 curl 헤더
curl --head --location "https://example.com"
# 네트워크에서 호스트에 도달할 수 있는지 테스트합니다. `ping6`은 IPv6 네트워크에서 작동합니다.
ping example.com
# 호스트에 도달하는 경로 표시. `traceroute6`는 IPv6 네트워크에서 작동합니다.
traceroute example.com
mtr example.com
# 네트워크 인터페이스의 세부 정보 목록
ip address
# 로컬 DNS 설정 확인
cat /etc/hosts
cat /etc/resolv.conf
systemd-resolve --status
# 호스트와의 트래픽 캡처
sudo tcpdump host www.example.com
패키지 관리
# Debian/Ubuntu
# 패키지 목록
dpkg -l
apt list --installed
# 설치된 패키지 찾기
dpkg -l | grep <package>
apt list --installed | grep <package>
# 패키지 설치
dpkg -i <package_name>.deb
apt-get install <package>
apt install <package>
# CentOS/RedHat
# 패키지 설치
yum install <package>
dnf install <package> # RHEL/CentOS 8+
rpm -ivh <package_name>.rpm
# 설치된 패키지 찾기
rpm -qa | grep <package>
로그
# 'n'이 표시할 라인 수인 로그 파일에서 마지막 라인 인쇄
tail -n /path/to/log/file