libvirt hook: CPUs isolieren

This commit is contained in:
Paul Schulze 2024-11-29 16:38:35 +01:00
parent 83fc46f000
commit 2e318faa5b

View File

@ -9,7 +9,7 @@
- `vfio-pci.ids=10de:2684,10de:22ba`: Guest GPU PCI IDs "rausnehmen", dass der kernel
damit nichts macht (GPU und HDMI Audio im Beispiel). Find ich bei mir via `lspci -nn | grep NVIDIA`.
- obsolet: `isolcpus=0-7,16-23`: CPUs für Guest vom System isolieren.
Kann man mittlerweile zur Laufzeit via cgroups machen.
Kann man mittlerweile zur Laufzeit via cgroups machen. Siehe `CPUs isolieren bei VM Start`
- even obsoleter: `nohz_full=0-7,16-23`: Siehe isolcpus. Bei Interesse docs auf kernel.org lesen. Aber total obsolet.
- `video=efifb:off`: Ich hatte Probleme, weil selbst mit vfio der efifb noch irgendwie die NVIDIA "gegrabt" hat, deshalb efifb:off.
- `module_blacklist=nvidia`: Ich hab bei mir den NVIDIA Treiber UND den AMD Treiber auf dem Host
@ -122,3 +122,47 @@ Bei meiner CPU haben die Cores 0-7 die virtuellen Cores 0-7 und 16-23 und die Co
Außerdem ist mit `lstopo` erkennbar, dass die Cores 0-7 mit dem ersten L3 Cache verbunden sind, und die Cores 8-15 mit dem Zweiten.
Es ist ratsam für die Performance, dass sich die VM Cores und die Host Cores keinen Cache teilen, also in meinem Fall alle virtuellen
Cores der Cores 0-7 durchzureichen, sprich 0-7,16-23. Siehe XML File.
## CPUs isolieren bei VM Start
```bash
$ cat /etc/libvirt/hooks/qemu
#!/usr/bin/bash
__systemctl_set_cpu_isolation_properties__() {
local prop="$1"
systemctl set-property --runtime -- "pfs-rust-compile.slice" "$prop"
systemctl set-property --runtime -- "user.slice" "$prop"
systemctl set-property --runtime -- "system.slice" "$prop"
systemctl set-property --runtime -- "init.scope" "$prop"
}
vmisolatecpus() {
__systemctl_set_cpu_isolation_properties__ "AllowedCPUs=8-15,24-31"
}
vmfreecpus() {
__systemctl_set_cpu_isolation_properties__ "AllowedCPUs=0-31"
}
VM_NAME="$1"
VM_ACTION="${2} ${3}"
LOG_FILE="/home/pfs/shm/libvirt_hook.log"
if [[ "$VM_NAME" == "win11new" ]]; then
if [[ "$VM_ACTION" == "started begin" ]]; then
echo "[$(date "+%Y-%m-%d %H:%M:%S")] hook triggered: $* -> isolating CPUs 8-15,24-31" >> "$LOG_FILE"
vmisolatecpus
elif [[ "$VM_ACTION" == "release end" ]]; then
echo "[$(date "+%Y-%m-%d %H:%M:%S")] hook triggered: $* -> freeing all CPUs" >> "$LOG_FILE"
vmfreecpus
else
echo "[$(date "+%Y-%m-%d %H:%M:%S")] hook ignored: $*" >> "$LOG_FILE"
fi
fi
```