diff --git a/start-win10 b/start-win10 index 0fde060..274e894 100755 --- a/start-win10 +++ b/start-win10 @@ -1,50 +1,64 @@ #!/bin/bash -# requires `cset` +# +# script to create cpusets to isolate CPU threads for KVM/libvirt VMs +# requires 'cset' # available on Fedora through my COPR: # - https://copr.fedorainfracloud.org/coprs/jlay/cpuset/ -# review notes regarding XML entries - +# review comments below regarding CPUs and 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: +# +# define the CPUs (cores/threads) to isolate for the VM +VM_CORES='0-11,24-35' +# Tip: refer to 'virsh capabilities | grep siblings' +# this will show CPU topology information for the host +# allows one to pick optimal layout for the VM +# +# the pinned CPUs are definend like so in the VM libvirt XML: # -# -# [...] -# -# -# -# `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 - +# +# +# +# [...] +# +# +# NOTE: the pinned emulator CPUs must be included in VM_CORES +# probably any iothreads too +# +# example above is based on a threadripper 3960x: +# - one NUMA node +# - SMT enabled +# # 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 +# attempt to reset shielding, we want to create it with current params +# and remove any existing slices from previous VM boots +# we want it to be created with current params, such as possibly-changed pinned CPUs sudo cset shield --reset --sysset=host.slice --userset=windows10.slice sudo cset set -d windows10.slice # shield cores +# userset slice must match the partition defined in libvirt xml, eg: +# +# +# +# /windows10 +# +# sudo cset shield -c $VM_CORES --sysset=host.slice --userset=windows10.slice +# setup looking glass +#sudo touch /dev/shm/looking-glass +#sudo chown jlay:kvm /dev/shm/looking-glass +#sudo chmod 660 /dev/shm/looking-glass + # start the VM -sudo virsh start windows10 +virsh start windows10 # set higher priority QEMU_PID=$(sudo ps fauxww | awk '$0 ~ /qemu.*windows1[0]/ {print $2}')