为什么win8会自动重启(win8系统自动重启的原因)

容器JVM优化

K8S资源限制后pod运行一段时间出现OOMKILLED被restart

问题分析:

原k8s集群没有对pod进行resource的限制,造成pod各自使用内存资源无限制,导致核心服务有时申请内存空间不足影响稳定性(原服务器资源比较紧张,只有两个node,日常单个node的负载可到达90%+)后续上线调整资源策略,非核心业务统一限制如下

#jvm内存堆限制参数- name: JAVA_OPTS value: > -Xms2g -Xmx2g -Xmn800m -Xss256k -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Dspring.profiles.active=aws#POD资源限制resources: limits: memory: 2.5Gi requests: memory: 2Gi

上线一周后,交易服务有告警,下游gate-way调用某段时间报500错误,跟踪日志发现pod自动restart,检查日志结果如下两图,分别有OOMKIILED事件,以及应用日志发现直接killed信号

排查其他未重启pod状态以及集群同服务的pod状态,发现内存使用量已接近resource的limit阈值,后续一天内即复现相同的问题出现OOMKILLED

排查后发现,问题初步定位在java8中 -Xmx2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m 与 limit=2.5G这两个参数影响

概括描述问题原因就是, 容器/pod/宿主划分给jvm的堆内存上限,只是告诉jvm上限,实际上jvm在到达阈值前是不会针对宿主的资源对gc等做特殊处理,而留给非jvm之外的资源(元数据以及操作系统资源)不足以承载支撑容器/pod的运作,让k8s检测到容器级的内存oom并触发k8s针对limit的restart机制, 这种restart不会触发pod生命周期的preStop(容器终止非中止)和postStart(容器创建)事件,所以优雅下线无法执行,出现流量异常.

优化策略:

调整jvm参数与容器limit的比例, -Xmx和-XX:MetaspaceSize 不大于宿主内存上限的75%

或者使用java8之后新加的参数,按比例限制(设置为容器可用内存的75%,

-XX:MaxRAMPercentage=75 -XX:InitialRAMPercentage=75 -XX:MinRAMPercentage=75)