리눅스 치트 시트
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 = 검색어 이전/이후 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 또는 디렉토리>
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, 5, 15분 동안의 부하 평균은 1/CPU입니다.
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 Unfiltered 비디오 시리즈를 통해 GitLab을 이해하기 위해 strace를 사용하는 방법을 알아보세요.
Strace 파서 도구
우리의 strace-parser 도구는 strace
출력의 고수준 요약을 제공하는 데 사용될 수 있습니다. 이는 strace -C
와 유사하지만 훨씬 자세한 통계를 제공합니다.
MacOS 및 Linux 이진 파일은 여기에서 제공되며, Rust 컴파일러를 사용하여 소스에서 빌드할 수도 있습니다.
도구 사용 방법
먼저 summary
플래그와 함께 도구를 실행하여 시간을 소비하며 활발하게 작업하는 상위 프로세스의 요약을 얻습니다. PID #, 시스템 호출 수, 자식 프로세스 수를 기준으로 정렬할 수 있으며, 결과 개수는 기본적으로 25개이지만 -c
/--count
옵션을 사용하여 변경할 수 있습니다. 전체 세부 정보에 대한 자세한 내용은 --help
를 참조하세요.
$ ./strace-parser sidekiq_trace.txt summary -c15 -s=pid
PID #로 상위 15개 프로세스
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
PID # 93
실제 소요 시간 0m12.287s
사용자 소요 시간 0m1.474s
시스템 소요 시간 0m1.686s
요약에 따라 -p
/--pid
로 특정 프로세스 또는 -s
/--stats
플래그로 정렬된 목록의 시스템 호출 세부 정보를 확인할 수 있습니다. --stats
는 summary와 동일한 정렬 및 개수 옵션을 사용합니다.
./strace-parser sidekiq_trace.txt p 16815
PID 16815
80 syscalls, active time: 2.364ms, user time: 7.669ms, total time: 12050.026ms
시작 시간: 22:46:14.830267 종료 시간: 22:46:26.880293
syscall 개수 총 시간 (ms) 최대 시간 (ms) 평균 시간 (ms) 최소 시간 (ms) 오류
----------------- -------- ---------- ---------- ---------- ---------- --------
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의 파일 열기 시간의 최대 시간:
시간(ms) 타임스탬프 오류 파일 이름
---------- --------------- --------------- ---------
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