事件时间及地点
2022年03月03日 周四 北京 京东总部4号楼
事件现象描述
- 线上系统 某一台机器 的许多接口 发生报警,提示响应时间较长,也就是系统响应慢;
- 线上一共12台机器,并不是固定的一台服务器报警;
- 每隔2个小时左右就会发生一次此现象;
- 查看对应机器的线上监控,发现CPU很高,并且发生了频繁的FullGC;
问题排查过程
- 用web页面操作服务器,发生问题的机器生成heap dump堆转储文件;
- 将文件下载到本地以后用java的jdk下的bin目录中的jvisualvm打开堆转储文件;
- 对文件进行分析,发现是生成Excel的时候,数据内容过多导致的此问题;
- 有个功能是es记录接口调用失败记录,并将数据每天2次邮件发送Excel,由于近2天接口调用量从500万/日激增到5000万/日,这就导致接口失败数据量增加到1000万(这个接口数据查询不到的情况很多,业务层面问题),因此在生成Excel的时候,和Excel相关的中间对象过多,导致内存大量占用引起的问题。
问题解决方案
关于解决方案,仅仅是把功能停掉了,因为这种能没有人使用,不过如果真的是需要从技术层面解决这个问题的话,必须要在一个Excel中生成无限多的数据,那就只能尝试将Excel存到本地磁盘,而不是内存中,以文件追加的方式向Excel中写入内容,不过这只是我的一个想法,还并没有去了解如何实现;