Kubernetes Pod 报告的内存使用量多于实际进程消耗量

bho*_*bar 5 linux memory-management process kubernetes

我有一个 Kubernetes Pod,其中包含

  • 请求 1500Mb 内存
  • 内存限制为 2048Mb

我在这个 Pod 中运行了 2 个容器,一个是实际应用程序(重型 Java 应用程序),另一个是轻量级日志传送程序。

Pod 始终报告 1.9-2Gb 的内存使用情况。因此,部署会被扩展(设置自动扩展配置,如果内存消耗> 80%,则会扩展 Pod),自然会导致更多的 Pod 和更多的成本

黄线代表应用程序内存使用情况

在此输入图像描述

然而,经过更深入的调查,我发现了这一点。

exec应用程序容器内运行该top命令,它报告总共16431508 KiB或大约 16Gb 的可用内存,这是机器上的可用内存。

应用程序容器内运行着 3 个进程,其中根进程(应用程序)占用5.9%的内存,大约为 0.92Gb。

日志传送程序仅占用 6Mb 内存。

现在,我不明白的是为什么我的 Pod 始终报告如此高的使用率指标。我错过了什么吗?由于意外的自动扩展,我们产生了巨大的成本,并且希望解决这个问题。

小智 1

在 Linux 中,未使用的内存被视为浪费内存,这就是为什么所有“空闲”RAM(即应用程序或内核本身未使用的内存)都积极用于缓存 IO 操作、文件系统元数据等,但如果需要,将提供给您的应用程序。

您可以在此处获取有关容器内存消耗的详细信息:

/sys/fs/cgroup/内存/docker/{id}/memory.stat

如果您想根据内存使用情况扩展集群,最好只计算应用程序大小,而不是容器内存使用情况。