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

How to find out how much RAM a docker run execution consumed at maximum?

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

现在我想知道 docker 运行 在其峰值时占用了多少 RAM。

例如,我创建了一个 httpie-image(对于正确的偏执狂,我通过以下方式执行的 Dockerfile is also on dockerhub

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

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

如果我在容器结束后运行它,它会显示0。 (要获取容器 ID,我使用 d 标志。)

$ docker run -itd k0pernikus/httpie-docker-alpine HEAD https://whosebug.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 uses cgroups under the hood。我们只需要向内核询问正确的问题,即 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

容器必须是 运行 才能工作。