Вы можете сравнить общую доступную физическую память с числом, которое дает вам cgget
. Если число, заданное cgget
, меньше, чем общая физическая память, то вы точно знаете, что контрольные группы использовались для ограничения памяти.
Например, если я запускаю контейнер, ограничивающий память до 100 МБ на моем компьютере с 2 ГБ физической памяти, cgget
сообщит 104857600
, а команда free
сообщит 2098950144
байт:
На хосте докера:
# 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
сообщит о тех же значениях на хосте докера, что и внутри контейнеров.
В конце концов, следующий сценарий 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
person
Thomasleveil
schedule
06.01.2016