Profile picture

[Linux] 서버 장애 시 확인해봐야 할 명령어 모음

JaehyoJJAng2023년 06월 08일

◾️ uptime

$ uptime
15:10:00 up  3:08,  1 user,  load average: 0.16, 0.14, 0.17

uptime은 현재 대기 중인 프로세스가 얼마나 있는지를 나타내는 load average 값을 확인하는 가장 쉬운 방법.

리눅스 시스템에서 이 값은 대기 중인 프로세스뿐만 아니라 disk i/o와 같은 i/o 작업으로 인하여 block된 프로세스까지 포함되어 있다.

위 명령어를 통하여 대강 리소스가 얼마만큼 사용되는지 알 수는 있지만 자세하게 파악하기는 어렵다.

load average에서 3개의 각 숫자는 1분, 5분, 15분의 load average 값을 의미한다.

이 값이 매우 높은 경우 CPU에 문제가 있을 가능성이 높고 uptime 명령만으로는 뭐가 문제인지 파악이 어렵기 때문에 뒤에 나오는 vmstat이나 mpstat같은 커맨드를 사용하여 확인해볼 수 있다.


◾️ dmesg

$ dmesg | tail
[ 8709.390154] br-872b1f3790af: port 1(vethce972c2) entered disabled state
[ 8709.390531] device vethce972c2 left promiscuous mode
[ 8709.390533] br-872b1f3790af: port 1(vethce972c2) entered disabled state
[ 8742.326369] br-caf1866ef9af: port 5(vetheb4cf0a) entered blocking state
[ 8742.326372] br-caf1866ef9af: port 5(vetheb4cf0a) entered disabled state
[ 8742.326430] device vetheb4cf0a entered promiscuous mode
[ 8742.416412] eth0: renamed from vethcb1b2fc
[ 8742.432108] IPv6: ADDRCONF(NETDEV_CHANGE): vetheb4cf0a: link becomes ready
[ 8742.432133] br-caf1866ef9af: port 5(vetheb4cf0a) entered blocking state
[ 8742.432135] br-caf1866ef9af: port 5(vetheb4cf0a) entered forwarding state

dmesg는 시스템 메시지를 확인할 수 있는 명령어이다. 부팅 로그를 시작으로 모든 커널메시지가 출력되기 때문에 tail을 이용하여 마지막 10줄만 출력하도록 한 것이다. 이 메시지를 통해서 성능에 문제를 줄 수 있는 에러를 찾을 수 있다.


◾️ vmstat

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  1 847412 26917184  17404 918660    3  105   799   115  430  732  4  2 94  0  0
 0  0 847412 26917184  17404 918720    0    0    12     0 1334 2310  4  2 95  0  0
 ....

vmstat은 virtual memory stat의 약자이다.

1을 인자로 준 vmstat은 1초마다 서버 리소스 정보를 출력해준다.

  • r: CPU에서 동작 중인 프로세스의 숫자. CPU에서 포화가 발생하는지 확인할 때에 참고. r 값이 CPU의 값 보다 큰 경우 포화되어 있다고 해석
  • free: free memory를 kb 단위로 나타냄.
  • si, so: swap-in, swap-out에 대한 값. 0이 아니라면 현재 시스템에 메모리가 부족한 것
  • us, sy, id, wa, st: 모든 CPU의 평균적인 CPU time을 측정한 값.
    • us: user time
    • sy: system time
    • id: idle
    • wa: wait I/O
    • st: stolen time (stolen time은 hypervisor가 가상 CPU를 서비스 하는 동안 실제 CPU를 차지한 시간을 의미)

◾️ mpstat

해당 명령어를 사용하기 위해서는 sysstat 설치

$ apt-get install -y sysstat

$ mpstat -p ALL 1
Linux 5.15.0-94-generic (game) 	02/16/2024 	_x86_64_	(3 CPU)

