【发布时间】:2021-05-22 08:57:50
【问题描述】:
在由于 mem_limit 过低的 docker 容器发生崩溃后,我如何检查 in 容器该容器的 mem_limit?如果 mem_limit 设置为低,我想在启动时打印一条错误消息并退出。
【问题讨论】:
标签: docker docker-compose
在由于 mem_limit 过低的 docker 容器发生崩溃后,我如何检查 in 容器该容器的 mem_limit?如果 mem_limit 设置为低,我想在启动时打印一条错误消息并退出。
【问题讨论】:
标签: docker docker-compose
内存限制是通过 cgroups 强制执行的。因此你需要使用cgget来找出给定cgroup的内存限制。
要对此进行测试,您可以运行具有内存限制的容器:
docker run --memory 512m --rm -it ubuntu bash
在你的容器中运行它:
apt-get update
apt-get install cgroup-bin
cgget -n --values-only --variable memory.limit_in_bytes /
# will report 536870912
Docker 1.13 将容器的 cgroup 挂载到 /sys/fs/cgroup(这在未来的版本中可能会改变)。您可以使用以下方法检查限制:
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
【讨论】:
/sys/fs/cgroup。看我的更新。这也适用于 centos。
cat /proc/self/cgroup | grep "memory:/" | sed 's/\([0-9]\):memory:\/docker\///g'
在主机上,您可以运行 docker stats 来获得类似 top 的正在运行容器的监视器。输出如下:
$ docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
729e4e0db0a9 dev 0.30% 2.876GiB / 3.855GiB 74.63% 25.3MB / 4.23MB 287kB / 16.4kB 77
这就是我发现docker run --memory 4096m richardbronosky/node_build_box npm run install 没有获得 4G 内存的原因,因为 Docker 被配置为限制为 2G 内存。 (在上面的示例中,这已得到纠正。)没有该站点,我完全不知道为什么我的进程以简单的“killed”结尾。
【讨论】:
-m=value[m|g]中的确切值
在容器中为我工作,感谢塞巴斯蒂安的想法
#!/bin/sh
function memory_limit
{
awk -F: '/^[0-9]+:memory:/ {
filepath="/sys/fs/cgroup/memory"$3"/memory.limit_in_bytes";
getline line < filepath;
print line
}' /proc/self/cgroup
}
if [[ $(memory_limit) < 419430400 ]]; then
echo "Memory limit was set too small. Minimum 400m."
exit 1
fi
【讨论】:
/sys/fs/cgroup/memory/memory.limit_in_bytes 中看到内存限制。上面答案中的“$3”是什么?
以前/sys/fs/cgroup/memory/memory.limit_in_bytes 为我工作,但在我的带有内核5.8.0-53-generic 的ubuntu 中,现在正确的端点似乎是/sys/fs/cgroup/memory.max,以便从容器内部恢复内存限制。
【讨论】: