Print
카테고리: [ Operating System ]
조회수: 2769

1. 방법

  1. top 실행 결과에서 WLS를 시작한 유저의 것 중 CPU 사용량이 높은 PID를 찾는다.
  2. kill -3 <PID>를 실행하여 WebLogic Server의 스레드 덤프를 여러 번 생성한다.
  3. 첫 번째 단계에서 얻은 PID 번호를 16진수 값으로 변환한다. (Linux용 JVM은 Java 스레드를 native 스레드로 구현하였으므로 각 스레드는 별도의 Linux 프로세스가 됨)
  4. 스레드 덤프에서 "nid=" 다음에 나오는 값이 이전 단계에서 가져온 16진수와 일치하는 스레드를 찾는다.(이렇게 하면 높은 CPU 사용량 문제를 발생시키는 스레드를 알 수 있음)
  5. 사용자의 코드에서 이러한 문제가 발생한 이유를 파악한다.

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