Linux Cheat Sheet

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

이 문서는 GitLab 지원팀이 때때로 문제 해결 시 사용하는 Linux 정보를 모아 놓은 것입니다. 투명성을 위해 여기에 나열되어 있으며 Linux에 대한 경험이 있는 사용자를 대상으로 합니다. 현재 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 <파일_또는_디렉터리>

# 파일을 실행 가능하게 만들기
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 파서 도구

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

다양한 구성에서 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 = 구글, 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