리눅스 치트 시트

Tier: Free, Premium, Ultimate Offering: Self-Managed

GitLab 지원팀이 때때로 문제 해결 시 사용하는 리눅스 관련 정보를 모은 것입니다. 투명성을 위해 여기에 나열되어 있으며, 리눅스에 대한 경험이 있는 사용자를 대상으로 합니다. 현재 GitLab에서 문제가 발생하고 있는 경우, 이 정보를 사용하기 전에 먼저 지원 옵션을 확인해보는 것이 좋습니다.

경고: 시스템 관리를 지원하는 것은 GitLab 지원팀의 범위를 벗어납니다. GitLab 관리자는 자신이 선택한 유통 파트너의 명령을 알고 있어야 합니다. GitLab 지원 엔지니어의 경우 yumapt-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 시스템 콜의 통계

다양한 설정에서 openopenat (파일에 액세스하는 데 사용됨) 호출에 대한 근사 숫자입니다. 느린 저장소는 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