Setting up a kavoom host
Kavoom is a thin wrapper around the kvm binary. It provides a command line driven management interface to kvm without running any additional daemons. See the project page.
Table of contents
- The operating system
- Installing the software
- Preparing the network
- Some optional but recommended tweaks
The operating system
This manual assumes you run Debian GNU/Linux 11 “bullseye”. Instructions for installing the operating system are outside the scope of this document, but it is strongly recommended that you:
- use LVM (to store VM images as logical volumes);
- have enough space in /var/lib/kavoom to fit the memory of all your VMs (the size of your host's RAM should be sufficient).
Installing the software
Add the repositories as explained on the main kavoom page. Then:
apt-get install kavoom
Preparing the network
Make sure you're not logged in over the network (as we're going to reconfigure it) and:
ifdown eth0
Edit the file /etc/network/interfaces
and replace all occurrences of eth0
with br0
.
Add the following lines to the stanza:
bridge-ports eth0 bridge-fd 0 bridge-maxwait 0
The final result should look something like:
auto br0 iface br0 inet static bridge-ports eth0 bridge-fd 0 bridge-maxwait 0 address 192.0.2.2/24 gateway 192.0.2.1
Now bring the network up again:
ifup br0
And you're done! You now have a fully functional VM host. You could read the user manual to set up your first VM.
Some optional but recommended tweaks
Hugepages
Hugepages are a more efficient way to manage memory. If your host is a dedicated VM host, you can reserve a chunk of memory for use as hugepages. Kavoom will automatically pick this up and will tell KVM to allocate its memory from that chunk.
Hugepages on x86_64 are 2MiB in size, and you need some space for the OS itself. On a dedicated server with 16GiB that means 7500 is probably a reasonable number of hugepages.
Do the math for your own system and add hugepages=7500
to GRUB_CMDLINE_LINUX_DEFAULT
in /etc/default/grub
.
Then run:
update-grub sysctl -w vm.nr_hugepages=7500
However, that last command is likely to fail if your server has been up and running for a while (due to fragmentation). In that case rebooting is the only sure way to effect the desired number of hugepages.
Systems without /dev/hugepages
If your system does not mount hugetlbfs
by default (check the output of mount
if you don't know), you'll have to mount it yourself.
Add this line to your /etc/fstab
:
hugepages /dev/hugepages hugetlbfs defaults
Then run these commands:
mkdir /dev/hugepages /lib/udev/devices/hugepages mount /dev/hugepages
Using control groups
Control groups (abbreviated as cgroups) are a fairer way to distribute various resources over VMs.
For example, it prevents one VM from hogging the CPU by creating a large number of threads.
To use control groups with kavoom, create a file /etc/kavoom/wrapper
:
#! /bin/sh set -e for cg in blkio cpu,cpuacct net_cls,net_prio do group=/sys/fs/cgroup/$cg/kavoom/vm_$kavoom_name mkdir -p "$group" echo $$ >"$group/cgroup.procs" done exec kvm "$@"
This puts every VM in its own control group when it starts.
To make this script active, append the following line to /etc/kavoom.cfg
:
kvm = /etc/kavoom/wrapper
VirtIO
VirtIO is a type of virtual hardware that is optimized for virtual machines.
Simply add this to /etc/kavoom.cfg
to use this feature for all VMs:
virtio = yes
EFI
EFI is the modern way to boot computers.
Simply add this to /etc/kavoom.cfg
to use EFI for all VMs:
platform = efi
You may need to install the ovmf
package.
4 KiB block sizes
Using larger I/O block sizes reduces the number of block I/O operations and usually improves performance.
Unfortunately GPT partition tables are specific to a block size, so changing it for an existing VM is tricky.
For a new VM called pikachu you can add this to /etc/kavoom/pikachu.cfg
:
block_size = 4096
If you are not afraid of affecting existing VMs and you want to enable this for all VMs, you could add it to /etc/kavoom.cfg
instead.
io_uring
Newer versions of qemu support a more efficient way of doing parallel async I/O, which may improve disk performance.
Simply add this to /etc/kavoom.cfg
to use this feature for all VMs:
aio = io_uring