03:24:03 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:24:04 PM  all    1.66    1.32    0.99    0.00    0.00    0.33    0.00    0.00    0.00   95.70
03:24:04 PM    0    0.00    2.02    0.00    0.00    0.00    1.01    0.00    0.00    0.00   96.97
03:24:04 PM    1    3.96    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00   95.05
03:24:04 PM    2    0.98    1.96    1.96    0.00    0.00    0.00    0.00    0.00    0.00   95.10

mpstat 커맨드는 CPU time을 CPU 별로 측정할 수 있음.

위 방법은 각 CPU별로 불균형한 상태를 확인할 때에 사용. 한 CPU만 사용하고 있다는 것은 application이 single thread로 동작하고 있다는 의미가 됨.


◾️ pidstat

$ pidstat 1
Linux 5.15.0-94-generic (game) 	02/16/2024 	_x86_64_	(3 CPU)

03:25:13 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
03:25:14 PM  1000      1718    8.00    1.00    0.00    0.00    9.00     2  PalServer-Linux
03:25:14 PM     0     11822    1.00    0.00    0.00    0.00    1.00     0  node

pidstat은 process당 top 명령을 수행하는 것과 비슷. 다만 top 명령어와의 차이점이라면 pidstat은 스크린 전체에 표시하는 것이 아닌 지속적으로 변화하는 상황을 띄워주기 때문에 상황 변화를 기록하기 좋음.


◾️ iostat

