VFIO/start-win10

80 lines
2.4 KiB
Text
Raw Normal View History

2020-04-05 01:50:48 +00:00
#!/bin/bash
2020-09-25 01:33:09 +00:00
#
# script to create cpusets to isolate CPU threads for KVM/libvirt VMs
# requires 'cset'
2020-04-05 01:50:48 +00:00
# available on Fedora through my COPR:
# - https://copr.fedorainfracloud.org/coprs/jlay/cpuset/
2020-09-25 01:33:09 +00:00
# review comments below regarding CPUs and XML entries
#
2020-04-05 01:50:48 +00:00
# this script:
# - isolates host tasks from the VM CPUs
# - applies some generic tweaks
# - resets host isolation on VM shutdown
2020-09-25 01:33:09 +00:00
#
# 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:
2020-04-05 01:50:48 +00:00
# <vcpupin vcpu='0' cpuset='0'/>
2020-09-25 01:33:09 +00:00
# <vcpupin vcpu='1' cpuset='24'/>
# <vcpupin vcpu='2' cpuset='1'/>
# <vcpupin vcpu='3' cpuset='25'/>
# [...]
# <emulatorpin cpuset='10-11'/>
#
# 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
#
2020-04-05 01:50:48 +00:00
# reduce kernel jitter
sudo sysctl vm.stat_interval=120
sudo sysctl kernel.watchdog=0
2020-09-25 01:33:09 +00:00
# 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
2020-04-05 01:50:48 +00:00
sudo cset shield --reset --sysset=host.slice --userset=windows10.slice
sudo cset set -d windows10.slice
# shield cores
2020-09-25 01:33:09 +00:00
# userset slice must match the partition defined in libvirt xml, eg:
#
# </cputune>
# <resource>
# <partition>/windows10</partition>
# </resource>
# <os>
2020-04-05 01:50:48 +00:00
sudo cset shield -c $VM_CORES --sysset=host.slice --userset=windows10.slice
2020-09-25 01:33:09 +00:00
# setup looking glass
#sudo touch /dev/shm/looking-glass
#sudo chown jlay:kvm /dev/shm/looking-glass
#sudo chmod 660 /dev/shm/looking-glass
2020-04-05 01:50:48 +00:00
# start the VM
2020-09-25 01:33:09 +00:00
virsh start windows10
2020-04-05 01:50:48 +00:00
# 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