java 在k8s中,CPU节流是否会导致OOMKilled状态?

0sgqnhkj  于 2023-05-05  发布在  Java
关注(0)|答案(1)|浏览(308)

我的pod运行在k8s中,每20-30小时重启一次,由OOMKilled错误引起,以下是配置的限制:

limits:
    cpu: 600m
    memory: 1536Mi
  requests:
    cpu: 150m
    memory: 1536Mi

在容器中是一个JVM(Sping Boot ),运行以下选项:

-Xms256m -Xmx1G -Xdebug -XX:+UseG1GC -XX:MinHeapFreeRatio=15 -XX:MaxHeapFreeRatio=26

JVM指标分析

从我的Angular 来看,我可以看到,有一个负载峰值,但不足以达到内存限制,但CPU使用率迅速增加:

Pod指标分析

让我向您展示k8s提供的pod的指标:

内存的增加比JVM中显示的要多得多。CPU限制处于活动状态。但我找不到根本原因。看起来是容器达到了极限,而不是JVM,但是为什么呢?CPU限制是否会导致内存问题?节流是峰值减慢的预期行为。在这种情况下,我不认为会有任何内存问题。

vhmi4jdf

vhmi4jdf1#

CPU节流可能会通过降低JVM中的垃圾收集效率或升级已经低效的内存使用来间接导致内存问题,因此可能会导致应用程序的响应时间变慢,导致更多的请求排队,使用更多的内存,使应用程序在等待处理请求时在内存中存储更多的对象。
您已经设置的JVM标志是一个很好的起点。要进一步调查任何内存泄漏,您可能希望使用以下方法将堆转储到OOM上,并使用Java VisualVM等工具分析转储以找到根本原因。

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/heapdump.bin

节流是峰值减慢的预期行为。
是的,但我认为CPU节流更多的是一个手刹,而不是唯一的解决方案。相反,我会在应用程序中或在负载均衡器/反向代理级别实现适当的机制(如速率限制、请求队列、断路器或背压节流),以防止队列形成。

相关问题