作者:宋雨甄_938 | 来源:互联网 | 2023-10-10 10:55
问题现象:
最近几天线上总是间歇性的报警——cpu使用率过高,而且cpu使用率都是整点飙升的。
排查方法一
步骤一:查询当前占用cpu最高的进程
top命令
经过几秒钟的观察,发现java进程耗用cpu过多,对应的进程id:64567
步骤二:查询进程id:64567内,耗费cpu最多的线程
top -p 进程id -H
-p :指定某些个 PID 来进行观察监测而已。
-H :线程模式
如图,占用cpu最大的线程对应的线程id是:92668
步骤三:将线程id转为十六进制
printf ‘%x \n' 92668
步骤四:找到对应线程的堆栈
jstack 进程id | grep 线程id(十六进制) -C 50
方法一的缺点:如果一个机器的cpu使用率飙升,通过上面方式排查比较麻烦,对于步骤二如果top之后发现有多个线程的cpu占有率比较高,并且cpu只是短暂的飙升,那么这个方法耗时比较久。可能找到所有的线程之后打出堆栈,cpu使用率飙升现场已经没有了。所以才给出了方法二进行排查,方法比较简单。
排查方法二
安装arthas:curl -L http://start.alibaba-inc.com/install.sh | sh
通过使用arthas对应的命令thread -n 找到cpu使用率top n的线程,并且打印出堆栈。通过arthas,我们可以使用一个命令就完成上面四个步骤的工作,比较简单方便
结论
通过排查发现导致cpu利用率飙升的原因,主要有两点处理耗cpu:1、稽核任务对近一年的合同(抽取的合同)频繁的查询数据库里面的promotion、property、contract_vip_record表做查询;2、对数据库做操作的异步日志记录;