InfoGrab Docs

Linux 치트 시트

요약

이것은 GitLab 지원팀이 문제를 해결하는 동안 사용하는 Linux 관련 정보 모음입니다. 시스템 관리 지원은 GitLab 지원 범위 밖입니다. 아래의 대부분의 명령은 어떤 배포판에서 작동하는지 표시하지 않았습니다. strace는 실행 중일 때 시스템 성능에 큰 영향을 미칠 수 있습니다.

이것은 GitLab 지원팀이 문제를 해결하는 동안 사용하는 Linux 관련 정보 모음입니다. 투명성을 위해, 그리고 Linux 경험이 있는 사용자를 위해 여기에 나열되어 있습니다. 현재 GitLab에 문제가 있다면 이 정보를 사용하기 전에 지원 옵션을 먼저 확인하는 것이 좋습니다.

Warning

시스템 관리 지원은 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 파서 도구#

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 시스템 호출 통계#

다양한 구성에서 파일에 액세스하는 데 사용되는 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

Linux 치트 시트

Tier: Free, Premium, Ultimate
Offering: GitLab Self-Managed
원문 보기
요약

이것은 GitLab 지원팀이 문제를 해결하는 동안 사용하는 Linux 관련 정보 모음입니다. 시스템 관리 지원은 GitLab 지원 범위 밖입니다. 아래의 대부분의 명령은 어떤 배포판에서 작동하는지 표시하지 않았습니다. strace는 실행 중일 때 시스템 성능에 큰 영향을 미칠 수 있습니다.

이것은 GitLab 지원팀이 문제를 해결하는 동안 사용하는 Linux 관련 정보 모음입니다. 투명성을 위해, 그리고 Linux 경험이 있는 사용자를 위해 여기에 나열되어 있습니다. 현재 GitLab에 문제가 있다면 이 정보를 사용하기 전에 지원 옵션을 먼저 확인하는 것이 좋습니다.

Warning

시스템 관리 지원은 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 파서 도구#

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 시스템 호출 통계#

다양한 구성에서 파일에 액세스하는 데 사용되는 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