业务场景:游戏行业,N个服务器,要进行大批量的合服处理,玩家数据会上升,从新整理和服务器的分配情况和逻辑处理,正常开发后,当天白天正常,然后晚上高峰期开始玩家频繁反馈无法登录~~~
处理逻辑:
优先确认服务是否宕机,如果是,就重启,分析linux系统日志,根据宕机的原因进行处理即可;
再确认服务器情况,cpu、内存、硬盘、网络等等;
内存使用情况还算正常,还有30-40的余量空间,cpu很明显的异常:
再查询进程下线程的具体情况:
再吧5675转16进制: 162b ,再查询堆栈信息
1 | jstack 5656| grep -i -B 10 -A 50 162b |
可以确认,系统在疯狂GC~~~再查询gc的详情
1 | jstat -gcutil 5596 1000 5; |
到此,确认是gc导致的bug~~~
首先把堆栈导出后,重启,先恢复系统
1 2 | jstack -l 5596 > jstack.data; jmap -histo 5596 > jmap.data; |
那么如何解决呢?
1:优化代码
2:优化服务器
1的话工作量比较大,而且开头说道了内存其实是够够的~所以选2,jvm调优
根据jdk版本,选择调整:1.7是PermSize,大于的是MetaspaceSize
-Xmx3072m -Xms2048m -XX:PermSize=256M -XX:MaxPermSize=512M
-Xmx3072m -Xms2048m -XX:CompressedClassSpaceSize=256m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
后续观察了几天,cpu都正常。