Я запускаю gitlab runner и хочу, чтобы каждое задание помещалось в свою собственную контрольную группу.
Я могу установить для подпроцесса gitlab bash правильную контрольную группу, но его дочерние элементы не наследуют контрольную группу.
Вот как я это делаю:
$ /usr/bin/ps -opid,cgroup $PPID $$
ГРУППА ПИД
43547 11:blkio:/user.slice,9:устройства:/user.slice,7:pids:/user.slice,6:память:/user.slice,2:cpuacct,cpu:/user.slice,1: имя = systemd:/user.slice/user-988.slice/session-c2500.scope
43548 11:blkio:/user.slice,9:устройства:/user.slice,7:pids:/user.slice,6:память:/user.slice,2:cpuacct,cpu:/user.slice,1: имя = systemd:/user.slice/user-988.slice/session-c2500.scope
$ /usr/bin/sudo /usr/bin/env CGROUP_LOGLEVEL=DEBUG /usr/bin/cgclassify -g cpu,cpuacct:/gitlab-runner/$CI_CONCURRENT_PROJECT_ID --sticky $PPID $$
нашел процессор в rw,nosuid,nodev,noexec,relatime,cpuacct,cpu
Найден параметр cgroup rw,nosuid,nodev,noexec,relatime,cpuacct,cpu, count 0
...обрезанный...
Переместит pid 43547 в cgroup '/gitlab-runner/0'
Добавление процессора контроллера
Добавление контроллера cpuacct
Переместит pid 43548 в cgroup '/gitlab-runner/0'
Добавление процессора контроллера
Добавление контроллера cpuacct
$ /usr/bin/ps -opid,cgroup $PPID $$
ГРУППА ПИД
43547 11:blkio:/user.slice,9:устройства:/user.slice,7:pids:/user.slice,6:память:/user.slice,2:cpuacct,cpu:/gitlab-runner/0, 1: имя = systemd:/user.slice/user-988.slice/session-c2500.scope
43548 11:blkio:/user.slice,9:устройства:/user.slice,7:pids:/user.slice,6:память:/user.slice,2:cpuacct,cpu:/gitlab-runner/0, 1: имя = systemd:/user.slice/user-988.slice/session-c2500.scope
Запрос другого запуска, поиск процессов в cgroup:
$ ps -e -opid,comm,cgroup | grep gitlab-бегун/3
77554 ву 11:blkio:/user.slice,9:устройства:/user.slice,7:pids:/user.slice,6:память:/user.slice,2:cpuacct,cpu:/gitlab-runner/3 ,1:имя=systemd:/user.slice/user-988.slice/session-c2604.scope
77555 bash 11:blkio:/user.slice,9:устройства:/user.slice,7:pids:/user.slice,6:память:/user.slice,2:cpuacct,cpu:/gitlab-runner/3 ,1:имя=systemd:/user.slice/user-988.slice/session-c2604.scope
Глядя на своих детей...
$pstree -p 77554
su(77554)—bash(77555)—bash(77575)——python3.6(78199)— ârun-cypress-spl(78206)âââcoverage(80245)ââ¬ânode(91561)ââ¬âCypress (91796 ) ¬ Кипарис (91799) Кипарис (91990) ¬ {Кипарис} (91992)
â â â ââ{Кипарис}(91993)
Его дочерние элементы не входят в контрольную группу:
$ ps -opid,comm,cgroup 78206 | кот
ГРУППА ПИД-КОМАНД
78206 run-cypress-spl 78206 run-cypress-spl 11:blkio:/user.slice,9:устройства:/user.slice,7:pids:/user.slice,6:память:/user.slice,2: cpuacct,cpu:/user.slice,1:name=systemd:/user.slice/user-988.slice/session-c2604.scope
я также нашел https://stackoverflow.com/questions/50749408/how-systemd-tracks-fork-process-with-type-fork что подразумевает, что systemd может предотвратить наследование cgroup при разветвлении.
Это можно обойти?
CentOS7, systemd-219-78.el7_9.5.x86_64.
Обновление: если я понимаю это ответ, ответ может быть Delegate=true. Я не думаю, что это поддерживается в этой системе... Я попробую это дальше.
Обновление: я пробовал это, и никакой разницы не было обнаружено:
$ cat /etc/systemd/system/gitlab-runner.service.d/override.conf
[Оказание услуг]
Делегат=да
Обновление: это может быть альтернативный способ, которым я попробую следующее: https://unix.stackexchange.com/questions/490978/limit-cpu-and-memory-consumption-of-all-x-applications