Управлять рядом ограничений для выбранных множеств процессов в системах на основе ядра 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 
# 

См. также

править

Примечания

править
  1. Cgroups(англ.) Linux Kernel Documentation Проверено 2014-09-13 г.
  2. Memory Resource Controller(англ.) Linux Kernel Documentation Проверено 2014-09-13 г.