我的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限制是否会导致内存问题?节流是峰值减慢的预期行为。在这种情况下,我不认为会有任何内存问题。
1条答案
按热度按时间vhmi4jdf1#
CPU节流可能会通过降低JVM中的垃圾收集效率或升级已经低效的内存使用来间接导致内存问题,因此可能会导致应用程序的响应时间变慢,导致更多的请求排队,使用更多的内存,使应用程序在等待处理请求时在内存中存储更多的对象。
您已经设置的JVM标志是一个很好的起点。要进一步调查任何内存泄漏,您可能希望使用以下方法将堆转储到OOM上,并使用Java VisualVM等工具分析转储以找到根本原因。
节流是峰值减慢的预期行为。
是的,但我认为CPU节流更多的是一个手刹,而不是唯一的解决方案。相反,我会在应用程序中或在负载均衡器/反向代理级别实现适当的机制(如速率限制、请求队列、断路器或背压节流),以防止队列形成。