2017-04-05 22 views
2

我仍然有种让我的脚在我kubernetes。我们有一个基于Spring启动的应用程序,它在AWS上运行Kubernetes 1.4.2上的~17个微服务。当我在4个m3.medium worker的AWS集群上运行这个应用程序时,我的容器都在200-300MB的内存使用范围内(有一些例外)。对于生产,我在4个大型工作人员上安装了相同的一组服务,并立即将我的内存移动到相同容器上的700-1000MB内存,并且几乎具有相同的规格。我试图找出这里的冒犯派对--Springboot,Docker或Kubernetes。Kubernetes荚使用太多内存在较大的机器

有没有人见过的行为像这样过吗?

我知道我可以使用Kubernetes限制封顶的资源,但我真的不想这样做,因为我知道应用程序可以运行在更小的机器就好了,有一个更小的空间。只是寻找一些关于问题可能出现的建议。

编辑:一个多件或相关信息。我使用CoreOS稳定版1298.6.0作为主机操作系统映像。

+0

在GKE上运行akka工人的确有相同的问题。这些豆荚在n个标准机器上的运行情况非常好,最高限额为500MB,当我将它们移动到nb标准机器时,它的限制为2000mb,它们开始违反限制并被逐出(这真的是从内存中看出来的东西用法变得不合时宜) –

+0

您的应用程序是否根据机器容量调整其资源使用情况(例如,进程/线程数量)?如果应用程序提供指标,则可以进行并排比较。 –

+0

这些都是我希望能够进行测试的非常聪明的问题,但是这个问题出现在我以前的工作中,因此我无法再访问他们的指标。如果我能够重现,我会确保我检查这些东西。 –

回答

1

在我看来,问题是,在容器内的过程中看到可以作为为他们提供的RAM总主机RAM。

如果你使用一个更大的情况下,JVM将尝试使用更多的内存。你应该尝试用-Xmx300m限制你的Java虚拟机堆(用你的应用程序需要调整这个值)。 我建议你阅读this文章,它以简单和干净的方式解释。

+0

本文有帮助,谢谢。有趣的是,依环境而定还是有差异的。我发现使用资源限制进行配置时,我只能在pod以k8s作为OOM终止之前变得非常小。如果我将它设置为一个env变量,我可以变小,但内存仍然令人惊讶地高。作为参考: - 部署规格限制我可以得到不小于〜350MB(设置资源请求175Mi /限制350Mi) - 使用env变量设置(我设置-Xms64m -Xmx128m),但在k8s本身上,该吊舱仍然打到〜290MB - 当在m3机器上无限制时,豆荚永远不会超过260MB – Mark

+0

如果其他人感兴趣,可以在上面的文章中找到另外一个注释。您可以使用-XX:MaxMetaspaceSize = 来进一步约束Java 8中的内存,但即使如此,还是会为每个容器分配一些额外的内存,这似乎与运行它的机器的大小有关。最终,我找到了Xmx + -XX:MaxMetaspaceSize +〜60-70MB为我的小服务提供了我的总容器大小。 – Mark