您可以将可用的总物理内存与
cgget
给出的数字进行比较。如果
cgget
给出的数字低于总物理内存,则可以确定使用了cgroups来限制内存。
例如,如果我在拥有2G物理内存的计算机上运行一个限制内存为100M的容器,
cgget
将报告
104857600
,而
free
命令报告
2098950144
字节:
在docker主机上:
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
现在,在该容器内部:
total used free shared buffers cached
Mem: 2098950144 585707520 1513242624 712704 60579840 367644672
-/+ buffers/cache: 157483008 1941467136
Swap: 3137335296 0 3137335296
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