add VM start/CPU isolation script
This commit is contained in:
parent
c149c554e7
commit
d20fb866de
1 changed files with 65 additions and 0 deletions
65
start-win10
Executable file
65
start-win10
Executable file
|
@ -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:
|
||||
# <vcpupin vcpu='0' cpuset='0'/>
|
||||
# <vcpupin vcpu='1' cpuset='12'/>
|
||||
# [...]
|
||||
# <vcpupin vcpu='14' cpuset='7'/>
|
||||
# <vcpupin vcpu='15' cpuset='19'/>
|
||||
#
|
||||
# `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:
|
||||
#
|
||||
# </cputune> ... reference line
|
||||
# <resource>
|
||||
# <partition>/windows10</partition>
|
||||
# </resource>
|
||||
# <os> ... 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
|
Loading…
Reference in a new issue