Возможность malloc больше, чем docker-compose mem_limit
Я пытаюсь ограничить свой контейнер, чтобы он не занимал всю оперативную память на хосте. Из документации Docker я понимаю, что --memory
ограничивает оперативную память и --memory-swap
пределы (оперативная память + своп). Из докерской документации, похоже, что mem_limit
а также memswap_limit
Итак, я создал следующий файл docker-compose:
> cat docker-compose.yml
version: "2"
services:
stress:
image: progrium/stress
command: '-m 1 --vm-bytes 15G --vm-hang 0 --timeout 10s'
mem_limit: 1g
memswap_limit: 2g
Progrium / стрессовое изображение просто работает stress
, который в этом случае порождает один поток, который запрашивает 15 ГБ ОЗУ и удерживает его в течение 10 секунд.
Я ожидаю, что это вылетит, так как 15>2. (Это происходит сбой, если я запрашиваю больше оперативной памяти, чем у хоста.)
В ядре включены cgroups, и docker stats
показывает, что лимит признается:
> docker stats
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
7624a9605c70 0.00% 1024MiB / 1GiB 99.99% 396B / 0B 172kB / 0B 2
Так, что происходит? Как на самом деле ограничить контейнер?
Обновление: Просмотр free
похоже, что использование ОЗУ эффективно ограничено (используется только 1 ГБ ОЗУ), но подкачка - нет: контейнер будет постепенно увеличивать использование подкачки до тех пор, пока он не будет съеден, хотя все операции подкачки и stress
падает (требуется около 20 секунд, чтобы получить 5 ГБ подкачки на моей машине).
Обновление 2: настройка mem_swappiness: 0
вызывает немедленный сбой при запросе больше памяти, чем mem_limit
, невзирая на memswap_limit
,
1 ответ
Бег docker info
шоу WARNING: No swap limit support
Согласно https://docs.docker.com/engine/installation/linux/linux-postinstall/ это отключено по умолчанию ("Память и подкачка накладные расходы составляют около 1% от общей доступной памяти и снижение производительности на 10%.") Вы можете включить его, отредактировав /etc/default/grub
файл:
Добавить или отредактировать GRUB_CMDLINE_LINUX
строка для добавления следующих двух пар ключ-значение:GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
затем обновите GRUB update-grub
и перезагрузите компьютер.