diff --git a/README.md b/README.md index c0363ef..8dd87ac 100644 --- a/README.md +++ b/README.md @@ -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 +```