编程知识 cdmana.com

Java 现场排查CPU飙升占用过高的方法

linux 环境下,使用top -c 命令,查看服务器上各进程的CPU使用情况。
b + x,然后就能把所关注的行和运行的列给高亮了。如我第一张截图。然后q退出top命令,
然后再top -Hp pid,我这就是  top -Hp 426476 查看单个进程里面是哪些线程在实际消耗CPU。
选择占比较大的几个线程id,使用命令 printf "%x\n" 54956  把进程id给转成16进制
使用jstack命令查看栈信息,具体:jstack 53514 | grep '0xd6ac' -A10 -A10 就是过滤到关键词之后(A:after)10行信息,不够可以自己再加。
最后分析,看看有没有熟悉的单词,推断都是什么逻辑在实际运行,抢占CPU

想看看es进程里面这个线程在干吗呢,还不让看,执行失败了。
再换个自己开发的程序来测试吧。同样操作,先ps一下,找到进程id,直接top -Hp 想看的进程id,然后在里面挑一个线程id,执行命令
printf "%x\n" 54956   (将 PID 转为 16进制)
jstack 53514 | grep '0xd6ac' -A10 (注意:16进制要在最前面添加0x)
jstack 后面跟进程id,然后grep的时候,带上16进制的线程id,然后看n行,然后分析stack打印信息

这地方看到线程池的名称,结合自己代码,应该是程序在消费kafka数据呢。
另外,也可以将堆栈信息打印下来:jstack 53514 > cpuInfo.txt
然后使用 cat 或者 less 等命令工具进行过滤查看:cat -n cpuInfo.txt | grep -A10 '0xd6ac'

版权声明
本文为[请叫我大师兄__]所创,转载请带上原文链接,感谢
https://lixuekai.blog.csdn.net/article/details/115954562

Scroll to Top