🐳 Как установить ограничение памяти для контейнеров Docker

by itisgood

Контейнеры Docker по умолчанию работают без каких-либо ограничений на ресурсы.

Процессы, запущенные в контейнерах, могут использовать неограниченный объем памяти, что потенциально может повлиять на соседние контейнеры и другие рабочие нагрузки на вашем хосте.

Это опасно в производственных средах.

Каждый контейнер должен быть настроен с соответствующим ограничением памяти для предотвращения чрезмерного потребления ресурсов.

Это поможет уменьшить количество конфликтов, что максимально повысит общую стабильность системы.

Как работают ограничения памяти в Docker

Docker позволяет устанавливать жесткие и мягкие ограничения памяти для отдельных контейнеров.

Они по-разному влияют на объем доступной памяти и поведение при достижении лимита.

  • hard limit памяти устанавливают абсолютный лимит памяти, предоставляемой контейнеру. Превышение этого лимита обычно приводит к завершению процесса контейнера из-за отсутствия памяти в ядре.
  • soft limit памяти указывают объем памяти, который контейнер должен использовать. Контейнеру разрешается использовать больше памяти при наличии свободного места. Он может быть завершен, если превысит мягкий лимит в условиях нехватки памяти.

Docker также предоставляет элементы управления для установки ограничений на подкачку памяти и изменения того, что происходит при достижении лимита памяти.

Вы увидите, как их использовать в следующих разделах.

Установка жестких и мягких ограничений памяти

Жесткий лимит (hard limit) памяти задается флагом -m или –memory команды docker run.

Он принимает значение 512m (для мегабайтов) или 2g (для гигабайтов):

$ docker run --memory=512m my-app:latest

Минимальное требование к памяти контейнеров составляет 6 МБ.

Попытка использовать значения –memory меньше 6m приведет к ошибке.

Мягкие ограничения памяти (soft limit ) устанавливаются с помощью флага –memory-reservation.

Это значение должно быть меньше, чем –memory.

Ограничение будет применяться только в том случае, если происходит борьба за ресурсы контейнера или хосту не хватает физической памяти.

$ docker run --memory=512m --memory-reservation=256m my-app:latest
Этот пример запускает контейнер, который имеет 256 МБ зарезервированной памяти.
Процесс может быть завершен, если он использует 300MB и емкость заканчивается.
Он всегда будет останавливаться, если использование превысит 512MB.

Управление памятью подкачки

Контейнерам может быть выделена память подкачки для обеспечения высокого уровня использования без влияния на потребление физической памяти.

Своп позволяет записывать содержимое памяти на диск, когда доступная оперативная память исчерпана.

Флаг –memory-swap управляет объемом доступного пространства подкачки.

Он работает только в сочетании с –memory.

Когда вы устанавливаете –memory и –memory-swap в разные значения, значение swap контролирует общий объем памяти, доступный контейнеру, включая пространство подкачки.

Значение параметра –memory определяет часть этого объема, которая является физической памятью.

$ docker run --memory=512m --memory-swap=762m my-app:latest

Этот контейнер имеет доступ к 762 МБ памяти, из которых 512 МБ – это физическая оперативная память.

Оставшиеся 250 МБ – это пространство подкачки, хранящееся на диске.

Установка –memory без –memory-swap дает контейнеру доступ к тому же объему пространства подкачки, что и физическая память:

$ docker run --memory=512m my-app:latest

Этот контейнер имеет в общей сложности 1024 МБ памяти, из которых 512 МБ оперативной памяти и 512 МБ подкачки.

Подкачку можно отключить для контейнера, установив флаг –memory-swap в то же значение, что и –memory.

Поскольку –memory-swap задает общий объем памяти, а –memory выделяет долю физической памяти, вы указываете Docker, что 100% доступной памяти должно быть RAM.

В любом случае своп работает только тогда, когда он включен на вашем хосте.

Отчеты о свопе внутри контейнеров ненадежны и не должны использоваться.

Такие команды, как free, выполняемые внутри контейнера, отображают общий объем пространства подкачки на хосте Docker, а не подкачку, доступную контейнеру.

Заключение

Контейнеры Docker поставляются без заранее установленных ограничений на ресурсы.

Это позволяет процессам контейнера свободно потреблять неограниченное количество памяти, угрожая стабильности вашего хоста.

См. также:

 

You may also like

Leave a Comment