Docker 容器如何判断其内存是否有限?
How can a Docker container tell whether its memory was limited?
我在 Docker 容器内使用 cgget -n --values-only --variable memory.limit_in_bytes /
来查看根据 docker run --memory=X
允许使用多少内存。但是,我需要知道内存是否完全有限,上面的命令没有回答这个问题,因为在那种情况下它只会给我一个很大的数字(在我的测试中 9223372036854771712
)。
那么,有什么方法可以判断内存是否受限?我正在寻找不以特殊方式涉及 运行 docker run
的解决方案,例如从主机挂载文件(例如 /var/...
)或传递环境变量。
您可以将可用物理内存总量与 cgget
给您的数字进行比较。如果 cgget
给出的数字小于总物理内存,那么你肯定知道 cgroups 用于限制内存的位置。
例如,如果我 运行 一个容器将内存限制为 100M 我的计算机上有 2G 的物理内存,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}')
local -ir CGROUP_MEM=$(cgget -n --values-only --variable memory.limit_in_bytes / | awk '{printf "%d", /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 美分,无需安装任何第三方工具,您可以使用 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
我在 Docker 容器内使用 cgget -n --values-only --variable memory.limit_in_bytes /
来查看根据 docker run --memory=X
允许使用多少内存。但是,我需要知道内存是否完全有限,上面的命令没有回答这个问题,因为在那种情况下它只会给我一个很大的数字(在我的测试中 9223372036854771712
)。
那么,有什么方法可以判断内存是否受限?我正在寻找不以特殊方式涉及 运行 docker run
的解决方案,例如从主机挂载文件(例如 /var/...
)或传递环境变量。
您可以将可用物理内存总量与 cgget
给您的数字进行比较。如果 cgget
给出的数字小于总物理内存,那么你肯定知道 cgroups 用于限制内存的位置。
例如,如果我 运行 一个容器将内存限制为 100M 我的计算机上有 2G 的物理内存,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}')
local -ir CGROUP_MEM=$(cgget -n --values-only --variable memory.limit_in_bytes / | awk '{printf "%d", /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 美分,无需安装任何第三方工具,您可以使用 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