當發(fā)現(xiàn)某個服務器的cpu使用率居高不下并徘,這時就需要抓住誰是“真兇”。本文提供一種可以揭開真相的方法毙驯。
- 通過
ps
命令顯示每個進程中線程的cpu使用率
>ps -Leo pid,lwp,user,comm,pcpu
PID LWP USER COMMAND %CPU
1 1 root systemd 0.5
2 2 root kthreadd 0.0
3 3 root ksoftirqd/0 0.0
5 5 root kworker/0:0H 0.0
......
- 找到所有java進程竟坛,并按照第5列降序輸出
>ps -Leo pid,lwp,user,comm,pcpu|awk '$4=="java"{print $0}'|sort -k5 -r -n|head --lines 3
7114 7199 ocdp java 0.4
28178 28205 root java 0.4
2046 2355 ocdp java 0.3
- 這樣就找到了cpu使用率最高的進程是7114中的線程7199,將線程id轉(zhuǎn)為16進制
printf %x 7199
結(jié)果為1c1f
- 通過
jstack 7114 > ~/7114.tmp
將進程的堆棧信息輸出到臨時文件中 - 在臨時文件中查找
1c1f
框冀,會找到這個線程當前的狀態(tài)流椒,從而可以定位當相應的代碼
"sparkDriverActorSystem-scheduler-1" #41 daemon prio=5 os_prio=0 tid=0x00007f649d661000 nid=0x1c1f waiting on condition [0x00007f646bbfc000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at akka.actor.LightArrayRevolverScheduler.waitNanos(Scheduler.scala:226)
at akka.actor.LightArrayRevolverScheduler$$anon$8.nextTick(Scheduler.scala:405)
at akka.actor.LightArrayRevolverScheduler$$anon$8.run(Scheduler.scala:375)
at java.lang.Thread.run(Thread.java:745)
總結(jié)
本文介紹了一種結(jié)合ps
和jstack
命令查找最消耗cpu的java線程并定位到相應代碼的方法。