我已经创建了一个新的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
容器必须运行才能正常工作。