Возможность 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 и перезагрузите компьютер.

Другие вопросы по тегам