J'ai un service (système de traitement par lots HTCondor), qui est démarré en tant qu'unité de service dans les tranches de cpu, cpuacct et mémoire cgroup (CentOS 7 @ 3.10.0-*).

Le service démarre des sous-processus (~~> batch jobs) pour lesquels il crée des sous-tranches, c'est-à-dire en subdivisant ses ressources parentes. Sans plus interférer, les processus démarrés sont dans les sous-tranches

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/[email protected]/tasks
  22 /sys/fs/cgroup/cpu,cpuacct/system.slice/condor.service/[email protected]/tasks
  22 /sys/fs/cgroup/cpu,cpuacct/system.slice/condor.service/[email protected]/tasks
  ...

et comme contre-vérification, les processus ont leurs groupes de contrôle correspondants également dans leurs informations de processus, par exemple,

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

AFAIS, systemd ne semble pas être au courant des sous-tranches car systemd-cgls affiche les processus directement sous le groupe de contrôle de l'unité parent

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

Désormais, lors de l'ajout d'une nouvelle unité, du rechargement des démons systemd et du démarrage de la nouvelle unité, tous les sous-groupes de travail disparaissent et leurs processus sont attachés au groupe de contrôle parent.

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

Mon hypothèse est que systemd n'est pas au courant des sous-tranches (devinant à partir de systemd-cgls), alors que du point de vue du noyau, ce sont des tranches de groupe de contrôle appropriées. Lors du démarrage de la nouvelle unité, systemd remarque l'écart par rapport à ses attentes et "nettoie".

Ce comportement peut-il être évité d'une manière ou d'une autre ?

answer

Il semble que l'amont ait résolu ce problème en spécifiant la Delegate=directive (commit 890186d82a - bien que spécifier un sous-ensemble de contrôleurs serait un peu plus élégant que simplement à mon humble avistrue ). Si cette mise à jour n'est pas propagée au package CentOS, vous pouvez l'appliquer localement avec la commande suivante :

systemctl set-property condor.service Delegate=true

Le problème était que, par défaut, systemd suppose que tous les sous-groupes/tranches sont gérés par lui-même et que tous les processus unitaires n'ont pas de contrôle propre.

Lors de l'activation de la délégation pour une unité, systemd n'essaiera pas de prendre le contrôle des sous-ressources de l'unité

[Service]
...
Delegate=true

(la section [Slice] peut aussi être la bonne section, mais apparemment la bonne section dépend de la version/noyau donc #YMMV)

notez que les groupes de contrôle/tranches affichés par systemd-cgls et systemd-cgtop diffèrent toujours et que seul systemd-cgtop affiche la "bonne" vue du noyau des groupes de contrôle tandis que systemd-cgls n'affiche aucune sous-hiérarchie de tranches, même avec délégation)