리눅스 치트 시트

Tier: Free, Premium, Ultimate

Offering: Self-managed

이 문서는 GitLab 지원 팀이 리눅스를 다룰 때 문제 해결을 위해 사용하는 정보 모음입니다.

투명성을 위해 여기 나열하며,

리눅스 경험이 있는 사용자들을 위한 것입니다. 현재 GitLab에 문제가 발생한 경우

이 정보를 사용하기 전에 지원 옵션을 확인하는 것이 좋습니다.

caution

시스템 관리에 대한 도움을 제공하는 것은 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 = search_term 이전/이후 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 or directory>

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    포크된 자식 프로세스도 추적합니다.

# -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 파서 도구

우리의 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

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
  ---------------

  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 시스템 호출에 대한 통계

파일에 접근하기 위해 사용되는 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