记一次应用服务器cpu 99%的排查经历(完整排查过程)

问题背景:12月20日收到某应用服务器cpu使用率报警(99%),于是开始排查原因。

操作步骤如下:

1.首先 使用top命令查找出占用cpu占用率比较高的进程

记一次应用服务器cpu 99%的排查经历(完整排查过程)_第1张图片

2.使用  top -Hp pid 命令找出此进程下线程占用cpu情况

记一次应用服务器cpu 99%的排查经历(完整排查过程)_第2张图片

注:很平均,并没有发现占用率很高的线程。

3.使用 jstack -F 319843 命令查看线程的堆栈信息

记一次应用服务器cpu 99%的排查经历(完整排查过程)_第3张图片

 发现好多blocked线程

4.使用命令 jstat -gcutil 319843 查询jvm各个内存区域情况和gc情况

由上图看出eden区100%,survivor区0%,年老代 99.99%, 说明有大对象,导致fullgc频繁,并且回收不掉。导致cpu 99%

5.使用命令jmap -histo 319843 查看类对象占用堆内存信息

记一次应用服务器cpu 99%的排查经历(完整排查过程)_第4张图片

找到大对象信息

6.虽然已经定位到出问题的业务,但是为什么会产生大对象呢?

根据日志查询这个业务点,发现由于入参为0,导致查询数据库没有带这个条件,将1000w的数据全部放入内存中

问题解决终于解决了,1分钟改代码,上线解决

总结:个人感觉导致cpu使用率飙高的原因无非2中(如有错误或者遗漏请指正)

1.出现了耗cpu的操作,例如excel的导入和导出,这种情况 找到对应线程即可解决问题

2.各个线程占用cpu比较均衡,这个时候就要考虑是不是频繁gc导致cpu飙高

你可能感兴趣的:(记一次应用服务器cpu 99%的排查经历(完整排查过程))