Linux 치트 시트
Offering: GitLab Self-Managed
이것은 GitLab 지원팀이 문제를 해결하는 동안 사용하는 Linux 관련 정보 모음입니다. 시스템 관리 지원은 GitLab 지원 범위 밖입니다. 아래의 대부분의 명령은 어떤 배포판에서 작동하는지 표시하지 않았습니다. strace는 실행 중일 때 시스템 성능에 큰 영향을 미칠 수 있습니다.
이것은 GitLab 지원팀이 문제를 해결하는 동안 사용하는 Linux 관련 정보 모음입니다. 투명성을 위해, 그리고 Linux 경험이 있는 사용자를 위해 여기에 나열되어 있습니다. 현재 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 기록 검색
-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
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
# 명령 기록 검색
-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 진을 참조하세요.
- Brendan Gregg는 strace 사용 방법에 대한 더 자세한 설명을 제공합니다.
- strace를 사용하여 GitLab을 이해하는 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
Top 15 PIDs by 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
---------------
Slowest file open times for 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
