CPU 高负载排查实践
作者:crossoverJie
segmentfault.com/a/1190000019507028
1、首先利用 top -c 将系统资源使用情况实时显示出来 (-c 参数可以完整显示命令)。获得Java应用 pid
接着输入大写 P 将应用按照 CPU 使用率排序,第一个就是使用率最高的程序。
常规操作第二步自然是得知道这个应用中最耗 CPU 的线程到底再干嘛。
2、利用 top -Hp pid 然后输入 P 依然可以按照 CPU 使用率将线程排序。**** pid 是第一步获得的,获得3步所需pid****
3、这时我们只需要记住线程的 ID 将其转换为 16 进制存储起来,通过 jstack pid >pid.log 生成日志文件,利用刚才保存的 16 进制进程 ID 去这个线程快照中搜索即可知道消耗 CPU 的线程在干啥了。4856
如果你嫌麻烦,我也强烈推荐阿里开源的问题定位神器 arthas 来定位问题。
比如上述操作便可精简为一个命令 thread -n 3 即可将最忙碌的三个线程快照打印出来,非常高效。
最忙绿的线程是一个 GC 线程,也就意味着它在忙着做垃圾回收。
排查到这里,有经验的老司机一定会想到:多半是应用内存使用有问题导致的。
于是我通过 jstat -gcutil pid 200 50 将内存使用、gc 回收状况打印出来(每隔 200ms 打印 50次)。
既然是初步定位是内存问题,所以还是得拿一份内存快照分析才能最终定位到问题。
MAT 这个工具,他还能帮你预测出这个内存快照可能出现问题地方同时给出线程快照。