티스토리 뷰

728x90
반응형


 포스팅은 OS별 Thread의 CPU 점유 정보 확인 방법에 대해 알아보겠습니다.


OS의 CPU 과다 사용에 따른 추적을 위해 Thread 별 CPU 사용률을 확인하는 것은 매우 중요합니다. 각 OS별 확인 방법에 대해 자세히 살펴보겠습니다.


먼저 AIX입니다.
CPU를 점유중인 Thread를 찾기 위해 아래와 같은 명령어를 사용합니다.

$ ps –mp <pid> –o THREAD

CPU를 사용중인 TID 확인 (CP열)

USER     PID      PPID     TID     ST     CP    PRI     SC     WCHAN     F     TT     BND     COMMAND

ryan     3719314 778388          -A      94     60     65       *   342001 pts/23 -

-          -           -      975101   S       0      82      1     f10006000492fa08 400400 - - -

-          -           -     1015973  S       0      82      1     f100070f1000f840  8410400 - - -

-          -           -     1032447  S       0      82      1     f100070f1000fc40  8410400 - - -

-          -           -     1306695  S       0      82      1     f100070f10013f40  8410400 - - -

-          -           -     7196871  S       0      82      1     f100070f1006dd40 8410400 - - -

…………………(생략)

-          -           -     7258227  S      84     102     1     f100070f1006ec40 8410410 - - -

-          -           -     7278771  S       0      60      1         -                   2400400 - - -

…………………(생략)


Thread Dump와 맵핑 정보를 확인 하는 방법입니다.

JDK 1.4 이하에서는 다음과 같이 확인이 가능합니다. dbx를 이용해서 Process에 attach할 경우 process가 STOP상태에 놓이게 된다.

Step 1. dbx 명령어를 통해 Process 접속

$dbx –a <pid>


Step 2. ps –mp 명령어로 확인한 TID에 해당하는 Thread 번호(7258227) 를 확인 ($t<NUM>형식)

(dbx) thread

(dbx) thread

thread     state-k     wchan                       state-u       k-tid         mode      held     scope     function

$t6         wait         0xf100070f10095040     blocked     9765093     k             no      sys

$t7         wait         0xf100070f10073240     blocked     7258227     k             no      sys

$t8         wait         0xf100070f1004f340      blocked     5189765     k             no      sys

…… 

 

Step 3. 결과정보중 pthread_t 항목의 값과 Thread Dump naitiveID 가 일치하는지 확인

(dbx)th info 7

(dbx) th info 7

thread state-k wchan state-u k-tid mode held scope function

$t7 wait 0xf100070f10073240 blocked 7545059 k no sys

general:

pthread addr = 0x0000000111047a78 size = 0x488

vp addr = 0x000000011104a928 size = 0x330

thread errno = 0

start pc = 0x9001000a0ccbde8

joinable = yes

pthread_t = 607

scheduler:

……..(생략)


Step 4. dbx를 수행 중에는 JVM이 멈춰있기 때문에 detach 명령어를 반드시 수행해야 한다.

(dbx)detach

주의할 점으로 detach를 사용하지 않고 Process에 연결된 상태로 종료하면 dbx는 해당 Process를 종료시킨다.


Step 5. javacore파일에서 native ID값과 이전단계에서 구한 pthread_t값이 일치하는 Thread가 CPU사용을 점유하고 있는 Thread 이다.

"webtob1-hth0(203.253.232.181:9900)-w06 …, state:R, prio=5

(native ID:0x067, native priority:0x5, native policy:UNKNOWN)

Java callstack:

at java/net/SocketInputStream.socketRead0(Native Method)

at java/net/SocketInputStream.read(SocketInputStream.java:141(Compiled Code))

at oracle/net/ns/Packet.receive(Bytecode PC:31(Compiled Code))

at oracle/net/ns/DataPacket.receive(Bytecode PC:1(Compiled Code))

………(중략)

at oracle/jdbc/driver/T4CPreparedStatement.doOall8(T4CPreparedStatement.java:219(Compiled Code))

