Docker容器如何确定其内存是否受到限制?

8
我在Docker容器中使用cgget -n --values-only --variable memory.limit_in_bytes /命令来查看内存限制,与docker run --memory=X一致。然而,我需要知道是否有限制了内存,这是上述命令无法回答的,因为它只会给我一个很大的数字(例如,在我的测试中是9223372036854771712)。
那么,有没有办法判断内存是否被限制了?我正在寻找不涉及以特殊方式运行docker run的解决方案,例如挂载主机文件(例如,/var/...)或传递环境变量。

请查看此处: https://dev59.com/QVgQ5IYBdhLWcg3w0HIA#42188649 - Mandragor
2个回答

11
您可以将可用的总物理内存与cgget给出的数字进行比较。如果cgget给出的数字低于总物理内存,则可以确定使用了cgroups来限制内存。

例如,如果我在拥有2G物理内存的计算机上运行一个限制内存为100M的容器,cgget将报告104857600,而free命令报告2098950144字节:

在docker主机上:
# free -b
             total       used       free     shared    buffers     cached
Mem:    2098950144  585707520 1513242624     712704   60579840  367644672
-/+ buffers/cache:  157483008 1941467136
Swap:   3137335296          0 3137335296    

启动一个限制为100M的容器

docker run --rm -it --memory=100M <any-image-with-cgget-available> bash -l

现在,在该容器内部:
# free -b
             total       used       free     shared    buffers     cached
Mem:    2098950144  585707520 1513242624     712704   60579840  367644672
-/+ buffers/cache:  157483008 1941467136
Swap:   3137335296          0 3137335296    

# cgget -n --values-only --variable memory.limit_in_bytes /
104857600

请注意,free命令会在docker主机上报告与容器内部相同的值。最终,下面的bash脚本定义了一个名为is_memory_limited的函数,可以在测试中使用该函数来检查是否使用cgroup限制了内存。
#!/bin/bash
set -eu

function is_memory_limited {
    type free >/dev/null 2>&1 || { echo >&2 "The 'free' command is not installed. Aborting."; exit 1; }
    type cgget >/dev/null 2>&1 || { echo >&2 "The 'cgget' command is not installed. Aborting."; exit 1; }
    type awk >/dev/null 2>&1 || { echo >&2 "The 'awk' command is not installed. Aborting."; exit 1; }

    local -ir PHYSICAL_MEM=$(free -m | awk 'NR==2{print$2}')
    local -ir CGROUP_MEM=$(cgget -n --values-only --variable memory.limit_in_bytes / | awk '{printf "%d", $1/1024/1024 }')

    if (($CGROUP_MEM <= $PHYSICAL_MEM)); then
        return 0
    else
        return 1
    fi
}


if is_memory_limited; then
    echo "memory is limited by cgroup"
else
    echo "memory is NOT limited by cgroup"
fi

2
在我的 Ubuntu 16 上,它提示“cgget 命令未找到”;尝试安装“apt-get install cgget”也失败了。请帮忙! - Nam G VU
1
如果其他人搜索的话:它们可以在 cgroup-bin 软件包中找到。 - johanvdw
@johanvdw 在Ubuntu 20中,它是cgroup-tools - David Moles
当我在我的容器中运行 cgget -n --values-only --variable memory.limit_in_bytes /(Ubuntu 20.04 运行在 macOS Docker Desktop 2.3.0.4 上,使用 --memory=1536m)时,我得到了 ULONG_MAX (9223372036854771712)。 - David Moles

-1

这只是我的两分之一,与其安装任何第三方工具,你可以简单地使用 docker stats 检查有限内存。

docker container run --name mytestserver -m 200M -dt nginx

就像在这个例子中,我将内存限制为200M,现在需要验证一下

docker stats <container id>

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
3afb4a8cfeb7        mytestserver        0.00%               **1.387MiB / 200MiB**   0.69%               8.48MB / 24.8kB     39.2MB / 8.25MB     2

2
这并没有回答问题“Docker容器如何知道其内存是否受限制?”。您提供的命令必须从主机机器上使用。 - Gus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接