线上CPU告警问题排查
排查步骤
1、 收到告警信息,提示 Full GC耗时长,FullGC次数频繁,FullGC后Heap使用率异常超过了95%.
2、 登录grafana,查看系统监控指标,发现一台机器CPU使用率指标突然升高。
3、 联系运维同事,查看具体哪个线程占用CPU高。查看占用CPU高的线程命令
1 | top –Hp 进程号 |
4、保存jstack 信息到jstack.log文件,通过jstack文件确认占用CPU的是GC线程
1 | jstack -l 进程号 > jstack.log |
5、jmap命令查看java进程对象的分布情况,快速定位大对象的分布情况
1 | 前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),看是否有粘滞线程,如果有大概有就是这些粘滞线程导致的。
线上CPU告警问题排查