Docker容器如何判断内存是否有限?
我正在使用cgget -n --values-only --variable memory.limit_in_bytes /
在Docker容器中查看允许使用多less内存作为docker run --memory=X
但是,我需要知道内存是否有限制,这是没有回答上面的命令,因为它只会给我一个很大的数字(在我的testing9223372036854771712
)。
那么,有没有办法来判断记忆是否有限? 我正在寻找解决scheme,不需要以特殊方式运行docker run
,比如从主机上挂载文件(例如, /var/...
)或传递一个环境variables。
你可以比较可用的总物理内存数量cgget
给你。 如果cgget
给出的cgget
低于总物理内存,那么肯定知道用于限制内存的cgroup。
例如,如果我运行一个容器将内存限制在具有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
,它可以在一个testing中用来检查用来限制内存的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