Настольная книга по Linux/Cgroups
Управлять рядом ограничений для выбранных множеств процессов в системах на основе ядра Linux можно используя средства Cgroups — групп управления (англ. control groups.) В данном разделе мы рассмотрим примеры команд, позволяющих осуществить такое управление.
Подключение управляющего интерфейса
правитьДля управления Cgroups используется «виртуальная» файловая система (ФС) с идентификатором типа cgroup
, подключаемая, как правило,[1] к директориям иерархии /sys/fs/cgroup
. Каждое такое подключение соответствует отдельной и независимой иерархии групп управления.
Проверить наличие активных иерархий можно следующей командой:
$ grep -E -- \\\<cgroup\\\> < /proc/mounts cgroup /sys/fs/cgroup tmpfs rw,relatime 0 0 rg42 /sys/fs/cgroup/rg42 cgroup rw,relatime,memory 0 0 $
В данном примере, в системе активна единственная иерархия, управляемая через файлы директории /sys/fs/cgroup/rg42
, и позволяющая ограничивать использование памяти процессами, — на что указывает параметр memory
.[2]
Создать такую иерархию можно командами mkdir
и mount
, подобно:
# mkdir -- /sys/fs/cgroup/rg42 # mount -t cgroup -o memory -- rg42 /sys/fs/cgroup/rg42 #
(При необходимости управлять или учитывать использование также и других ресурсов в рамках данной иерархии, после -o
следует перечислить все соответствующие подсистемы, например: -o blkio,cpuacct,memory
.)
Перед этим, однако, следует удостовериться в наличии директории /sys/fs/cgroup
и, при необходимости, создать ее, подобно:
# mount -t tmpfs -o size=64M -- cgroup /sys/fs/cgroup #
Отметим, что использование Cgroups для ограничения используемой памяти предполагает некоторые накладные расходы независимо от фактического использования данной функции. Чтобы их избежать, поддержка подсистемы memory
по-умолчанию отключена; ее включение требует явного указания параметра cgroup_enable=memory
в командной строке ядра. (Для изменения последней, в свою очередь, необходима перезагрузка системы.)
Информацию о поддерживаемых используемой сборкой ядра и доступных непосредственно в текущий момент параметрах Cgroups можно найти в файле /proc/cgroups
. Для решаемой задачи, в поле enabled
для подсистемы memory
должно присутствовать ненулевое значение.
Напомним также, что копия действующей командной строки ядра отражается в файл /proc/cmdline
(должен присутствовать параметр cgroup_enable=memory
); поддерживаемые типы ФС перечислены в файле /proc/filesystems
(должен присутствовать тип cgroup
.)
Перемещение процессов между группами
править«Корень» созданной иерархии /sys/fs/cgroup/rg42
включает все процессы системы. Для того, чтобы установить ограничения только для конкретных процессов, следует создать для них отдельную группу в иерархии, подобно:
# mkdir -- /sys/fs/cgroup/rg42/lim1 #
Перенести выбранные процессы в эту группу можно просто записав их идентификаторы (pid) в файл tasks
созданной директории:
# printf %s\\n 4919 8192 > /sys/fs/cgroup/rg42/lim1/tasks #
«Возвращение» процессов в «корневую» группу (и, тем самым, — снятие ограничений) выполняется совершенно аналогично:
# printf %s\\n 8192 9320 > /sys/fs/cgroup/rg42/tasks #
Список групп, к которым отнесен данный процесс в настоящий момент (каждая иерархия позволяет отнести процесс к одной и только одной группе), можно найти в файле cgroup
директории процесса:
$ cat < /proc/4919/cgroup 1:rg42:/lim1 $
Ограничение памяти
правитьОграничения памяти для группы определяются содержимым файлов limit_in_bytes
и soft_limit_in_bytes
— для оперативной памяти, и memory.memsw.limit_in_bytes
— для полного объема виртуальной памяти. Получить эти ограничения можно подобно:
$ head -- /sys/fs/cgroup/rg42/lim1/memory.*limit*
Установить (условное ограничение — 1 GiB; жесткое — 1.5 GiB):
# printf %s\\n $((1024 * 1024 * 1024)) \ > /sys/fs/cgroup/rg42/lim1/soft_limit_in_bytes # printf %s\\n $((1536 * 1024 * 1024)) \ > /sys/fs/cgroup/rg42/lim1/limit_in_bytes #
См. также
править- Раздел Процессы.
- Resource Management Guide(англ.) Fedora 17 Проверено 2015-05-22 г.
- Страницы руководства:
Примечания
править- ↑ Cgroups(англ.) Linux Kernel Documentation Проверено 2014-09-13 г.
- ↑ Memory Resource Controller(англ.) Linux Kernel Documentation Проверено 2014-09-13 г.