at oracle/jdbc/driver/T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:970(..

at oracle/jdbc/driver/OracleStatement.executeMaybeDescribe(OracleStatement.java:1072(..))

at oracle/jdbc/driver/T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:854(.

at oracle/jdbc/driver/OracleStatement.doExecuteWithTimeout(OracleStatement.java:1154(..)


JDK 1.5 이상에서는 다음과 같이 확인이 가능합니다.

ps –mp <pid> -o THREAD를 통해 확인한 값인 7258227를 16진수로 변환한 값 6EC073 를javacore에서 native thread ID 값과 일치하는 Thread가 CPU를 점유하고 있는 Thread 이다.

"webtob1-hth0(203.253.232.181:9900)-w06 …, state:R, prio=5

(native thread ID:0x6EC073, native priority:0x5, native policy:UNKNOWN)

Java callstack:

at java/net/SocketInputStream.socketRead0(Native Method)

at java/net/SocketInputStream.read(SocketInputStream.java:141(Compiled Code))

at oracle/net/ns/Packet.receive(Bytecode PC:31(Compiled Code))

at oracle/net/ns/DataPacket.receive(Bytecode PC:1(Compiled Code))

………(중략)

at oracle/jdbc/driver/T4CPreparedStatement.doOall8(T4CPreparedStatement.java:219(Compiled Code))

at oracle/jdbc/driver/T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:970(..

at oracle/jdbc/driver/OracleStatement.executeMaybeDescribe(OracleStatement.java:1072(..))

at oracle/jdbc/driver/T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:854(.

at oracle/jdbc/driver/OracleStatement.doExecuteWithTimeout(OracleStatement.java:1154(..)


다음으로 HP-UX에 대해 알아보겠습니다.
CPU를 점유중인 Thread를 찾기 위해 아래와 같은 명령어를 사용합니다.

$ glance

Step 1. $glance


 Step 2. glance Command 창에서 s를 누른 후 CPU를 점유중인 pid를 입력


Step 3. Process 정보창에서G(shift+g) : Thread 별로 CPU 사용량 확인가능(space로 화면 전환)

Thread 정보의 TID와 Thread Dump의 lwpid와 맵핑해서 확인 할 수 있다.


Thread Dump와 맵핑 정보를 확인합니다.

Glance의 G창에서 CPU 점유중인 TID값을 Thread Dump의 lwp_id 값과 비교해 확인합니다.


다음으로 SunOS(Solaris)입니다.
CPU를 점유중인 Thread를 찾기 위해 아래와 같은 명령어를 사용합니다.

$prstst –L –p <pid> 

$pstack <pid>

$prstst –L –p <pid>

명령어를 통해 CPU를 많이 사용하는 LWPID를 확인한다.

PID USERNAME SIZE RSS STATE PRI NICE TIME CPU

PROCESS/LWPID

10942 ryan 179M 56M sleep 59 0 0:00:02 1.2% java/2

10942 ryan 179M 56M sleep 59 0 0:00:00 0.3% java/10

10942 ryan 179M 56M sleep 59 0 0:00:00 0.2% java/9

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/1

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/12

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/26

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/25

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/24

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/23

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/22

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/21

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/20

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/19

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/18

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/17

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/16

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/15

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/14

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/13

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/11

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/8

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/7

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/6

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/5

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/4

10942 ryan 179M 56M sleep 59 0 0:00:00 0.0% java/3


$pstack <pid>

LWPID값을 통해 Thread 번호를 확인 할 수 있다.

----------------- lwp# 2 / thread# 2 --------------------

ff2c6acc lwp_cond_wait (31f48, 31f30, 0, 0)

feafd448 __1cCosNPlatformEventEpark6M_v_ (31f30, 0, fed01a27, b0400, 31f00, fedff138) + 100

feb98b38 __1cNObjectMonitorEwait6MxbpnGThread__v_ (ea170, 3a000, 1, 0, 31000, 31000) + 3d4

fe5dd4a0 __1cSObjectSynchronizerEwait6FnGHandle_xpnGThread__v_ (fe37ef54, 31000, 2f47d, 319c4,

fedb2000, 319c4)

fe5dd0b0 JVM_MonitorWait (0, 319c4, 31000, 3f074, 1, fedb2000) + 2bc


Thread Dump와 맵핑 정보를 확인합니다.

Thread 번호를 16진수로 변환해 nid 값과 일치하는 Thread 정보를 확인 할 수 있다.

"jeus.server.JeusServer" prio=3 tid=0x00031000 nid=0x2 in Object.wait() [0xfe37e000]

java.lang.Thread.State: WAITING (on object monitor)

at java.lang.Object.wait(Native Method)

- waiting on <0xe6bb1398> (a java.lang.Object)

at java.lang.Object.wait(Object.java:485)

at jeus.server.JeusServer.start(JeusServer.java:414)

- locked <0xe6bb1398> (a java.lang.Object)

at jeus.server.JeusServer.main(JeusServer.java:2710)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at jeus.server.JeusBootstrapper.main(JeusBootstrapper.java:140)


마지막으로 Linux를 살펴보겠습니다.
CPU를 점유중인 Thread를 찾기 위해 아래와 같은 명령어를 사용합니다.
$top –H 

top 명령어로 CPU를 점유중인 Thread 정보를 확인한다.

여기서 pid는 Thread ID 이다.

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

21092 hwyoon 20 0 2772m 205m 14m R 46.3 1.3 0:02.26 java

21091 hwyoon 20 0 2772m 205m 14m R 45.0 1.3 0:02.75 java

21127 hwyoon 20 0 2772m 205m 14m R 23.1 1.3 0:00.70 java

15838 hwyoon 20 0 2774m 359m 15m S 3.3 2.2 0:07.19 java

21083 hwyoon 20 0 2772m 205m 14m S 2.0 1.3 0:00.06 java

21085 hwyoon 20 0 2772m 205m 14m S 2.0 1.3 0:00.06 java

21086 hwyoon 20 0 2772m 205m 14m S 1.7 1.3 0:00.05 java

21084 hwyoon 20 0 2772m 205m 14m S 1.3 1.3 0:00.04 java

15936 hwyoon 20 0 2774m 359m 15m S 0.3 2.2 0:00.16 java

15941 hwyoon 20 0 2774m 359m 15m S 0.3 2.2 0:00.15 java

16798 jgkim 20 0 2920m 447m 97m S 0.3 2.8 0:02.37 java

20991 hwyoon 20 0 15528 1628 868 R 0.3 0.0 0:05.57 top

21102 hwyoon 20 0 2772m 205m 14m S 0.3 1.3 0:00.01 java ………….(생략)


Thread Dump와 맵핑 정보를 확인합니다.

Pid 값을 16진수로 변환해 nid값과 일치하는 값을 확인 할 수 있다.

21092를 16진수로 변환하면 5264가 되고 해당 값은 Thread Dump의 nid값과 맵핑하면 CPU를 점유중인 Thread를 확인 할 수 있다.

"C2 CompilerThread1" daemon prio=10 tid=0x00007fb8780a8800 nid=0x5264 waiting on condition

[0x00000000000000]

java.lang.Thread.State: RUNNABLE



OS의 CPU 과다 사용은 매우 심각한 문제입니다. 다만 OS System 자체에서 발생하는 이슈보다 솔루션에서 파생되거나 Client로부터 파생되는 경우가 더욱 빈번하다 할 수 있습니다. 이러한 문제는 조그마한 관심으로부터 손쉽게 해결을 할 수도 있습니다. 명령어에 대한 숙지를 바탕으로 문제 발생 시 보다 신속하게 대처할 수 있도록 해야 할 것입니다.

고맙습니다.

728x90
반응형

'⑥ 네트워크, 운영체제 > ⓞ OS' 카테고리의 다른 글

[CPU 과점유] SunOS 편  (0) 2018.07.19
[CPU 과점유] LINUX 편  (0) 2018.07.19
[ETC] OS별 TCP Trace Dump 기록 방법  (0) 2018.06.18
[ETC] OS Hostname Resolution  (0) 2018.06.08
[ETC] RAID Level  (0) 2018.03.25