CPU异常排查思路

CPU异常通常有如下几个原因:

  • 业务逻辑问题(死循环)
  • 频繁GC
  • 上下文切换较多

其中, 业务逻辑问题可以使用jstack来分析对应的堆栈情况。

一、使用jstack来分析cpu问题的步骤

1. 使用top命令,查看CPU占用较高的服务进程

通过top命令,最前面一列是对应的进程pid

2. 使用top -H -p pid找到进程中占用cpu较高的线程

3. 将占用最高的pid转换为16进制的nid

printf '%x\n' pid

4. 在jstack中找到堆栈信息

jstack pid | grep 'nid' -C5 -color

此时必然可以看到对应的nid的堆栈信息。剩下的只要仔细分析即可。

分析的时候,需要重点关注WAITTINGTIMED_WAITING的部分,BLOCKED就不用说了。

可以使用命令cat jstack.log | grep "java.lang.Thread.State" | sort -nr | uniq -c来对jstack状态做一个整体的把握,如果WAITING之类的特别多,多半是有问题的。

二、使用jstat分析GC情况

jstat -gc pid 1000
该命令可以实现对GC分代情况进行观察,1000表示采样间隔(ms),S0C/S1C、S0U/S1U、EC/EU、OC/OU、MC/MU分别表示两个Survivor区,Eden区、老年代、元数据区的容量和使用量。

YGC/YGT、FGC/FGCT、GCT 则代表YoungGC、FullGC的耗时和次数,以及总耗时。

如果看到gc比较频繁,再针对gc方面做进一步分析。

三、 使用vmstat分析上下文切换

针对频繁的上下文切换问题,我们可以使用vmstat命令来进行查看。



其中,cs(context switch)一列则代表上下文切换的次数。

扩展
如果要对特定的pid进行监控,可以使用pidstat -w pid命令,cswch和nvcswch表示自愿以及非自愿切换。

你可能感兴趣的:(CPU异常排查思路)