$ iostat -xz 1
Linux 5.15.0-94-generic (game) 	02/16/2024 	_x86_64_	(3 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.40    1.38    1.64    0.08    0.02   94.49

Device            r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz     f/s f_await  aqu-sz  %util
dm-0             7.75    397.48     0.00   0.00    0.18    51.28   80.69    341.81     0.00   0.00    0.44     4.24    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.04   0.36
loop0            0.01      0.17     0.00   0.00    0.21    22.65    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00
loop1            0.01      0.18     0.00   0.00    0.16    19.59    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00
loop2            0.01      0.06     0.00   0.00    0.17     9.07    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00
loop3            0.01      0.06     0.00   0.00    0.16     8.86    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00
loop4            0.12      5.09     0.00   0.00    0.14    41.20    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.03
loop5            0.02      0.20     0.00   0.00    0.14    10.12    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00
loop6            0.00      0.00     0.00   0.00    0.55     1.27    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00
sda             36.40   2324.69     1.49   3.94    0.07    63.86    5.10    341.82    75.61  93.69    0.34    67.08    0.00      0.00     0.00   0.00    0.00     0.00    0.45    1.32    0.00   0.53
sr0              0.03      1.02     0.00   0.00    0.19    37.81    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

block device(HDD,SDD ...)가 어떻게 동작하는지 이해하기 좋은 툴.


  • r/s, w/s rkB/s, wkB/s: read 요청과 write 요청, read kB/s, write kB/s를 의미함.
    • 어떤 요청이 가장 많이 들어왔는지 확인할 수 있는 중요한 지표.
    • 성능 문제는 생각보다 과도하게 들어오는 요청에 의해 발생하는 경우도 있기 때문
  • await: I/O 평균 처리 시간을 밀리초로 표현한 값.
    • application한테 I/O 요청을 queue하고 서비스를 받는데 걸리는 시간이기 때문에 application이 이 시간동안 대기하게 됨.
    • 일반적인 장치의 요청 처리 시간보다 긴 경우 블럭 장치 자체의 문제가 있거나 장치가 포화된 상태임을 의미

◾️ free

$ free -m
               total        used        free      shared  buff/cache   available
Mem:           28061         942       26150           1         968       26739
Swap:           8191         813        7378
  • buffer: Block 장치 I/O의 buffer 캐시 사용량
  • cached: 파일 시스템에서 사용되는 page cache의 양

위 값들이 0에 가까워지면 안된다. 이는 곧 높은 Disk I/O가 발생하고 있음을 의미한다
(iostat으로 확인 가능)


◾️ sar

sar -n DEV 1

$ sar -n DEV 1
Linux 5.15.0-94-generic (game) 	02/16/2024 	_x86_64_	(3 CPU)

03:33:17 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
03:33:18 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:33:18 PM     ens18      2.00      1.00      0.12      0.16      0.00      0.00      0.00      0.00
03:33:18 PM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:33:18 PM br-caf1866ef9af      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:33:18 PM br-d1bb618ddb67      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:33:18 PM vethd181427      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:33:18 PM veth6d522c5      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:33:18 PM vethe8dbc16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:33:18 PM vethb955523      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:33:18 PM veth9838c3f      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:33:18 PM vetheb4cf0a      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

위 명령어로 network throughput(Rx, Tx KB/s)을 측정할 수 있다.


sar -n TCP,ETCP 1

$ sar -n TCP,ETCP 1
Linux 5.15.0-94-generic (game) 	02/16/2024 	_x86_64_	(3 CPU)

03:35:28 PM  active/s passive/s    iseg/s    oseg/s
03:35:29 PM      0.00      0.00      1.00      1.00

03:35:28 PM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s
03:35:29 PM      0.00      0.00      0.00      0.00      0.00

위 명령어로 TCP 통신량을 요약해서 확인이 가능하다.


  • active/s: 로컬에서부터 요청한 초당 TCP 커넥션 수
  • passive/s: 원격으로부터 요청한 초당 TCP 커넥션 수
  • retrans/s: 초당 TCP 재연결 수

activepassive 수를 보는 것은 서버의 부하를 대강 측정하는데에 편리하다.

위 설명을 참고하면 active를 outbound, passive를 inbound 연결로 판단할 수 있는데, 꼭 그렇지만은 않다고 한다.
(예를 들어 localhost에서 localhost로 연결같은 connection)


retransmits는 네트워크나 서버의 이슈가 있음을 의미한다. 신뢰성이 떨어지는 네트워크 환경이나(공용인터넷),

서버가 처리할 수 있는 용량 이상의 커넥션이 붙어서 패킷이 드랍되는 것을 의미한다.


◾️ htop

$ htop

image
htop은 텍스트 기반의 대화형 프로세스 뷰어로서, 리눅스와 유닉스 시스템에서 실행됩니다. htop은 top 명령어와 유사하지만 더 많은 기능을 제공하며, 사용자 친화적인 인터페이스를 제공합니다.

htop을 사용하여 시스템의 현재 상태와 프로세스의 활동을 실시간으로 모니터링할 수 있습니다. htop은 다음과 같은 정보를 제공합니다.

  • CPU 사용량 및 부하
  • 메모리 사용량 및 스왑 상태
  • 프로세스 목록 및 해당 상태
  • 프로세스 ID, 사용자, CPU 및 메모리 사용량 등의 세부 정보

◾️ df -Th

$ df -Th
Filesystem                        Type   Size  Used Avail Use% Mounted on
tmpfs                             tmpfs  2.8G  1.6M  2.8G   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv ext4    97G   20G   72G  22% /
tmpfs                             tmpfs   14G     0   14G   0% /dev/shm
tmpfs                             tmpfs  5.0M     0  5.0M   0% /run/lock
/dev/sda2                         ext4   2.0G  129M  1.7G   8% /boot
tmpfs                             tmpfs  2.8G  4.0K  2.8G   1% /run/user/1000

디스크 용량이 다 차게되면 서버가 먹통이 된다. Avail쪽을 항상 잘 체크하도록 하자.


◾️ du -sh /*

$ du -sh /* 2>/dev/null | grep 'G'
3.7G	/home
1.4G	/snap
8.1G	/swap.img
3.3G	/usr
1.2G	/var

위 명령어로 용량이 높은 폴더를 찾아낼 수 있다.


Loading script...