最近在处理分布式环境(单台机器10个节点)中由于Java进程CPU负载过高导致其中某个节点挂点,而且不一定是哪一台的机器,刚开始还以为是某个很耗内存CPU的查询导致,但是看日志也没有看到有什么耗内存的查询,于是想了一下,最后通过jstack命令去查看具体是那个过程可能会导致CPU负载很高,后来通过此命令果然看到有一个索引不断的写入,而且栈中一直有此索引的信息,于是就找到些此索引的同事,果然,他通过mr开启很多个任务写入,而且一条数据的量很大,这样很容易就会把服务弄挂掉了,后来就把任务降低或者取消去往另外一个集群中写入,CPU负载马上就下来了,jstack具体查找过程如下:
1.首先找到占用CPU最高的JAVA进程ID:
tid=$(top -H -n 1 | grep java | awk '{print $2}' |head -n1)
2.将进程ID转化为16进制:
(1)tidhex=$(echo "obase=16;ibase=10;$tid" |bc|tr "[A-Z]" "[a-z]")
(2)printf "%x\n" $tid
3.使用ps命令找到某个任务的所有进程id,循环使用jstack命令打印堆栈,并且通过grep命令在打印堆栈中找到第二步转化的16进制数据:
ps -ef | grep XXX | grep -v grep |awk '{print $2}' |while read line ; do echo $line;jstack $line | grep $tidhex; done
通过以上几步基本上可以定位到CPU负载过高的原因所在,至于是其他的情况就得具体情况具体分析了。。