Автоматически назначать слайс systemd для определенного cset

В Debian под systemd виртуальные машины KVM под libvirt по умолчанию назначаются срезу «machine.slice».

Если я затем добавлю процессор для этого фрагмента с помощью cset и некоторый пользовательский набор процессоров и запустить виртуальную машину, виртуальная машина добавляется к соответствующему набору процессоров, т.е.

user@host ~ $ sudo cset set --list --recurse
cset: 
         Name       CPUs-X    MEMs-X Tasks Subs Path
 ------------ ---------- - ------- - ----- ---- ----------
         root       0-31 y       0 y   610    1 /
 machine.slice 2-15,18-31 n       0 n     0    1 /machine.slice
 machine-qemu\x2d1\x2dweb1.scope 2-15,18-31 n       0 n     0    5 /ma....scope
        vcpu1 2-15,18-31 n       0 n     1    0 /machine.sli...web1.scope/vcpu1
        vcpu2 2-15,18-31 n       0 n     1    0 /machine.sli...web1.scope/vcpu2
        vcpu0 2-15,18-31 n       0 n     1    0 /machine.sli...web1.scope/vcpu0
     emulator 2-15,18-31 n       0 n    82    0 /machine.sli...1.scope/emulator
        vcpu3 2-15,18-31 n       0 n     1    0 /machine.sli...web1.scope/vcpu3

Что я пытаюсь сделать, так это воспроизвести это поведение с помощью отдельного фрагмента и набора процессоров. Однако, похоже, это не работает.

Сначала я создаю cset:

user@host ~ $ sudo cset set -c 0-1,16-17 osd.slice
cset: --> created cpuset "osd.slice"

Затем я устанавливаю службу, которую я хочу использовать для среза:

user@host ~ $ diff -u /lib/systemd/system/ceph-osd@.service /etc/systemd/system/ceph-osd@.service
--- /lib/systemd/system/ceph-osd@.service       2021-05-27 06:04:21.000000000 -0400
+++ /etc/systemd/system/ceph-osd@.service       2022-11-08 17:20:32.515087642 -0500
@@ -6,6 +6,7 @@
 Wants=network-online.target local-fs.target time-sync.target remote-fs-pre.target ceph-osd.target
 
 [Service]
+Slice=osd.slice
 LimitNOFILE=1048576
 LimitNPROC=1048576
 EnvironmentFile=-/etc/default/ceph

Затем я запускаю одну из служб. Если я проверю статус службы, я увижу, что она находится в правильном слайсе/cgroup:

user@host ~ $ systemctl status ceph-osd@0.service
● ceph-osd@0.service - Ceph object storage daemon osd.0
     Loaded: loaded (/etc/systemd/system/ceph-osd@.service; disabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-11-08 17:22:32 EST; 1s ago
    Process: 251238 ExecStartPre=/usr/lib/ceph/ceph-osd-prestart.sh --cluster ${CLUSTER} --id 0 (code=exited, status=0/SUCCESS)
   Main PID: 251245 (ceph-osd)
      Tasks: 25
     Memory: 29.5M
        CPU: 611ms
     CGroup: /osd.slice/ceph-osd@0.service
             └─251245 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph

И просто для здравомыслия, если я проверю временную службу VM, она выглядит в основном так же:

$ systemctl status machine-qemu\\x2d1\\x2dweb1.scope 
● machine-qemu\x2d1\x2dweb1.scope - Virtual Machine qemu-1-web1
     Loaded: loaded (/run/systemd/transient/machine-qemu\x2d1\x2dweb1.scope; transient)
  Transient: yes
     Active: active (running) since Tue 2022-11-08 17:03:57 EST; 22min ago
      Tasks: 87 (limit: 16384)
     Memory: 1.7G
        CPU: 4min 33.514s
     CGroup: /machine.slice/machine-qemu\x2d1\x2dweb1.scope
             └─234638 /usr/bin/kvm -name guest=web1,debug-threads=on -S -object secret,id=masterKey0,format=raw,file=/var/lib/libvirt/qemu/domain-1-web1/master-key.aes -machine pc-i440fx-2.7,accel=kvm,usb=off,dump-guest-core=off,memory-ba>

Однако и вот где я застрял: если я тогда проверю cset опять «задачи» нет назначенный набору фрагментов, как я и ожидал; они являются частью root cset вместо этого, а срез cset имеет 0 задач и 0 подпрограмм:

user@host ~ $ sudo cset set --list --recurse
cset: 
         Name       CPUs-X    MEMs-X Tasks Subs Path
 ------------ ---------- - ------- - ----- ---- ----------
         root       0-31 y       0 y   622    2 /
    osd.slice  0-1,16-17 n       0 n     0    0 /osd.slice

Я не вижу ничего очевидного в том, как machine.slice делает это, нет ссылки на это в фактическом machine.slice модульный файл, ни что-либо в переходном scope единицы.

Как я могу получить этот новый пользовательский фрагмент/cgroup для эмуляции того, что machine.slice делает, и принудительно вставляет что-либо под ним в этот процессор?

В качестве дополнения к «почему»/X-to-my-Y, я попытался сделать что-то вроде создания ceph-osd процесс в cset вручную с помощью cset proc --exec команда, но это работает ненадежно (иногда она просто полностью выходит из строя с «не может двигаться»), и даже если она работает, ее потоки впоследствии застревают в корневом cset, даже если основной процесс перемещается. Похоже, мне нужен способ заставить systemd рассматривать всю единицу как часть cset до того, как начнется фактический процесс (в отличие от cset proc команда, которая порождает его, разветвляет, а затем изменяет), что похоже на то, что делается с помощью machine.slice здесь.

Джошуа Бонифаций

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *