1. 방법
- top 실행 결과에서 WLS를 시작한 유저의 것 중 CPU 사용량이 높은 PID를 찾는다.
- kill -3 <PID>를 실행하여 WebLogic Server의 스레드 덤프를 여러 번 생성한다.
- 첫 번째 단계에서 얻은 PID 번호를 16진수 값으로 변환한다. (Linux용 JVM은 Java 스레드를 native 스레드로 구현하였으므로 각 스레드는 별도의 Linux 프로세스가 됨)
- 스레드 덤프에서 "nid=" 다음에 나오는 값이 이전 단계에서 가져온 16진수와 일치하는 스레드를 찾는다.(이렇게 하면 높은 CPU 사용량 문제를 발생시키는 스레드를 알 수 있음)
- 사용자의 코드에서 이러한 문제가 발생한 이유를 파악한다.
2. 예제
2-1. 16진수 변환
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND ........... 22962 usera 9 0 86616 84M 26780 S 0.0 4.2 0:00 java ...........
PID가 22962이면 16진수 값은 0x59B2가 된다.
2-2. 스레드 확인
이 16진수 값을 사용하고 스레드 덤프에서 "nid=" 다음에 해당 값이 나오는 올바른 스레드를 찾아 가져온다. 예를 들어, 해당 스레드에 문제가 있을 경우 0x59B2는 ExecuteThread "0"이 된다.
"ExecuteThread: '0' for queue: 'default'" daemon prio=1 tid=0x83da550 nid=0x59b2 waiting on monitor [0x56138000..0x56138870] at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:415) at weblogic.kernel.ExecuteThread.waitForRequest(ExecuteThread.java:146) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:172)
2-3. 한방 스크립트
for loopnum in 1 2 3 do top -b -n1 >> dump_high_cpu.txt kill -3 $1 echo "cpu snapshot and thread dump done. #" $loopnum sleep 1 echo "Done sleeping." done