Profile picture

[Linux] 서버 장애 시 확인해봐야 할 목록 정리

JaehyoJJAng2024년 04월 21일

사전 준비

원활한 점검을 위해 아래 패키지를 사전에 설치해주자.

# Debian
sudo apt-get install -y sysstat

# Redhat
sudo yum install -y sysstat

# Arch
yay -S sysstat

1. 로그 점검

  • dmesg | tail 명령어로 커널 로그 확인
  • dmesg 명령만 실행 시 모든 커널에 대한 메시지를 출력하므로, tail을 파이프라인으로 넘겨 마지막 10줄만 출력하도록 하자.
  • dmesg -w 를 실행하면 실시간 로그 확인이 가능하다.
dmesg | tail

[...]
[   23.241970] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[   23.247129] Bridge firewalling registered
[   23.748429] Initializing XFRM netlink socket

2. CPU 상태 점검

  • 서버에 배포된 애플리케이션이 많은 경우 해당 애플리케이션이 점유하고 있는 resource를 점검해보고, 특정 애플리케이션의 리소스가 높다면 최적화를 고민해보도록 하자.
  • 아래 명령어들을 차례로 실행하여 CPU 상태를 점검해보자.

2-1. top

top

top - 12:27:19 up  1:49,  4 users,  load average: 0.10, 0.05, 0.01
작  업: 119 총계,   1 실행, 118 대기,   0 멈춤,   0 좀비
%Cpu:  0.1 us,  0.0 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB 메모리 :  15995.3 총계,  15063.3 잔여,    727.3 사용,    464.3 버퍼/캐시
MiB 스  왑:   1024.0 총계,   1024.0 잔여,      0.0 사용.  15267.9 가용  메모리

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                                                                                                                              
   1591 a-user    20   0   14604   6588   4992 S   0.3   0.0   0:00.27 sshd
      1 root      20   0   21024  12448   9196 S   0.0   0.1   0:00.67 systemd
      2 ...
      3 ...
      4 ...
      5 ...

2-2. mpstat

  • CPU 별 균형 상태 확인
  • sysstat 패키지 필요
mpstat -P ALL 1

Linux 6.9.6-arch1-1 (arch)      2024년 07월 29일        _x86_64_        (3 CPU)

122819초  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
122820초  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
1228200    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
1228201    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
1228202    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

3. 메모리 상태 확인

  • 적어도 500MB 이상의 bufferscached 메모리가 남아있는지 확인
free -m

               총계         사용        여분      공유    버퍼/캐시    가용
메모리:        15995         739       15050           0         464       15255
스  왑:         1023           0        1023
  • buffers: Block 장치 I/O의 buffer 캐시 사용량
  • cached: 파일 시스템에 사용되는 page cache
  • buffer, cached 값이 0에 가깝다는건 높은 Disk I/O가 발생했음을 의미함.
    • iostat으로도 확인 가능

[안전한 메모리 상태]

  • free memory 값이 0에 가까운 경우
  • used memorytotal에 가까운 경우
  • available memory (또는 free + buff/cache)에 충분한 여유가 있음.
  • Swap used 값에 변화가 없음

[위험한 메모리 상태]

  • available memory (또는 free + buff/cache) 값이 0에 가까움
  • swap used 값이 증가하거나 변동 중인 경우
  • dmesg | grep oom-killer 명령을 실행했을때 OutOfMemory-killer가 출력된 경우

4. 프로세스 (Thread) 상태 확인

4-1. ps

  • 띄워놓은 Process가 살아있는지 확인
  • Process가 과하게 생기거나 혹은 아예 죽어버리는 경우도 있음
ps -ef | grep <process name>

4-2. pidstat

  • pidstat으로 process 부하 확인. top 명령어와 유사하게 process 정보만을 정리하여 띄워줌.
pidstat 1

평균:       UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
평균:         0       202    0.00    0.12    0.00    0.00    0.12     -  kworker/2:2-events
평균:      1000       874    0.00    0.12    0.00    0.00    0.12     -  node
평균:      1000      1473    0.00    0.12    0.00    0.00    0.12     -  sshd
평균:      1000      1591    0.00    0.12    0.00    0.00    0.12     -  sshd
평균:      1000      2984    0.00    0.25    0.00    0.00    0.25     -  pidstat

