问题排查
现象
业务(重量级业务,比较庞大)高峰期接口偶尔频繁超时,重启机器即可恢复,或连续超时多次超时后pod内存溢出,直接触发重启后恢复。多次出现超时情况时jstack线程栈、jmap获取内存快照,对其进行分析后没明显异常。
机器配置
pod配置
pod内存: 5.1G(线上环境可配置的上线【规定】)
副本数量:15
核心数量: 3
jvm配置
-server -Xms3800m -Xmx3800m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xmn1125m -XX:MaxDirectMemorySize=256m -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=5000 -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:+ExplicitGCInvokesConcurrent -Dsun.rmi.dgc.server.gcInterval=2592000000 -Dsun.rmi.dgc.client.gcInterval=2592000000 -
无关紧要的已省略。。。
grafana大盘监控
pod监控
请求pod内存打满后内存溢出,磁盘读速率直接飙升5,触发pod重启,重启后恢,时间一长再次出现问题
jvm监控现象
jvm监控正常,jvm堆内存利用率较低,jvm垃圾回收无明显异常
问题定位
从上述表现来看,jvm内存分配过多,给pod本身留的内存不足,导致业务高峰期pod内存逐渐被打满,临时使用磁盘充当内存,导致磁盘读飙升,请求变得异常缓慢(接口频繁超时),请求堆积多了之后,pod内存被打满甚至溢出,触发pod重启。重启后暂时恢复,过一段时间后又出现上述问题。
问题解决
如何解决?
调低分配给jvm的内存,给pod本身多留一些内存,部署线上一台机器并持续观察,在观测到没问题后进行全量部署
修改jvm配置
3800MB -> 3000MB
-server -Xms3000m -Xmx3000m
问题解决后监控大盘表现
JVM监控