1.查看监控
CPU飙高:集群表现,监控中,集群50%以上的机器CPU使用率超过60%
查看监控,可以看到哪些机器CPU飙高
2.止血
- 如果有降级开关,则打开降级开关
- 看监控QPS top3-top5的接口,进行限流,降50%。【防止流量持续增长,留给研发解决问题的时间】
- 观察系统情况
3.排查工具使用
方法1:top + printf + jstack结合使用
- 查看占用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,可以快速定位到问题代码。
标签:查看,SOP,jstack,ID,飙高,线程,arthas,CPU From: https://www.cnblogs.com/phenixlife/p/17514931.html