记一次生产CPU飙升定位问题

1,852 阅读2分钟

1、17:20分左右收到运维反馈系统登录异常,登录系统,发现该错误提示信息。

2、检查钉钉告警信息,没有收到任何告警信息,初步认为服务器负载正常。
3、查看APM监控,发现大量慢接口

4、查看后台日志,发现一些redis连接超时错误信息如下:

登录阿里云redis控制台,没有发现慢日志:

5、查看服务器负载情况,发现服务器100正常,服务器101 CPU负载过高,首先使用top命令发现cpu过高的进程。 使用top –Hbp 18883查看问题线程,发现都是GC线程导致CPU负载过高。初步判断应用使用内存过多频繁full gc导致。

6、使用jmap -dump、jstack生成内存快照和线程快照,立刻重启服务,问题解决。

1、 分析内存快照和线程快照,发现可疑信息如下:

2、 继续分析可疑内存,找出对应线程:

3、 结合出现问题的时间点查找日志和数据,基本定位是由于有个服务中心选择了2年的账期生成缴费通知单(项目数据量较大,统计了下大概有20W的账订单数据量)

PS:由于各种安全限制,线上环境下载数据非常麻烦(特别大文件)

产品: 根据业务需求,创建催缴任务调整如下: 1、限制数据量:创建任务后 数据量超过5万,就把任务失败掉 2、没有选择客户或房产的全选任务,时间限制为一年

开发: 1、 修改代码避免一次把所有数据加载到内存,使用分页或SQL流式查询避免数据量太大导致OOM