1.场景描述
2019年7月8日 17:17分左右开始,控制中心服务器CPU飙升告警,查看日志,出现大量异常。
2.故障现象
Saturn-Console机器出现大量的如下图的故障
ZK不断的尝试重连
后来尝试通过浏览器登录到管理界面,登录不上,8080端口还在,但是http服务已经没有响应了。后台去请求数据库数据,此时已经请求不成功了。
最后就开始报堆栈溢出,直到重启。
3.问题分析
(1).JVM默认参数如下
(2).参数分析[https://www.cnblogs.com/milton/p/6134251.html]
MinHeapFreeRatio //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
MaxHeapFreeRatio //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最大空闲比率(default 70)
MaxHeapSize //对应jvm启动参数-XX:MaxHeapSize设置JVM堆的最大大小
NewSize //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
MaxNewSize //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
OldSize //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
NewRatio //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
MetaspaceSize //对应jvm启动参数-XX:MetaspaceSize 设置元空间扩容时触发FullGC的初始化阈值,也是最小阀值
CompressedClassSpaceSize //类指针压缩空间大小, 默认为1G
G1HeapRegionSize: G1区块的大小, 取值为1M至32M. 其取值是要根据最小Heap大小划分出2048个区块.
如果没配置-XX:MetaspaceSize,那么触发FGC的阈值是21807104(约20.8m)
Metaspace由于使用不断扩容到-XX:MetaspaceSize参数指定的量,就会发生FGC;
长时间的 full gc 导致 zk 不断的 reconnect;
zk的不断 reconnect 带来资源的严重消耗,恶性循环,最终 Java heap space
深入了解 Metaspace
参考:https://www.cnblogs.com/williamjie/p/9558101.html
4.解决方案
当时部署的时候,忘记了设置jvm参数,导致 jvm 参数都是 default,这不是一个好的 practice。
参数调整如下,把jmx也做了配置,方便 jvm 监控
nohup java -Xmx4G -Xms4G -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:+ExplicitGCInvokesConcurrent -Xloggc:/data/app/logs/other/gc_zk.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:ErrorFile=/data/app/logs/other/hs_err_%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/app/logs/other -Dcom.sun.management.jmxremote.port=***** -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dsun.rmi.transport.tcp.threadKeepAliveTime=75000 -Djava.rmi.server.hostname=$(hostname -i) -DSATURN_CONSOLE_DB_URL=jdbc:mysql://mysql-ip:port/*****_saturn?characterEncoding=UTF-8 -DSATURN_CONSOLE_DB_USERNAME=db-username -DSATURN_CONSOLE_DB_PASSWORD=db-password -Dsaturn.console.log=/data/app/logs/biz -Dserver.port=8080 -jar /data/app/code/saturn-console-3.1.0-exec.jar &
5.优化建议
生产环境 MetaspaceSize 设置为 256m 一般够用;
-Dcom.sun.management.jmxremote.port=*****
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false