我在cgget -n --values-only --variable memory.limit_in_bytes /
Docker容器中使用,以查看允许使用的内存量docker run --memory=X
.但是,我需要知道内存是否有限,上面的命令没有回答,因为在这种情况下它会给我一个很大的数字(9223372036854771712
在我的测试中).
那么,有没有办法判断内存是否有限?我正在寻找不涉及docker run
以特殊方式运行的解决方案,例如从主机安装文件(例如/var/...
)或传递环境变量.
您可以将可用的总物理内存与cgget
给出的数字进行比较.如果给定的数字cgget
低于总物理内存,那么您肯定知道用于限制内存的cgroup.
例如,如果我在我的计算机上运行一个容器将内存限制为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=100Mbash -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