配置maxHttpHeadSize导致的线上oom事件

1. 事件过程

服务上线后,出现系统高峰期宕机,内存溢出导致服务全部宕机,增加服务集群数量和服务内存大小没有改善。

2. 影响

营销服务宕机,导致的营销活动全部失效,用户下单失败,导致大批量访问错误和问题单。

3. 过程分析

3.1.重现故障现场

spring-aop记录controller接口访问次数,大致的统计高频访问的接口,通过jmeter模拟并发访问高频接口重现事故现场。

3.2.内存泄漏分析
  • 增加服务启动参数,利用mat软件分析dump文件,定位内存泄漏原因。

具体步骤:
1>. 增加启动参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath =
/opt/logs/heap.hprof,内存不足时,保存dump文件(hprof文件);
2>. 增加启动参数: -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:/opt/logs/gc.log,保存详细的gc日志;
3>. 利用MemoryAnalyzer软件(MAT)分析OOM时记录的dump文件进行分析。

  • GC日志:分析发现压测到来以后,full gc无法回收老年代对象,导致young gc也无法回收新生代对象,确定发生内存泄漏。

图片 1.png

  • MAT分析:大对象实例分析,发现每次请求接口都占用100m内存,其中空逻辑接口(接口废弃,没有实际处理逻辑)也占用100m内存,由此怀疑,是由于框架或配置问题导致的内存泄漏。

图片 1(1).png

图片 3.png

搜索查询类似案例,有相当多的类似情况,推测由于server.maxHttpHeadSize=99 999 999配置,导致每个请求,都会申请一片100m的堆内存空间,导致请求一上来就内存泄漏。

3.3.解决办法

1> 并发访问一个空逻辑的测试接口,发生内存泄漏;
2> 删除server.maxHttpHeadSize=99 999 999配置,并逐渐加大并发量,观察内存占用情况。
通过测试环境模拟,并发量大于1000以后,虽然qps较低,但是未发生内存溢出问题,由此确定问题解决。

参考文章:

微信图片_20210702163318.jpg

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享