一、外在表现
有时java应用的load很高,影响系统稳定性,这时候就要进行问题排查,找出影响系统稳定性的因素。如果是进程级的应用,如Nginx、Apache等都还比较容易排查,但如果是JVM中的某个线程导致的,估计有人就要开始抓瞎了。
二、排查过程
1.ps -ef | grep java | grep -v grep
找出Java进程ID,得到进程ID为21711
2.top -Hp 21711
找出该进程内最耗费CPU的线程,TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为21742的线程,用printf "%x\n" 21742,得到21742的十六进制值为54ee,下面会用到。
3.jstack 21711 | grep 54ee
它用来输出进程21711的堆栈信息,然后根据线程ID的十六进制值grep。有时这一步并不能从整体上查看性能消耗在哪, 要用jstack 21711 > jstack.txt查看整体情况。
三、站在巨人的肩膀
网上有牛人写了一个脚本能自动帮我们大致定位到现场导致LOAD飙升的JVM线程,脚本大概如下
#!/bin/ksh
# write by : oldmanpushcart@gmail.com
# date : 2014-01-16
# version : 0.07
typeset top=${1:-10}
typeset pid=${2:-$(pgrep -u $USER java)}
typeset tmp_file=/tmp/java_${pid}