Linux Cheat Sheet
이 문서는 GitLab 지원팀이 때때로 문제 해결 시 사용하는 Linux 정보를 모아 놓은 것입니다. 투명성을 위해 여기에 나열되어 있으며 Linux에 대한 경험이 있는 사용자를 대상으로 합니다. 현재 GitLab에서 문제가 발생하고 있다면, 이 정보를 사용하기 전에 먼저 지원 옵션을 확인해보시기를 권장합니다.
아래 대부분의 명령은 어떤 배포판에서 작동하는 지 표시되지 않았습니다. 이에 대한 기여는 환영합니다.
시스템 명령어
배포 정보
# 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 <파일_또는_디렉터리>
# 파일을 실행 가능하게 만들기
chmod u+x <파일>
파일 및 디렉터리
# 새 디렉터리 및 모든 하위 디렉터리 생성
mkdir -p dir/dir2/dir3
# 명령의 출력을 file.txt로 보내기(표준 출력 없음)
ls > file.txt
# 명령의 출력을 file.txt로 보내기 및 표준 출력 확인
ls | tee /tmp/file.txt
# 파일 내에서 검색 및 치환
sed -i 's/original-text/new-text/g' <파일이름>
모든 설정된 환경 변수 보기
env
검색
파일 이름
# 파일 시스템에서 파일 검색
find . -name 'filename.rb' -print
# 파일 찾기
locate <파일이름>
# 명령어 기록 보기
history
# CLI 기록 검색
<ctrl>-R
파일 내용
# -B/A = 검색어 이전/이후 2줄 표시
grep -B 2 -A 2 search_term <파일이름>
# -<숫자>는 이전과 이후 양쪽을 모두 보여줌
grep -2 search_term <파일이름>
# 디렉터리 내의 모든 파일에서 검색(재귀적)
grep -r search_term <디렉터리>
# GitLab 리포지터리의 네임스페이스/프로젝트/이름 검색
grep 'fullpath' /var/opt/gitlab/git-data/repositories/@hashed/<리포 해시>/.git/config
# *.gz 파일을 통한 빠른 grep 출력
zgrep search_term <파일이름>
# 문자열 패턴을 포함하는 줄을 빠르게 출력하는 grep
fgrep -R string_pattern <파일이름 또는 디렉터리>
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 fork한 모든 자식 프로세스도 추적
# -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
플래그로 도구를 실행하여 시간을 소모해 작업을 수행한 프로세스를 기준으로 상위 프로세스의 요약 정보를 얻을 수 있습니다. -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
PID 수행: 93
실제 시간: 0분 12.287초
사용자 시간: 0분 1.474초
시스템 시간: 0분 1.686초
요약을 통해 시스템 호출에 의해 시간을 많이 사용한 프로세스 상세 정보를 볼 수 있습니다. -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
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의 가장 오래걸린 파일 열기 시간:
지속 시간(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 = 구글, 1.1.1.1 = 클라우드플레어, 208.67.222.222 = 오픈DNS
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