Linux 참고 자료
이것은 GitLab 지원팀이 가끔 문제 해결 시 사용하는 Linux 정보 모음입니다. 투명성을 위해 여기에 나열되어 있으며, Linux 경험이 있는 사용자를 위해 제공됩니다. 현재 GitLab에 문제가 있는 경우, 이 정보를 사용하기 전에 먼저 지원 옵션을 확인해 보시기를 권장합니다.
아래의 대부분 명령에는 해당하는 배포판이 무엇인지에 대한 레이블이 지정되어 있지 않습니다. 이를 추가하는 데 도움이 되는 기여는 환영합니다.
시스템 명령어
배포 정보
# 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 시스템 호출에 대한 통계
다양한 설정에서 파일에 액세스하는 open 및 openat 호출에 대한 대략적인 숫자입니다. 느린 리포지터리는 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
도움말