5. Service / Daemon 확인

  • 서버 프로그램이 daemon으로 동작한다면, 해당 daemon이 정상 동작 중인지 확인
    • daemon: 백그라운드에서 동작하는 process
service <daemon name> status

6. 네트워크 상태 확인

6-1. ifconfig

  • 현재 서버의 network 설정 및 상태 확인
ifconfig

6-2. nc

  • Host 서버에 접속 가능한지 확인
  • TCP 80, 443(HTTP, HTTPS) 포트 점검
nc <hostname> <port>
nc localhost 80
nc localhost 443

6-3. lsof

  • 애플리케이션 배포 시 포트 충돌이 발생했을 경우, 어떤 프로세스와 포트가 중복 된건지 확인
  • 아래 예시는 충돌 포트가 8000인 경우
lsof -i TCP:8000

COMMAND  PID   USER FD   TYPE DEVICE SIZE/OFF NODE NAME
node    2698 a-user 30u  IPv4  13795      0t0  TCP *:irdmi (LISTEN)
node    2698 a-user 31u  IPv4  14397      0t0  TCP arch:irdmi->192.168.219.164:59576 (ESTABLISHED)
node    2698 a-user 33u  IPv4  13797      0t0  TCP arch:irdmi->192.168.219.164:59592 (ESTABLISHED)

6-4. netstat

  • 서버 응답이 늦어지는 경우, 트래픽이 서버에 몰려있는지 확인 (네트워크 커넥트 수 체크)
netstat -nap | grep "ESTAB" | wc -l

  • 1. 네트워크 연결 수가 많은데 요청이 외부에서 들어와 몰리는게 아니라면 서버에 이상이 있는 것.
  • 2. TIME_WAIT의 수가 비정상적으로 많다면, 서버로 들어오는 요청을 제대로 처리하고 있지 못하는 것. (병목)
netstat -nap | grep "TIME_WAIT" | wc -l

6-5. sar

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

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

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는 네트워크나 서버의 이슈가 있음을 의미한다. 신뢰성이 떨어지는 네트워크 환경이나(공용인터넷),

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


7. 디스크 상태 확인

  • 서버가 오랜 시간 재부팅 없이 가동 중인 경우 disk에 쓰레기가 쌓임.
  • Disk가 full 되면 시스템에서 파일을 만들지 못해 서버가 죽게됨.
  • 아래 명령어를 통해 Disk 볼륨 별로 얼마나 차있는지, 빈 공간이 얼마나 남았는지 확인
  • 위 문제를 간단하게 해결하기 위해서는 특정 주기마다 불 필요한 파일을 지우는 셸 스크립트를 작성하여 crontab에 등록.

7-1. df

df -h

7-2. iostat

  • iostat으로 디스크 성능 확인
  • sysstat 패키지 필요
iostat -xz 1

Linux 6.9.6-arch1-1 (arch)      2024년 07월 29일        _x86_64_        (3 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.79    0.00    0.14    1.50    0.00   97.57

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             1.66     38.98     0.00   0.00   13.92    23.54    0.74      3.71     0.00   0.00   12.03     5.04    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.03   1.96
dm-1             3.37     64.39     0.00   0.00    7.43    19.12    4.06     29.01     0.00   0.00   17.87     7.15    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.10   3.74
sda              3.76    104.36     1.31  25.85    6.57    27.76    2.20     32.71     2.59  54.08   20.52    14.85    0.00      0.00     0.00   0.00    0.00     0.00    0.74   36.92    0.10   4.15
sr0              0.00      0.13     0.00   0.00    0.27    35.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
r/s w/s rkB/s wkB/s
read 요청 write 요청 read kB/s 속도 write kB/s 속도
  • r/s 나 w/s 값이 너무 크지 않은지 확인
    • 예상보다 과도한 요청으로 문제가 발생한 경우
  • await : I/O 처리 평균 시간.
    • 일반적인 장치의 요청 처리 시간보다 긴 경우(위 예시 dm-1), 블럭 장치 자체의 문제 혹은 장치가 포화 상태임을 의미.

7-3. du

  • du 명령어로 용량이 높은 폴더를 찾아낼 수 있다.
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...