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 - `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`. 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. - 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. - 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. - `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 - `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. 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 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. 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
```