如何找出 docker 运行执行最多消耗多少 RAM?



我已经创建了一个新的docker服务,并且正在确定其所需的资源。由于将 RAM 应用于新服务是贪婪的 - 说容器可以有 8GB 的 RAM 它会得到它们 - 我不想浪费集群的资源。

现在我试图找出 docker 运行在高峰期需要多少 RAM。

例如,我创建了一个 httpie-image(对于理所当然的偏执狂,Dockerfile 也在 dockerhub 上,我通过以下方式执行:

docker run -it k0pernikus/httpie-docker-alpine HEAD https://stackoverflow.com/

我知道有一个docker stats命令,但它似乎显示了当前的内存使用情况,我真的不想监视它。

如果我在容器结束后运行它,它将显示0.(为了获取容器 ID,我使用 d 标志。

$ docker run -itd k0pernikus/httpie-docker-alpine HEAD https://stackoverflow.com/ 
132a93ffc9e297250b8ca37b2563aa2b5e423e146890fe3383a91a7f26ef990c
$ docker stats 132a93ffc9e297250b8ca37b2563aa2b5e423e146890fe3383a91a7f26ef990c

它将显示:

CONTAINER                                                          CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
132a93ffc9e297250b8ca37b2563aa2b5e423e146890fe3383a91a7f26ef990c   0.00%               0 B / 0 B           0.00%               0 B / 0 B           0 B / 0 B           0

然而,它最多消耗了多少 RAM?

tl;博士:

  • 启用内存记帐
  • cat /sys/fs/cgroup/memory/docker/${CONTAINER_ID}/memory.max_usage_in_bytes

Docker在引擎盖下使用cgroups。我们只需要问内核正确的问题,即cat正确的文件。为此,必须启用内存记帐(如文档中所述(。

在基于 systemd 的系统上,这是非常简单的。为 docker 守护程序创建一个插入式配置:

systemctl set-property docker.service MemoryAccounting=yes
systemctl daemon-reload
systemctl restart docker.service

(这将增加一些开销,因为每次容器分配RAM时,都必须更新计数器。更多详情:https://lwn.net/Articles/606004/(

然后,使用可以通过 docker 检查发现的完整容器 ID:

docker inspect --format="{{.Id}}" $CONTAINER_NAME

您可以获得使用的最大内存:

cat /sys/fs/cgroup/memory/docker/${CONTAINER_ID}/memory.max_usage_in_bytes

容器必须运行才能正常工作。

最新更新