Настройка ограничения потребления ресурсов хоста LXC-контейнерами


Ограничения по использованию контейнерами процессорного времени

Ограничения на использование ядер процессора

Ограничиваем контейнер использованием одного ядра процессора (в многоядерных системах):

# lxc config set next-cloud-01 limits.cpu 1

Обратите внимание, что задавая одно значение этого параметра, мы задаем число используемых ядер (любых), а задавая несколько номеров, мы задаем номера ядер процессора которые мы будем использовать. И если мы хотим использовать несколько ядер, то разделаем их запятой:

# lxc config set next-cloud-01 limits.cpu 0,1

Обратите на это внимание! Если задать параметр в 0, то мы снимаем все ограничения на число используемых процессорных ядер и это довольно распространенная ошибка администраторов LXD.

Сведения о доступных в системе ядрах получаем командой:

# cat /proc/cpuinfo | grep processor
processor       : 0
processor       : 1

Ограничения на использование процессорного времени

Установим лимит на использование 20% процессорого времени (выделенных процессорных ядер):

# lxc config set next-cloud-01 limits.cpu.allowance 20%

Или можно использовать явные указания использования времени:

# lxc config set next-cloud-01 limits.cpu.allowance 100ms/200ms

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

Управление приоритетом

Для того чтобы понизить приоритет в использовании процессорного времени до минимума используйте команду:

# lxc config set next-cloud-01 limits.cpu.priority 0

Максимальное значение приоритета равно 10 и это же значение по умолчанию.

Ограничение на использование оперативной памяти

Во первых, определимся сколько памяти реально использует контейнер:

# lxc info next-cloud-01 | grep "Memory (current)"
    Memory (current): 721.52MB

И для справки посмотрим на максимально зафиксированное значение:

# lxc info next-cloud-01 | grep "Memory (peak)"
    Memory (peak): 745.42MB

Ограничение на используемую контейнером оперативную память

Ограничиваем контейнер использованием одного гигабайта оперативной памяти:

# lxc config set next-cloud-01 limits.memory 1024MB

Проверяем доступную память "внутри" контейнера:

# free
              total        used        free      shared  buff/cache   available
Mem:        1000000      325752      267548       17048      406700      674248
Swap:       2097148      308736     1788412

Работа с файлом подкачки

Отключаем использование файла подкачки:

# lxc config set next-cloud-01 limits.memory.swap false

Обратите внимание, что управление файлом подкачки для LXD контейнеров по умолчанию отключено и для его включения вам надо добавить к параметрам ядра:

swapaccount=1

Более подробно об этом можно почитать в моей статье "Сборка гипервизора контейнеров LXC (LXD) из исходных кодов и настройка окружения разработчика". И еще

Приоритет использования файла подкачки

# lxc config set next-cloud-01 limits.memory.swap.priority 0

Значение по умолчанию 10 и чем выше это значение, тем менее вероятно, что память контейнера будет выгружена на диск (целое число от 0 до 10). Установка в 0 приоритезирует выгрузку памяти приложений контейнера в своп.

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

Ограничения на использование дискового пространства.

# lxc config device set next-cloud-01 root size 200GB

Обратите внимание, что это работает только с типом хранилища ZFS или Btrfs.

Приоритет доступа к дисковой подсистеме

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

# lxc config set next-cloud-01 limits.disk.priority 0

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

Ограничения по скорости чтения/записи и IOPS-лимиты не применимы к контейнерам типа "каталог"!

Ограничение длины очереди ввода вывода на диск для контейнера (IOPS-лимиты)

Это наверное самый важный параметр из тех, что мы рассматривали и для его применения вам понадобится собранная при помощи Zabbix статистика с хост-системы.

# lxc config device set next-cloud-01 limits.read 15Iops
# lxc config device set next-cloud-01 limits.write 20Iops

Я рекомендую вам использовать именно IOPS-лимиты, а не скорость чтения-записи.

Ограничение по скорости чтения-записи на диск

Аналогично настройкам IOPS мы задаем лимиты на операции чтения и операции записи.

# lxc config device set next-cloud-01 limits.read 30MB
# lxc config device set next-cloud-01 limits.write 30MB

Сетевая подсистема

Со стороные подсистемы LXD вы можете ограничить только приоритет сетевых операций командой:

# lxc config set next-cloud-01 limits.network.priority 0