1. 场景问题
- 群里出现FULLGC次数和时间的告警通知,应该是xxxx业务升级,保存产品触发了权限相关数据的重置导致的,主要是产品下项目比较多、菜单和操作权限比较多的情况下更新、保存时比较容易出现这个问题,当时线上停车项目有3000+,每个项目有200左右操作和菜单权限,看日志猜测是产品管理-修改产品时全量处理产品及项目菜单权限触发的,通过运维那边给的FGC,CPU,内存监控图,排查出线上平均 6s 多完成一次 FGC(30s/5=6s) 【 CPU占用率高,可用内存也比较低】
环境: JDK8+CMS垃圾回收器
jmap命令查看堆内存中的对象大小信息 jmap -histo pid | head -n 20
2. 问题复现,排查过程, 解决方案(重写代码,优化)
-
当我们创建一个产品的时候,并且在产品下添加3000+个项目,然后更新产品时菜单管理选项菜单可以全选。然后看在更新时是否对整个user服务及服务器有什么影响。(如果创建数据3000多项目数据有麻烦,可以把启动服务的时候把内存调小一点)
-
现在是跟咱们之前复现的jvm参数一样的时候【参数就改成 ****-Xms256M -Xmx512M -Xmn50M 】,用master分支还是会FGC,每次1.2s左右。参数调大后没复现。数据量现在应该跟生产是查差不多的。换我优化后的opt_user分支,我们复现之前的参数,也没有发生过FULLGC了。
-
dump拉取对象文件,MAT分析文件 查找可疑对象
-
(old)之前有问题的逻辑是,不管菜单有没有新增,更新,删除,先删除之前的 , 再重新保存一遍。然后开启一个线程全量处理所有项目及角色的菜单权限。
-
(new)现在是判断菜单、更新的更新、删除的删除、新增的新增、无变化的不操作库, 异步处理项目及角色菜单权限,使用线程池每10个项目一个线程来处理 。并且是判断有删除租户菜单的时候才处理项目菜单。
-
产品保存时全量更新项目权限数据优化-代码逻辑上看是处理了项目的菜单权限,但未处理成功(新增、减少),处理方案:处理菜单权限前先按租户及运营平台分别对比与历史数据有无变化,有变化则处理,无变化不处理。处理时按项目做异步处理。
3. JVM参数配置
线上JVM参数调整测试(参数都是架构师/运维配置的)
-
user -Xms1500M -Xmx4096M -Xmn768M -XX:MetaspaceSize=200M -XX:MaxMetaspaceSize=500M -Xss512k -XX:SurvivorRatio=8
-
business -Xms2000M -Xmx2000M -Xmn500M -XX:MetaspaceSize=200M -XX:MaxMetaspaceSize=200M -XX:SurvivorRatio=4
预发环境将配置调小 复现异常场景
-
user -Xms600M -Xmx1500M -Xmn100M -XX:MetaspaceSize=200M -XX:MaxMetaspaceSize=500M -Xss256k -XX:SurvivorRatio=8
-
business -Xms512M -Xmx800M -Xmn100M -Xss256k -XX:MetaspaceSize=200M -XX:MaxMetaspaceSize=500M -XX:SurvivorRatio=8
4. 总结
- 优化掉线上环境 更新产品触发菜单权限重置导致的FullGC问题,jstat命令观察GC内存/次数/时间信息,使用MAT工具分析dump文件可疑对象,整理业务逻辑,编写文档,使用多线程异步优化更新/删除/插入代码逻辑。