장애 대응 (jstack·jmap·OOM killer·FD)
6. 연습 문제
문제 1. 덤프 세 장
PID 4321 의 스레드 덤프를 5초 간격으로 세 장 저장하는 한 줄을 쓰세요.
for i in 1 2 3; do jstack 4321 > /tmp/td$i.txt; sleep 5; done파일 이름에 번호를 붙여 순서를 남깁니다. diff td1.txt td2.txt 로 변하지 않는 스택을 찾습니다.
문제 2. TID 변환
top -H 에서 CPU 99% 인 TID 가 20493 입니다. 덤프에서 그 스레드를 찾는 명령을 쓰세요.
grep -A10 "nid=0x$(printf '%x' 20493)" td1.txtprintf '%x' 가 20493 을 500d 로 바꿉니다. 명령 치환으로 한 줄에 넣었습니다.
문제 3. 증거 판단
앱이 죽었고 journalctl 에 status=9/KILL, 앱 로그에는 에러가 없습니다. 원인 후보와 확인 명령을 쓰세요.
커널 OOM killer 입니다. dmesg -T | grep -i 'killed process' 로 java 가 죽은 기록을 확인합니다. 대책은 -Xmx 축소나 같은 서버의 다른 프로세스 분리입니다. 누군가 kill -9 를 했을 가능성도 있어 last 와 셸 히스토리를 봅니다.
문제 4. 잠금 범인
덤프에서 waiting to lock <0x0000000700a1b2c8> 이 30개 보입니다. 그 잠금을 잡은 스레드를 찾는 명령을 쓰세요.
grep -B20 'locked <0x0000000700a1b2c8>' td1.txt | grep '^"'- locked 줄 위로 올라가 스레드 이름 줄을 찾습니다. 그 스레드의 스택 맨 위가 잠금을 쥔 채 오래 걸리는 코드입니다.
문제 5. FD 증가 감시
PID 4321 의 열린 FD 수를 10초마다 6번 찍는 한 줄을 쓰세요.
for i in $(seq 1 6); do echo "$(date +%T) $(ls /proc/4321/fd | wc -l)"; sleep 10; done수가 계속 늘면 누수입니다. lsof -p 4321 | tail -n 20 으로 최근에 열린 것이 무엇인지 봅니다.