Linux 참고 자료

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

다양한 설정에서 파일에 액세스하는 openopenat 호출에 대한 대략적인 숫자입니다. 느린 리포지터리는 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