随笔-在linux通过top命令查找问题线程的nid

最近比较忙,就简单写个随笔吧。

简述

对于cpu爆满问题,常常会分析是否存在问题线程,本文记录一种通过top快速找到问题线程nid的方式。

找到问题进程PID

通过top找到问题进程,例如下面有个进程CPU占用率高达99%,他的PID=270973

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 270973 worker    20   0 7166968 1.537g   3684 S   99.0 50.5  86501:25 java
1285003 root      20   0 14.107g 4.651g   5664 S   0  0.4 762:10.25 java
2805995 root      20   0  9.829g 2.587g   4604 S   0  0.1   3061:22 java

找到问题线程PID

通过top -p 270973 -H查找问题线程。
其中-p 270973表示查找指定进程270973的信息,-H表示线程模式。

    PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
2447223 root      20   0 3819540 1.319g   5960 S  80.3 42.1 121:25.99 ydbot-client
2447225 root      20   0 3819540 1.319g   5960 S  0.3  2.1  27:41.90 ydbot-client
2447230 root      20   0 3819540 1.319g   5960 S  0.3  2.1  27:57.98 ydbot-client

经对比,发现问题线程的PID=2447223

将线程PID转换为nid

线程的nid是十六进制的,在linux系统中,通过shell命令printfPID进行转换:

$ printf 0x%x 2447223
0x255777

其中0x%x0x是固定字符串,%x是printf的十六进制的转换类型。

后续分析

后续通过jstack等工具进行分析,例如:

[root@103-17-208-lg-201-k08 services]# jstack -l 11 |grep 0x255777
2019-09-10 16:18:51
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.73-b02 mixed mode):

"Attach Listener" #18769 daemon prio=9 os_prio=0 tid=0x00007f64dc0d4000 nid=0x255777 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"Keep-Alive-Timer" #18768 daemon prio=8 os_prio=0 tid=0x00007f64c83b8000 nid=0x255777 waiting on condition [0x00007f63ec6e7000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
	at java.lang.Thread.sleep(Native Method)
	at sun.net.www.http.KeepAliveCache.run(KeepAliveCache.java:172)
	at java.lang.Thread.run(Thread.java:745)

其他分析不再赘述。

你可能感兴趣的:(JVM)