【问题标题】:Check mem_limit within a docker container检查 docker 容器中的 mem_limit
【发布时间】:2021-05-22 08:57:50
【问题描述】:

在由于 mem_limit 过低的 docker 容器发生崩溃后,我如何检查 in 容器该容器的 mem_limit?如果 mem_limit 设置为低,我想在启动时打印一条错误消息并退出。

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    内存限制是通过 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
    

    【讨论】:

    • 嗯,这似乎行不通。它总是在容器中给我一个巨大的价值(9223372036854771712),我猜这是系统中可用的总内存。当我在外面查看“容器统计信息”时,我现在应用的 400m 限制显示出来了。所以仍然很困惑如何在容器内获得相同的值。顺便说一下,这是在 docker 1.13 上运行的 centos 容器。
    • @Mandragor 您也可以签入/sys/fs/cgroup。看我的更新。这也适用于 centos。
    • cat /sys/fs/cgroup/memory/memory.limit_in_bytes 返回 9223372036854771712。
    • 找到了我的容器的值。它与 cat /sys/fs/cgroup/memory/docker/f7e5d4b494573004bc80ea0892459d4e19b0112ee64d0e1f9044579912a89f62/memory.limit_in_bytes 一起返回。如何获取长容器 id,这是 ../memory/docker/... 之后的这个令人难以置信的长字符串。
    • 试试cat /proc/self/cgroup | grep "memory:/" | sed 's/\([0-9]\):memory:\/docker\///g'
    【解决方案2】:

    在主机上,您可以运行 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]中的确切值
    【解决方案3】:

    在容器中为我工作,感谢塞巴斯蒂安的想法

    #!/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”是什么?
    • 这有点神奇。 $3 是由 ':' 分隔的第三个字段。在普通 shell 中,它类似于 "cat /proc/self/cgroup|grep -E '^[0-9]+:memory:|cut -d: -f3 ....同样的事情,但仅在 awk 中。如果您使用 docker,则有不同的内存限制,因此 /proce/self/group 是选择正确 memory_limit 的起点
    【解决方案4】:

    以前/sys/fs/cgroup/memory/memory.limit_in_bytes 为我工作,但在我的带有内核5.8.0-53-generic 的ubuntu 中,现在正确的端点似乎是/sys/fs/cgroup/memory.max,以便从容器内部恢复内存限制。

    【讨论】:

      猜你喜欢
      • 2019-04-21
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 2020-11-11
      • 2020-09-19
      • 2021-07-27
      相关资源
      最近更新 更多