Application Servers & Java

리눅스에서 CPU 사용량이 높은 자바 쓰레드(Thread) 찾는 방법

midworker 2025. 5. 13. 20:51
반응형

리눅스에서 CPU 사용량이 높은 자바 쓰레드(Thread) 찾는 방법

Java 애플리케이션에서 특정 쓰레드가 비정상적으로 CPU를 많이 사용하는 경우, 시스템 전체 성능 저하나 장애로 이어질 수 있습니다. 이 글에서는 리눅스 환경에서 고CPU 쓰레드를 추적하는 절차와 명령어를 설명합니다.


1. 전체 흐름 요약

  1. top 또는 htop으로 Java 프로세스 확인
  2. ps로 PID 상세 조회
  3. top -H -p <PID>로 쓰레드별 CPU 사용량 확인
  4. printf로 TID(쓰레드 ID)를 16진수로 변환
  5. jstack으로 스레드 dump 후 TID 매칭

2. Java PID 확인

$ jps -lv
또는
$ ps -ef | grep java

3. 쓰레드별 CPU 사용량 확인

$ top -H -p <PID>
  • PID: Java 프로세스 ID
  • -H: 쓰레드 단위로 보기
  • %CPU가 높은 쓰레드의 PID를 기억 (이건 쓰레드 ID)

4. 쓰레드 ID(TID) → 16진수 변환

Java 쓰레드 덤프에서 TID는 16진수로 출력되므로, printf 명령으로 변환합니다:

$ printf "%x\n" <TID>

예:

$ printf "%x\n" 12345
3039

5. jstack으로 쓰레드 덤프 확인

$ jstack <Java PID> > jstack.txt

그다음, jstack.txt 파일에서 해당 TID(예: nid=0x3039)를 검색합니다:

$ grep -A30 "nid=0x3039" jstack.txt

해당 TID가 어떤 쓰레드(메서드/클래스)를 실행 중인지 확인 가능!


6. 예시 정리

# Java 프로세스 PID 찾기
$ ps -ef | grep java

# PID가 4321이라고 가정
$ top -H -p 4321

# CPU 높은 TID가 12345일 때
$ printf "%x\n" 12345
3039

# 스레드 덤프 저장
$ jstack 4321 > jstack.txt

# 0x3039 검색
$ grep -A30 "nid=0x3039" jstack.txt

7. 추가 팁

  • htop에서도 F2Display optionsShow threads 설정으로 확인 가능
  • jcmd <PID> Thread.print 명령도 jstack 대안 가능
  • 반복되는 문제라면 perf, async-profiler 도구 사용을 고려

마무리

리눅스에서 Java 애플리케이션의 고CPU 문제를 진단하려면, top + jstack 조합만으로도 대부분의 원인 스레드를 식별할 수 있습니다.
CPU를 많이 먹는 스레드가 GC인지, 무한 루프인지, 외부 호출 대기인지 파악하는 것이 핵심입니다.

반응형