Назад | Перейти на главную страницу

systemd удаляет подгруппы, созданные другими сервисами

У меня есть служба (пакетная система HTCondor), которая запускается как служебная единица в сегментах cpu, cpuacct и памяти cgroup (CentOS 7 @ 3.10.0- *).

Служба запускает подпроцессы (~~> пакетные задания), для которых создает суб-срезы, то есть разделяя свои родительские ресурсы. Без дальнейшего вмешательства, запущенные процессы находятся в суб-срезах

wc -l /sys/fs/cgroup/cpu,cpuacct/system.slice/condor.service/tasks
  19
wc -l /sys/fs/cgroup/cpu,cpuacct/system.slice/condor.service/*/tasks
  29 /sys/fs/cgroup/cpu,cpuacct/system.slice/condor.service/condor_var_lib_condor_execute_slot1_2@batch0311.desy.de/tasks
  22 /sys/fs/cgroup/cpu,cpuacct/system.slice/condor.service/condor_var_lib_condor_execute_slot1_3@batch0311.desy.de/tasks
  22 /sys/fs/cgroup/cpu,cpuacct/system.slice/condor.service/condor_var_lib_condor_execute_slot1_4@batch0311.desy.de/tasks
  ...

и в качестве перекрестной проверки у процессов есть соответствующие контрольные группы также в их информации о процессе, например,

cat /proc/58683/cgroup 
  11:perf_event:/
  10:memory:/system.slice/condor.service/condor_var_lib_condor_execute_slot1_6@batch0311.desy.de
  9:devices:/system.slice
  8:blkio:/system.slice/condor.service     /condor_var_lib_condor_execute_slot1_6@batch0311.desy.de
  7:cpuset:/
  6:freezer:/system.slice/condor.service/condor_var_lib_condor_execute_slot1_6@batch0311.desy.de
  5:hugetlb:/
  4:cpuacct,cpu:/system.slice/condor.service/condor_var_lib_condor_execute_slot1_6@batch0311.desy.de
  3:pids:/system.slice/condor.service
  2:net_prio,net_cls:/
  1:name=systemd:/system.slice/condor.service

AFAIS, systemd, похоже, не знает о суб-срезах, поскольку systemd-cgls показывает процессы непосредственно под cgroup родительского модуля

systemd-cgls
   ...
   ├─condor.service
   │ ├─  781 /bin/bash ...foo...
   │ ├─ 1596 condor_starter -f -a slot1_4 ...baz...

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

wc -l /sys/fs/cgroup/cpu,cpuacct/system.slice/condor.service/tasks
  337 /sys/fs/cgroup/cpu,cpuacct/system.slice/condor.service/tasks

Я предполагаю, что systemd не знает о суб-срезах (предположение из systemd-cgls), в то время как с точки зрения ядра это правильные срезы cgroup. При запуске нового модуля systemd замечает расхождение со своими ожиданиями и «убирает».

Можно ли как-то избежать такого поведения?

Проблема заключалась в том, что по умолчанию systemd предполагает, что все подгруппы / срезы обрабатываются самостоятельно и что любые единичные процессы не имеют собственного контроля.

При включении делегирования для юнита systemd не будет пытаться взять под контроль подресурсы юнита.

[Service]
...
Delegate=true

(раздел [Slice] также может быть правильным разделом, но, очевидно, правильный раздел зависит от выпуска / ядра, поэтому #YMMV)

обратите внимание, что cgroups / срезы, показываемые systemd-cgls и systemd-cgtop, по-прежнему различаются, и только systemd-cgtop показывает «правильное »Ä ядровое представление cgroups, в то время как systemd-cgls не показывает никакой подиерархии срезов даже с делегированием)

Похоже на апстрим, так как исправил это, указав Delegate= директива (зафиксировать 890186d82a - хотя указание подмножества контроллеров было бы немного более элегантным, чем просто true ПО МОЕМУ МНЕНИЮ). Если это обновление не распространяется на пакет CentOS, вы можете применить его локально с помощью следующей команды:

systemctl set-property condor.service Delegate=true