gpt4 book ai didi

java - 当 K8s 健康检查重新启动 pod 时创建 JVM heapdump - 没有发生 OOM

转载 作者:行者123 更新时间:2023-12-02 11:32:08 26 4
gpt4 key购买 nike

我有一种情况,突然发生了很长的 GC 暂停,我需要找出突然分配内存的原因是什么。长时间的 GC 暂停(大约 30 秒)导致 pod 连续多次失败 K8s 健康检查,并且 pod 重新启动,实际上没有发生 OOM。我想在 K8s 实际重新启动 pod 之前创建一个堆转储。我意识到应该对一些外部持久安装进行转储。
我对如何导致堆转储发生的唯一想法是使用 preStop Hook 。
问题是,当 Pod 因健康检查失败而重新启动时,是否会触发 preStop 钩子(Hook)?
也许有一个更优雅的解决方案?

最佳答案

The question is, whether the preStop hook is fired when the pod isrestarted because of health check failure?


是的。根据 definition , perStop钩子(Hook)在容器因 API 请求或管理事件(例如 Activity 探测失败、抢占、资源争用等)而终止之前立即运行。

Should I use preStop hook to capture Java Heap Dump before podtermination?


是的。但是你需要小心,如果容器已经处于终止或完成状态,对 preStop 钩子(Hook)的调用会失败。当 pod is terminated ,它在发送 KILL 信号之前等待默认的 30 秒宽限期(如果 PerStop Hook 未完成,则额外等待 2 秒)。如果 preStop Hook 需要比默认宽限期允许的时间更长的时间,您必须修改 terminationGracePeriodSeconds以适应这一点。

Any more elegant solution to this?


我不知道。我想通过添加 empty dir卷到 pod,并配置 JVM 以将堆转储到该目录 command: ["java", "-XX:+HeapDumpOnOutOfMemoryError", "-XX:HeapDumpPath=/dumps/oom.bin", "-jar", "yourapp.jar"]应该管用。

Why the above solution will work?


当 kubernetes 因为没有响应健康检查而杀死你的容器时,kubernetes 只会重新启动容器,但不会重新调度 pod,因此不会将其移动到另一个节点。因此,在将 pod 移动到另一个节点之前,不会删除空的 dir 卷。因此,当容器重新启动时,新容器将挂载相同的空目录,该目录将包含上次运行的堆转储。所以你可以 kubectl cp这些文件在事件发生后的任何时间。复制堆转储文件可能还有其他挑战,但它们是可以解决的。查看 this了解更多信息。

关于java - 当 K8s 健康检查重新启动 pod 时创建 JVM heapdump - 没有发生 OOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63214691/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com