Java k8s pod 经常重启问题

2023-09-17 22:33:49 +08:00
 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
3331 次点击
所在节点    Kubernetes
45 条回复
kevinlia0
2023-09-18 00:15:26 +08:00
会不会是你分配给 pod 内存不够呢。
Frankcox
2023-09-18 08:47:37 +08:00
重启的时候看下事件或者 Pod 的 status ,或者你看 dashboard 看下内存是不是超了
ixx
2023-09-18 08:51:30 +08:00
看一下重启的时候 k8s 记录的 pod 日志 有没有 oomkilled
一般情况如果不是程序本身结束进程重启就是触发了 k8s 的 oomkilled 机制
beiluo
2023-09-18 09:25:15 +08:00
大概率是 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
2023-09-18 09:32:16 +08:00
我遇到过,也是不知道什么原因。我容器内存是 1 - 2G ,Java -Xms xmx 设置的都是 2g, 然后 OPTIONS 加了一个 gc 类型 UseG1GC 。上线后出现和你一样的情况,莫名其妙的重启,后来我把-Xms1500m -Xmx1500m 和 gc 删掉让它用默认的,目前算是恢复正常,没有重启了。
fisherwei
2023-09-18 09:39:42 +08:00
java 版本是 1.8.191 以上吗?
jerry2233
2023-09-18 11:22:58 +08:00
`kubectl logs --previous POD_NAME`
dunhanson
2023-09-18 11:30:23 +08:00
@kevinlia0 再怎么调大都会被重启
dunhanson
2023-09-18 11:36:21 +08:00
@Frankcox
@ixx
@imyasON
我还得后续看下,目前没有发生重启,看下 pod 的推出状体码
dunhanson
2023-09-18 11:36:43 +08:00
@fisherwei 最新版本的 jdk8
dunhanson
2023-09-18 11:41:18 +08:00
@beiluo
@imyasON
OOMKilled 有什么有效的解决办法?(原因:由于容器 限制,该 pod 已终止。)
lasuar
2023-09-18 11:51:41 +08:00
OOM 是代码问题,不是 k8s 问题( k8s 也解决不了)。检查程序哪里发生内存泄露,这个在 java 生态里面不是有很多工具能用吗
Dream95
2023-09-18 12:05:09 +08:00
pod 内除了 Java 有没有其它进程占用了内存
lidashuang
2023-09-18 12:31:36 +08:00
@dunhanson 加内存呗
matepi
2023-09-18 12:42:45 +08:00
jvm 总体不要设过容器一半。各种 gc 相关参数打开、oom 时就能产生 heapdump ,拿出来分析内存溢出/泄露对象

还有:@imyasON

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

前几天有另一个帖子说过了,jdk8 不认识 cgroup 的限制,但是看/proc/meminfo 看到的又不是“给自己的”而是“整机的”资源,导致一些自动设定的容量大小参数计算错误
cdlnls
2023-09-18 15:21:20 +08:00
使用了 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