线上CPU告警问题排查

排查步骤

1、 收到告警信息,提示 Full GC耗时长,FullGC次数频繁,FullGC后Heap使用率异常超过了95%.

2、 登录grafana,查看系统监控指标,发现一台机器CPU使用率指标突然升高。

3、 联系运维同事,查看具体哪个线程占用CPU高。查看占用CPU高的线程命令

1
2
3
top –Hp 进程号
# 把线程号转为16进制
printf "%x\n" 线程号

4、保存jstack 信息到jstack.log文件,通过jstack文件确认占用CPU的是GC线程

1
jstack -l 进程号 > jstack.log

5、jmap命令查看java进程对象的分布情况,快速定位大对象的分布情况

1
2
#前30个大对象
jmap -histo:live 进程pid | head -n 30

通过histo查看的的对象实例情况,发现大量的poi.xssf包下的相关对象,基本确定是使用poi操作Excel导入导出功能产生大对象,导致一直FullGC。

6、保留gc日志,jstack和dump文件,重启应用恢复服务。

7、用MAT分析dump文件,确定是一个报表导出功能导致的。查询的报表数据量大且没有做分页处理,导出报表请求响应时间很长,用户在请求没有响应的情况下提交多次导出报表请求,最终导致生成了大量的对象占满了堆空间,但因为这些对象都不能回收,所以GC线程一直进行FullGC试图释放空间,最终的表象就是CPU使用率飙升。

改进措施

1、针对导出功能,从业务上针对系统上所有导出功能进行梳理,评审相关代码;导出方案上,大数据量的情况下,分页查库和分sheet页写数据,同时考虑管理系统上所有的导出请求,把导出数据的请求放到一个队列中,排队依次处理导出请求,控制整个系统导出的数据量。

2、针对排查步骤,在通过 jmap -histo 命令基本确定是Excel导入导出相关功能产生大对象的情况下,可以直接在jstack文件或者日志文件中搜索 STUCK 关键字(针对weblogic),看是否有粘滞线程,如果有大概有就是这些粘滞线程导致的。

作者

csc101

发布于

2022-03-04

更新于

2022-03-05

许可协议