查找解决Java进程何处导致服务器CPU负载很高之方法

最近在处理分布式环境(单台机器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负载过高的原因所在,至于是其他的情况就得具体情况具体分析了。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值