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

linux 环境下,使用top -c 命令,查看服务器上各进程的CPU使用情况。
b + x,然后就能把所关注的列和运行的行给高亮了。如我第一张截图。在记下CPU占用率高的pid之后,按键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

Java 现场排查CPU飙升占用过高的方法_第1张图片

Java 现场排查CPU飙升占用过高的方法_第2张图片

Java 现场排查CPU飙升占用过高的方法_第3张图片

本来想以es进程为例,看看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打印信息

Java 现场排查CPU飙升占用过高的方法_第4张图片

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

你可能感兴趣的:(jvm,linux,java,多线程,cpu,jvm)