【问题标题】:Kubernetes Pod OOMKilled SolutionKubernetes Pod OOMKilled 解决方案
【发布时间】:2019-04-15 17:15:33
【问题描述】:

我有一个在 Kubernetes 上运行的服务,处理从另一个资源传递的文件。单个文件大小可以在 10MB - 1GB 之间变化。

最近我看到 pod 因为 OOMKilled 错误而死了:

State: Running
Started: Sun, 11 Nov 2018 07:28:46 +0000
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
Started: Fri, 09 Nov 2018 18:49:46 +0000
Finished: Sun, 11 Nov 2018 07:28:45 +0000

我通过提高 pod 的资源(内存)限制来缓解这个问题。但我担心每当出现流量或文件大小峰值时,我们将再次遇到这个 OOMKilled 问题。但是如果我将内存限制设置得太高,我担心它会给这个 pod 的主机带来麻烦。

我阅读了 Kubernetes 提供的最佳实践:https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/#best-practices。但我不确定通过添加 --eviction-hard 和 --system-reserved=memory 是否可以解决问题。

以前有没有人遇到过类似的问题?

任何帮助将不胜感激。

【问题讨论】:

  • 粘贴你的应用程序日志,然后从那里开始,如果应用程序级别没有优化空间,那么分配更多内存

标签: memory kubernetes


【解决方案1】:

这不仅仅是 Kubernetes/Container 运行时问题,这是您的应用程序中更多的内存管理,这将取决于什么语言运行时或诸如 JVM 之类的东西正在运行您的应用程序。

您通常希望在应用程序中设置内存使用上限,例如,JVM 中的最大堆空间,然后为垃圾收集和溢出留出一点空间。

另一个例子是 Go 运行时,看起来像 they have talked 关于内存管理,但在撰写本文时还没有解决方案。对于这些情况,最好为应用程序的特定进程手动设置ulimit 虚拟内存。 (如果您有泄漏,您会看到其他类型的错误)或使用timeout

还有manual cgroup management,但这又是 docker 和 Kubernetes 应该做的。

This is a good article 对在容器中管理 JVM 的一些见解。

【讨论】:

  • 谢谢里科!我的服务使用 Java。所以JVM绝对是一个处理内存问题的问题。我将堆空间限制设置为比 kubernetes pod 的限制低 1GB。不确定这是否会导致 GC 出现任何问题。
  • Edward,如果您的 java 代码产生了许多线程,那么设置您的 jvm 最大堆将无济于事。 Java 线程将使用您的 jvm 堆之外的内存。这些可能会导致容器 oom 错误,而不是 java oom。归根结底,这实际上取决于该 java 应用程序在接收大文件时正在做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-26
  • 2020-12-22
  • 2023-03-07
  • 2017-12-29
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
相关资源
最近更新 更多