结合java堆设置kubernetes容器的内存限制

问题描述 投票:0回答:2

我想知道是否有一种最佳方法来设置 Kubernetes 容器的内存限制,特别是对于运行 java 的应用程序。

对于Java应用程序,我们必须结合Kubernetes资源来设置堆值。这就像我们被迫猜测 Kubernetes 微服务的内存限制。

更清楚地说,

  • 在java中,堆内存可以限制为容器中定义的内存限制,但是如何达到特定的限制值??
  • 如果我们不为容器设置限制,那么java堆会考虑底层节点内存限制而不是容器限制,因此它可以将pod限制扩展到最大内存,这会给该节点中运行的其他pod带来压力.
  • 如果我们没有在容器上设置足够的内存限制,那么我们可能会看到容器因 OOM 错误而被终止。

我能想到的可能的解决方案是

  1. 监控微服务一段时间并根据利用率选择限制
  2. 实施一些负载测试机制并根据观察设置限制

除了上述之外,如果有人在设置 Kubernetes 容器的内存限制时遵循任何其他方法,我想得到一些评论。 有没有人遇到过这种情况!!

java kubernetes heap-memory
2个回答
1
投票

是的,我多次遇到过这个问题。您肯定希望保留 k8 的内存限制,以避免嘈杂的邻居问题。您提到的可能的解决方案是正确的。要获得该数字,必须进行监控和负载测试。

除此之外,我还使用 Java 进程的分析来查看 GC 是如何被触发的,以及内存使用量是否应该保持不变或随着负载的增加而增加。分析是一个非常强大的工具,可以提供对数据结构的次优使用的一些见解。

要介绍什么

在进行 Java 分析时,您需要检查

  • Eden 和 old-gen 的用法是什么
  • Full GC 运行的频率,Full GC 后内存利用率会增加和减少。请参阅GC 模式
  • 创建了多少对象
  • CPU 使用率,(在 Full GC 期间会增加)

如何分析 Java 应用程序

这里有一些很好的资源

如何使用 Java 分析 Kubernetes 应用程序


0
投票

调整云中应用程序的内存限制是一种平衡行为,因为一方面,您希望减少内存消耗,但另一方面,满足用户需求可能需要分配更多内存。

因此,首先要确定你的应用程序应该做什么以及以什么价格进行。负载测试很棒,但您还应该利用压力测试,即您的应用程序在峰值负载时需要多少资源。否则,您的服务可能会崩溃。 关于性能测试,我遇到了 Devoxx 的一个有趣的演示,其中详细讨论了最佳 Kubernetes 扩展所需的测试:https://www.youtube.com/watch?v=VQJ6B35-eWs

© www.soinside.com 2019 - 2024. All rights reserved.