В 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
здесь.
Джошуа Бонифаций