Skip to content

Latest commit

 

History

History
118 lines (77 loc) · 10.2 KB

move_process_to_cgroup.md

File metadata and controls

118 lines (77 loc) · 10.2 KB

Перенос процесса в контрольную группу

Источник: Moving a Process to a Control Group

Чтобы перенести процесс в контрольную группу, выполните команду cgclassify. Например:

cgclassify -g cpu,memory:group1 1701

Синтаксис команды cgclassify:

cgclassify -g subsystems:path_to_cgroup pidlist

Где:

  • subsystems — список подсистем, разделённых запятыми, или *, если процесс нужно запустить в иерархиях, связанных со всеми доступными подсистемами. Если контрольные группы с одинаковыми именами существуют в нескольких иерархиях, параметр -g переместит процессы в каждую из этих групп. Убедитесь, что контрольная группа существует в каждой иерархии, подсистема которой указана в этой команде.
  • path_to_cgroup — путь к контрольной группе внутри её иерархий.
  • pidlist — список идентификаторов процессов (PID), разделённых пробелами.

Если параметр -g не указан, cgclassify автоматически просматривает файл /etc/cgrules.conf (см. раздел «Служба cgred») и использует первую подходящую строку конфигурации. По этой строке cgclassify определяет иерархии и контрольные группы, в которые нужно переместить процесс. Для успешного переноса целевые иерархии должны существовать. Подсистемы, указанные в /etc/cgrules.conf, также должны быть правильно настроены для соответствующих иерархий в /etc/cgconfig.conf.

Параметр --sticky можно указать перед pidlist, чтобы все дочерние процессы оставались в той же контрольной группе. Если этот параметр не задан и служба cgred запущена, дочерние процессы распределяются по контрольным группам на основании настроек из /etc/cgrules.conf. Родительский процесс при этом остаётся в контрольной группе, в которой он был первоначально запущен.

С помощью cgclassify можно одновременно переместить несколько процессов. Например, следующая команда перемещает процессы с PID 1701 и 1138 в контрольную группу group1/:

cgclassify -g cpu,memory:group1 1701 1138

Обратите внимание: переносимые PID разделяются пробелами, а указанные группы должны находиться в разных иерархиях.

Альтернативный способ

Чтобы переместить процесс в контрольную группу напрямую, запишите его PID в файл tasks этой группы. Например, чтобы переместить процесс с PID 1701 в контрольную группу /cgroup/cpu_and_mem/group1/, выполните:

echo 1701 > /cgroup/cpu_and_mem/group1/tasks

Служба cgred

Cgred — это служба, запускающая cgrulesengd и перемещающая задачи в контрольные группы в соответствии с параметрами из файла /etc/cgrules.conf. Записи в /etc/cgrules.conf могут иметь одну из двух форм:

user subsystems control\group

user:command subsystems control\group

Замените user именем пользователя или именем группы с префиксом @. Вместо subsystems укажите список имён подсистем, разделённых запятыми. control_group обозначает путь к контрольной группе, а command — имя процесса или полный путь к команде процесса.

Например:

maria			devices		/usergroup/staff

Эта запись указывает, что все процессы пользователя maria получают доступ к подсистеме devices в соответствии с параметрами контрольной группы /usergroup/staff. Чтобы связать определённые команды с определёнными контрольными группами, добавьте параметр command:

maria:ftp		devices		/usergroup/staff/ftp

Теперь эта запись указывает, что, когда пользователь maria выполняет команду ftp, процесс автоматически перемещается в контрольную группу /usergroup/staff/ftp иерархии, содержащей подсистему devices. Однако демон перемещает процесс в контрольную группу только после выполнения соответствующего условия. Поэтому процесс ftp может некоторое время работать не в той группе. Кроме того, если за это время процесс быстро создаст дочерние процессы, они могут не быть перемещены.

В записях файла /etc/cgrules.conf можно использовать следующие дополнительные обозначения:

  • @ — обозначает группу вместо отдельного пользователя. Например, @admins означает всех пользователей группы admins.
  • * — означает «все». Например, * в поле subsystem обозначает все смонтированные подсистемы.
  • % — обозначает тот же элемент, что и в строке выше.

Например, записи в /etc/cgrules.conf могут выглядеть так:

@adminstaff		devices		/admingroup
@labstaff		%		%

Эта конфигурация гарантирует, что процессы пользователей из групп adminstaff и labstaff получают доступ к подсистеме devices в соответствии с ограничениями контрольной группы admingroup.

Правила из /etc/cgrules.conf можно связать с шаблонами, настроенными в файле /etc/cgconfig.conf или в конфигурационных файлах каталога /etc/cgconfig.d/. Это позволяет гибко назначать и создавать контрольные группы.

Например, добавьте в /etc/cgconfig.conf следующий шаблон:

template users/%g/%u {
	 cpuacct{
	 }
	 
	 cpu {
			cpu.shares = "1000";
	 }
}

Затем используйте шаблон users/%g/%u в третьем поле записи /etc/cgrules.conf:

peter:ftp		cpu		users/%g/%u

Переменные %g и %u автоматически заменяются именами группы и пользователя, которым принадлежит процесс ftp. Если процесс принадлежит пользователю peter из группы adminstaff, приведённый выше путь преобразуется в users/adminstaff/peter. Затем служба cgred ищет этот каталог и, если он не существует, создаёт его и назначает процесс файлу users/adminstaff/peter/tasks. Правила шаблонов применяются только к определениям template в конфигурационных файлах. Поэтому, даже если в /etc/cgconfig.conf определена группа group users/adminstaff/peter, она будет проигнорирована в пользу шаблона template users/%g/%u.

В путях к контрольным группам внутри шаблонов можно использовать и другие переменные:

  • %u — заменяется именем пользователя, которому принадлежит текущий процесс. Если определить имя не удаётся, используется UID.
  • %U — заменяется UID пользователя, которому принадлежит текущий процесс.
  • %g — заменяется именем группы пользователя, которому принадлежит текущий процесс. Если определить имя не удаётся, используется GID.
  • %G — заменяется GID группы, которой принадлежит текущий процесс.
  • %p — заменяется именем текущего процесса. Если определить имя не удаётся, используется PID.
  • %P — заменяется PID текущего процесса.

cgroups