Fast Virtio VM
This page explains a way to build a blazing fast Gentoo VM under KVM using Virtio and mdev.
Contents |
Steps
Use a fast computer!
No really, this is probably the most important thing of all, don't expect a 2 second booting VM if you are on a P3 with a slow IDE disk. This tutorial is Build on a CentOS 6.2 KVM HypverVisor on a Dual QuadCore Xeon 2.4Ghz with 8 (v)CPU's and 2GB RAM assigned to the VM. The disk file is on an SSD (Old Intel x25-M 80GB, so their is more to gain if you use a faster SSD).
Use EXT2
It has the fastest mount time.
Kernel
Compile your kernel with:
- VirtIO support
- Hugetlb support
- NO usb support (Unless you plan to passthrough USB from the host).
- NO HID support (see above).
- NO extended video/device drivers/filesystem drivers you don't use. (duh)
- NO fuse support (Slow...)
- NO modules (Slower...)
Kernel boot options
noapic (APIC is for hardware management, and since we are in VM and the hardware is managed by our host, we don't need it). notsc (TSC is CPU clock synchronization, not needed in a VM). Because they cannot be removed from the kernel itself, no need these as kernel boot options.
Use a Static IP
DHCP is f* slow.
Use mdev
Replace udev with mdev (BusyBox), udev is dead slow vs mdev.
Configure mdev
Remove useless mdev devices (tun,tap, all sound, hd*, sd*, fd*, md*, grsec(*), zap, dvb, v4l stuff)
Prelink
Prelink all binaries, (emerge prelink -> prelink -amRf)
OpenRC
use rc-update to delete all non-essential daemons(git, consolefont,devfs,keymaps,modules,sysfs,swclock,staticroute)
TMPFS
Use tmpfs for /tmp and /var/run (will not necesarrily speedup boot, but if you have startup services that use /tmp heavilly, it might help)
Results
I created my own boottime init script, which echoes the current kernel uptime. Please keep in mind that all of this is without *any* dirty tricks like initrd or initramfs. It's just static sequential boot. Even using parallel start of services (thru RC_PARALLEL="yes") would slow down the system.