Linux 참고 자료
이것은 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에 보내기 (STDOUT X)
ls > file.txt
# 명령어의 출력을 file.txt에 보내고 STDOUT에서도 확인하기
ls | tee /tmp/file.txt
# 파일 내에서 검색 및 대체
sed -i 's/원본_텍스트/새_텍스트/g' <파일명>
모든 설정된 환경 변수 보기
env
검색
파일 이름
# 파일 시스템에서 파일 검색
find . -name 'filename.rb' -print
# 파일 위치 찾기
locate <파일이름>
# 명령어 기록 보기
history
# CLI 기록 검색
<ctrl>-R
파일 내용
# -B/A = 검색_용어 이전/이후 2줄 표시
grep -B 2 -A 2 검색_용어 <파일명>
# -<숫자>는 이전과 이후 모두 표시
grep -2 검색_용어 <파일명>
# 디렉터리의 모든 파일에서 검색 (재귀적으로)
grep -r 검색_용어 <디렉터리>
# GitLab 리포지터리의 네임스페이스/프로젝트/이름 찾기
grep 'fullpath' /var/opt/gitlab/git-data/repositories/@hashed/<리포 해시>/.git/config
# *.gz 파일을 통한 검색은 zgrep로 동일 (gzip으로 압축한 파일)
zgrep 검색_용어 <파일명>
# 특정 문자열 패턴을 포함하는 행 출력
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분, 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 출력 파일
# 모든 퓨마 프로세스에 대해 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 비디오 시리즈에서 strace를 사용하는 방법을 확인할 수 있습니다(https://www.youtube.com/playlist?list=PL05JrBw4t0KoC7cIkoAFcRhr4gsVesekg)
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 시스템 호출, 활성 시간: 2.364ms, 사용자 시간: 7.669ms, 총 시간: 12050.026ms
시작 시간: 22:46:14.830267 종료 시간: 22:46:26.880293
시스템 호출 카운트 총 시간 (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
에 대해 파일을 열 때 더 오래 걸린 파일을 볼 수 있습니다.
결과에서 눈에 띄는 부분이 없을 때, 고객이 수행한 작업을 시스템에서 직접 실행하고 두 결과를 비교하여 차이점을 확인해 보는 것이 유용합니다.
open 시스템 호출에 대한 통계
다양한 설정에서 파일에 액세스하는 open
및 openat
호출에 대한 대략적인 숫자입니다. 느린 리포지터리는 Gitaly에서 DeadlineExceeded
오류를 발생시킬 수 있습니다.
또한 핸드북의 이 항목에서 파일 시스템 성능을 확인할 수 있는 고객용 빠른 테스트를 참조하세요.
strace
에서의 시간 정보는 종종 다소 부정확하기 때문에 작은 차이는 중요하지 않다고 간주해야 합니다.
설정 | 액세스 시간 |
---|---|
EFS | 10 - 30 ms |
로컬 리포지터리 | 0.01 - 1 ms |
네트워킹
포트
# 포트에서 수신 대기 중인 프로그램 찾기
netstat -plnt
ss -plnt
lsof -i -P | grep <포트>
인터넷/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