들어가며


서버에 문제가 생겼을 때 적절한 도구를 사용하여 분석할 수 있어야 하는데 이에 대한 내용을 간단히 알아보고 정리해보자.

서버 문제 분석을 위한 도구


  1. Thread Dump
  2. Heap Dump
  3. TCP Dump
  4. Async Profiler

Thread Dump


1. Thread Dump란?

Thread Dump는 JVM에서 실행 중인 모든 스레드의 상태와 스택 트레이스를 한눈에 볼 수 있는 스냅샷이다. 즉, 현재 어떤 스레드가 무엇을 하고 있는지를 보는 도구이다.

2. 언제 Thread Dump를 떠야하나?

상황 설명 상태
CPU 사용량 100% CPU 바운드 작업이 많을 때 RUNNABLE
thread busy / executor active count 가 높은 경우 스레드 풀이 꽉 찼을 때 RUNNABLE / WAITING
처리 속도가 매우 느림 락 경쟁, I/O 블로킹 가능 BLOCKED / WAITING
DB 커넥션 부족 커넥션 풀 점유 WATING
특정 API만 타임 아웃 락 또는 외부 API 대기 BLOCKED / WAITING

3. JVM 스레드 생명 주기와 상태

stateDiagram-v2
    [*] --> NEW
    NEW --> RUNNABLE
    RUNNABLE --> BLOCKED : synchronized 대기
    RUNNABLE --> WAITING : wait(), join()
    RUNNABLE --> TIMED_WAITING : sleep(), wait(timeout)
    BLOCKED --> RUNNABLE
    WAITING --> RUNNABLE
    TIMED_WAITING --> RUNNABLE
    RUNNABLE --> TERMINATED
상태 의미 언제 발생? 주의 포인트
RUNNABLE 실행 중 / 대기 중 CPU 작업 CPU 100% 시 확인
BLOCKED synchronized 진입 대기 락 경쟁 다수 발생 시 문제
WAITING 다른 스레드 신호 대기 wait(), join() 데드락 의심
TIMED_WAITING 일정 시간 대기 sleep(), wait(timeout) 정상적 대기
TERMINATED 스레드 종료 완료됨 무시 가능

4. Thread Dump 수집 방법