WAS가 죽기 전에 로그 남기기

· 운영Java트러블슈팅


공개 가능한 형태로 익명화한 운영 기록.

WAS(Tomcat) 몇 대가 간헐적으로 OutOfMemory로 응답 불가가 됐다. 급해서 재기동하면 서비스는 살아나는데, 그 순간 메모리 상태가 같이 날아가서 원인을 못 봤다. “키우고 재기동”만 반복하는 느낌이었다.

그래서 사양을 키우기 전에 증거 남기는 설정부터 깔았다. catalina.sh(또는 setenv.sh)에 옵션을 준다.

# Heap 고정
export CATALINA_OPTS="$CATALINA_OPTS -Xms2g -Xmx2g"

# OOM 시 자동 HeapDump
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/tomcat/heapdump

# GC 로그 (Java 8 기준)
-Xloggc:/var/log/tomcat/gc.log
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC

-Xms-Xmx를 같게 고정해서 런타임 중 힙 리사이즈 비용을 없앴고, 크기는 가용 메모리랑 다른 프로세스를 보고 잡았다.

확인은 이렇게.

jmap -heap <pid>            # Heap 반영 확인
jstat -gcutil <pid> 1000    # GC 빈도, old 영역 추이
ls -lh /var/log/tomcat/heapdump   # OOM 재현 시 덤프 생기는지

덤프는 나중에 MAT로 열어서 어떤 객체가 힙을 잡고 있었는지 추적하면 된다. 비슷한 시기 DB(Tibero)도 Shared Memory 부족으로 불안정했는데, 설정(.tip)의 TOTAL_SHM_SIZE·MEMORY_TARGET을 올리고 재기동해서 풀었다.

OOM은 “더 키우면 해결”이 아니었다. heapdump랑 gclog를 미리 깔아두니, 다음 장애가 원인 잡을 기회가 됐다.


예전 블로그에 적었던 작업 기록을 옮겨온 글입니다.


← Blog 목록