Server Hang Log 분석

Linux server hang 로그를 blocked task, 파일시스템 read-only, OOM, NETDEV WATCHDOG, kernel oops 유형으로 나누어 분석하는 장애 점검 가이드입니다.

Linux에서 “서버가 hang 걸렸다”는 말은 여러 상태를 섞어 부르는 경우가 많습니다. CPU가 바쁜 상태, I/O가 막힌 상태, 메모리 OOM, 파일시스템 read-only, 네트워크 드라이버 timeout, 커널 oops는 모두 증상이 다릅니다. 로그를 볼 때는 hang이라는 단어보다 어떤 커널 메시지가 같이 나왔는지 기준으로 분류해야 합니다.

1. blocked task 로그

[  431.234567] INFO: task myapp:1234 blocked for more than 120 seconds.
[  431.234568] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.

이 메시지는 보통 프로세스가 D 상태, 즉 interruptible하지 않은 I/O 대기 상태에 오래 머무를 때 나옵니다. CPU 부족보다 스토리지, NFS, block device, 파일시스템 lock 쪽을 먼저 의심합니다.

ps -eo pid,ppid,stat,wchan:32,comm,args | awk '$3 ~ /D/ {print}'
cat /proc/loadavg
vmstat 1 5
dmesg -T | egrep -i 'blocked for more than|I/O error|nfs|reset|abort' | tail -n 120

2. 파일시스템 오류와 read-only 전환

[  431.234567] EXT4-fs error (device sda1): ext4_find_entry:1437: inode #12345: comm myapp: reading directory lblock 0
[  431.234568] Aborting journal on device sda1-8.
[  431.234569] EXT4-fs (sda1): Remounting filesystem read-only

이 경우 애플리케이션 hang처럼 보이지만 실제로는 파일시스템 보호 동작일 수 있습니다. read-only로 remount되면 로그 쓰기, DB 쓰기, 임시 파일 생성이 실패합니다.

mount | grep ' ro[),]'
findmnt -D
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL,SERIAL
journalctl -k --no-pager | egrep -i 'EXT4|XFS|read-only|metadata I/O error' | tail -n 120

3. OOM 로그

[  431.234567] Out of memory: Kill process 1234 (myapp) score 999 or sacrifice child
[  431.234568] Killed process 1234 (myapp) total-vm:123456kB, anon-rss:12345kB, file-rss:0kB

OOM은 서버 전체가 멈춘 것이 아니라 커널이 특정 프로세스를 죽여 메모리를 회수한 상황입니다. 죽은 프로세스가 핵심 서비스라면 서비스 장애로 이어집니다.

journalctl -k --no-pager | egrep -i 'Out of memory|oom-killer|Killed process' | tail -n 80
free -h
swapon --show
ps -eo pid,ppid,stat,rss,vsz,pmem,comm --sort=-rss | head -n 15

4. 네트워크 transmit timeout

[  431.234567] eth0: transmit timed out, tx_status 0c 0005 c0 1234567c, resetting...
[  431.234568] NETDEV WATCHDOG: eth0 (driver): transmit queue 0 timed out

이 메시지는 NIC 드라이버, 가상 NIC, 물리 링크, offload, hypervisor 네트워크 문제와 연관될 수 있습니다. 웹이나 SSH가 끊기는 증상으로 보일 수 있습니다.

ip -s link show eth0
ethtool eth0 2>/dev/null | egrep 'Speed|Duplex|Link detected' || true
ethtool -S eth0 2>/dev/null | egrep -i 'err|drop|timeout|reset' || true
journalctl -k --no-pager | egrep -i 'NETDEV WATCHDOG|transmit timed out|link is down|link is up' | tail -n 120

5. 커널 oops와 panic 계열

[  431.234567] BUG: unable to handle kernel NULL pointer dereference at 00000000
[  431.234568] Oops: 0000 [#1] SMP
[  431.234569] CPU: 0 PID: 1234 Comm: myapp Tainted: G      D

oops는 커널이나 커널 모듈이 비정상 동작했다는 의미입니다. Tainted 플래그, 커널 버전, 로드된 모듈, 직전 하드웨어 오류를 같이 남겨야 합니다.

uname -a
lsmod | sort
journalctl -k -b --no-pager | egrep -i 'BUG:|Oops:|panic|Call Trace|Tainted' -A20 -B5

분석 순서

서버 hang 로그를 받으면 먼저 시간대를 고정하고, journalctl -k, dmesg -T, ps D state, vmstat, iostat, df/findmnt를 같이 봅니다. 이후 로그 유형을 blocked task, filesystem, OOM, network watchdog, kernel oops 중 하나로 분류합니다. 이 분류가 되어야 재부팅, 서비스 재시작, 스토리지 점검, 메모리 증설, 커널 업데이트 중 어떤 조치가 맞는지 판단할 수 있습니다.

BGM EVER