Application Servers & Java
리눅스에서 CPU 사용량이 높은 자바 쓰레드(Thread) 찾는 방법
midworker
2025. 5. 13. 20:51
반응형
리눅스에서 CPU 사용량이 높은 자바 쓰레드(Thread) 찾는 방법
Java 애플리케이션에서 특정 쓰레드가 비정상적으로 CPU를 많이 사용하는 경우, 시스템 전체 성능 저하나 장애로 이어질 수 있습니다. 이 글에서는 리눅스 환경에서 고CPU 쓰레드를 추적하는 절차와 명령어를 설명합니다.
1. 전체 흐름 요약
top
또는htop
으로 Java 프로세스 확인ps
로 PID 상세 조회top -H -p <PID>
로 쓰레드별 CPU 사용량 확인printf
로 TID(쓰레드 ID)를 16진수로 변환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
에서도F2
→Display options
→Show threads
설정으로 확인 가능jcmd <PID> Thread.print
명령도 jstack 대안 가능- 반복되는 문제라면
perf
,async-profiler
도구 사용을 고려
마무리
리눅스에서 Java 애플리케이션의 고CPU 문제를 진단하려면, top + jstack 조합만으로도 대부분의 원인 스레드를 식별할 수 있습니다.
CPU를 많이 먹는 스레드가 GC인지, 무한 루프인지, 외부 호출 대기인지 파악하는 것이 핵심입니다.
반응형