1.查看监控

CPU飙高:集群表现,监控中,集群50%以上的机器CPU使用率超过60%
查看监控,可以看到哪些机器CPU飙高

2.止血

  • 如果有降级开关,则打开降级开关
  • 看监控QPS top3-top5的接口,进行限流,降50%。【防止流量持续增长,留给研发解决问题的时间】
  • 观察系统情况

3.排查工具使用

方法1:top + printf + jstack结合使用

  1. 查看占用cpu最高的进程
top

2.查看某个进程下占用CPU最高的线程

top -Hp <进程PID>

3.查看进程所有线程的快照信息

jstack [进程ID]

# 输出到文件1.log
jstack [进程ID] > 1.log

# 找到16进制的线程ID表示
printf '%x\n'  [线程ID]

jstack [进程ID] | grep '0x[16进制表示]' 

方法2:使用arthas查看堆栈

方法1中, top + printf + jstack的方式太繁琐,可以直接使用arthas的thread命令来定位。

# 启动arthas
java -jar arthas-boot.jar
# 查看占用CPU前3个线程快照。一般多执行几次,查看线程在干什么
thread -n 3
# 使用完之后,记得停止arthas
stop

方法3:火焰图

上述的两种方式都是查看CPU堆栈快照,查看某个瞬间最消耗CPU的线程是哪个。如果运气好,可能在查看的瞬间,可以看到最消耗CPU的线程。但是,有一些特殊的情况是,某个线程一直在以某个很小的速度在消耗CPU,所以,通过上述两种方式都是看不出来的。幸运的是,火焰图可以进行一段时间内的采样,从而克服上面的问题。
使用arthas可以方便的生成火焰图。

# 启动arthas
java -jar arthas-boot.jar

# 开始。默认为cpu火焰图,也可以获取内存分配、锁的火焰图
profiler start

# 查看状态
profiler status

# 停止采样。此时,会在控制台打印出html文件的输出路径
profiler stop

# 使用完之后,记得停止arthas
stop

下载文件到本地,使用浏览器打开。如下图

CPU消耗的占比与颜色无关,只是与X轴的占用宽度有关系。宽度越宽,代表该方法消耗的时间占比越多。
从下往上看,是方法调用栈。下层是调用方,上层是被调用方。


从上图分析,可以定位到消耗CPU宽度最宽的代码。

一般,使用方法2,可以快速定位到问题代码。