Java k8s pod 经常重启问题

233 天前
 dunhanson

1 、程序没有发生堆内存异常

2 、内存显示(Memory Usage (bytes)一直在增加( kubernetes dashboard )

3 、jvm 参数设置 JAVA_TOOL_OPTIONS

-XX:+UseContainerSupport -XX:InitialRAMPercentage=80.0
-XX:MaxRAMPercentage=80.0 -XX:+PrintGCDetails
-XX:+PrintGCDateStamps -Xloggc:/data/logs/app/gc.log
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/logs/app/dump.hprof
2989 次点击
所在节点    Kubernetes
45 条回复
kevinlia0
233 天前
会不会是你分配给 pod 内存不够呢。
Frankcox
233 天前
重启的时候看下事件或者 Pod 的 status ,或者你看 dashboard 看下内存是不是超了
ixx
233 天前
看一下重启的时候 k8s 记录的 pod 日志 有没有 oomkilled
一般情况如果不是程序本身结束进程重启就是触发了 k8s 的 oomkilled 机制
beiluo
233 天前
大概率是 OOMKilled ,查看 pod status 可以看到 exit code 和 reason, exit code 可以参考 https://komodor.com/learn/exit-codes-in-containers-and-kubernetes-the-complete-guide/
如果不是,可以查看 previous pod log 看下是不是 jvm crash 出 core dump 了。
imyasON
233 天前
我遇到过,也是不知道什么原因。我容器内存是 1 - 2G ,Java -Xms xmx 设置的都是 2g, 然后 OPTIONS 加了一个 gc 类型 UseG1GC 。上线后出现和你一样的情况,莫名其妙的重启,后来我把-Xms1500m -Xmx1500m 和 gc 删掉让它用默认的,目前算是恢复正常,没有重启了。
fisherwei
233 天前
java 版本是 1.8.191 以上吗?
jerry2233
233 天前
`kubectl logs --previous POD_NAME`
dunhanson
233 天前
@kevinlia0 再怎么调大都会被重启
dunhanson
233 天前
@Frankcox
@ixx
@imyasON
我还得后续看下,目前没有发生重启,看下 pod 的推出状体码
dunhanson
233 天前
@fisherwei 最新版本的 jdk8
dunhanson
233 天前
@beiluo
@imyasON
OOMKilled 有什么有效的解决办法?(原因:由于容器 限制,该 pod 已终止。)
lasuar
233 天前
OOM 是代码问题,不是 k8s 问题( k8s 也解决不了)。检查程序哪里发生内存泄露,这个在 java 生态里面不是有很多工具能用吗
Dream95
233 天前
pod 内除了 Java 有没有其它进程占用了内存
lidashuang
233 天前
@dunhanson 加内存呗
matepi
233 天前
jvm 总体不要设过容器一半。各种 gc 相关参数打开、oom 时就能产生 heapdump ,拿出来分析内存溢出/泄露对象

还有:@imyasON

不要 不要 不要 随便随便就设置等同的 xms 和 xmx 。当堆内用量情况很平稳没有升代、长时间不需要 fullgc ,没有 fullgc 就有不能触发挂载在 finalizer 上的资源回收,可能导致包括堆外溢出等各种各样的资源耗尽问题。在确认没有堆外资源、没有 finalizer 依赖等等情况下,已经做过深度优化的基础上再考虑 xms=xmx 的设定。
chendy
233 天前
容器内存限制 500m 的话,堆最大给 250m ,也就是堆内堆外 1:1 比较稳妥,然后上监控看看实际使用情况再酌情往大了给
Georgedoe
233 天前
java8 读的不是容器内存 , 是宿主机内存 , 容易堆溢出 , 得设置 Xms 和 Xmx
imyasON
233 天前
@matepi 多谢指教
julyclyde
232 天前
@dunhanson 都 jdk8 了还能有多新啊

前几天有另一个帖子说过了,jdk8 不认识 cgroup 的限制,但是看/proc/meminfo 看到的又不是“给自己的”而是“整机的”资源,导致一些自动设定的容量大小参数计算错误
cdlnls
232 天前
使用了 MaxRAMPercentage=80.0 后,容器里面的 jvm 最大堆内存是多少呢?
jdk8 现在应该还不认识 cgroup2 的资源限制的,目前应该是只能支持 v1 。如果节点上使用的是 cgroup2 的话,在使用 MaxRAMPercentage 的时候,会按照节点的内存大小来计算百分比,而不是 pod 资源限制的内存大小来计算。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/974651

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX