From d20fb866de5bac450002eb7a8495449055b1ca06 Mon Sep 17 00:00:00 2001 From: Josh Lay Date: Sat, 4 Apr 2020 20:50:48 -0500 Subject: [PATCH] add VM start/CPU isolation script --- start-win10 | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 start-win10 diff --git a/start-win10 b/start-win10 new file mode 100755 index 0000000..0fde060 --- /dev/null +++ b/start-win10 @@ -0,0 +1,65 @@ +#!/bin/bash +# requires `cset` +# available on Fedora through my COPR: +# - https://copr.fedorainfracloud.org/coprs/jlay/cpuset/ +# review notes regarding XML entries + +# this script: +# - isolates host tasks from the VM CPUs +# - applies some generic tweaks +# - resets host isolation on VM shutdown + +# Set the range of cores assigned to the windows VM +# on an i9-7920x this is the first 8 cores and the corresponding hyperthreads +VM_CORES='0-7,12-19' + +# based on the assignments of pinned CPUs in libvirt XML, eg: +# +# +# [...] +# +# +# +# `lscpu -e` and `virsh capabilities` are helpful for determining valid pinning settings +# on example system (i9 7920x), vCPUs 0-15 are pinned (alternating between) cores 0-7 and hyperthreads 12-19 + +# reduce kernel jitter +sudo sysctl vm.stat_interval=120 +sudo sysctl kernel.watchdog=0 + +# isolate VM CPUs from host tasks +# VM must have the partition cset uses w/ userset below defined in libvirt XML, eg: +# +# ... reference line +# +# /windows10 +# +# ... reference line + +# first, attempt to reset shielding. we want to recreate conflicting names with set params +sudo cset shield --reset --sysset=host.slice --userset=windows10.slice +sudo cset set -d windows10.slice + +# shield cores +sudo cset shield -c $VM_CORES --sysset=host.slice --userset=windows10.slice + +# start the VM +sudo virsh start windows10 + +# set higher priority +QEMU_PID=$(sudo ps fauxww | awk '$0 ~ /qemu.*windows1[0]/ {print $2}') +sudo renice -20 -p ${QEMU_PID} +sudo chrt -f -p 99 ${QEMU_PID} + +echo "Waiting for windows10 VM to stop before resetting cpusets" +while true; do + # chill a bit + sleep 10 + # get vm state, check if it's off + VM_STATE=$(sudo virsh dominfo windows10 | awk '$1 ~ /State/ {print $NF}') + if [ "$VM_STATE" == 'off' ]; then + echo -e "windows10 VM shut down, setting cpusets back to normal\n" + sudo cset shield --reset --sysset=host.slice --userset=windows10.slice + exit 0 + fi +done