KVM convert qcow2 disk images to raw disk images for performance

Table of Contents

This tutorial shows you how to convert KVM qcow2 disk images to raw disk images. The qcow2 disk format has some decent features like encryption, compression and copy to write support. However, the compression and the copy processes make it quite a bit slower than raw disk images. Sometimes you want to convert the disk images so that the VM will perform better.

Benchmark

For me it has a performance boost. Using a RAID 1 setup with two 5900 RPM disks and the deadline on the host and the noop scheduler without caching on a raw image in the guest resulted in a boost over the default deadline scheduler on a qcow2 image on the guest:

Test command:

dd if=/dev/zero of=test bs=64k count=16k conv=fdatasync

Default Ubuntu 12.04 vmbuilder created vm on a qcow2 image without caching and with the deadline scheduler in the VM:

1073741824 bytes (1.1 GB) copied, 658.396 s, 1.6 MB/s

The same VM, disk image converted to raw image without caching and using the noop scheduler in the VM:

1073741824 bytes (1.1 GB) copied, 13.646 s, 78.7 MB/s

That's quite a performance boost. The KVM host has the following result with the dd command:

1073741824 bytes (1.1 GB) copied, 10.4034 s, 103 MB/s

Converting the image

I'll convert the disk image for the example vm vm1. Change the name and disk paths for your setup.

First shut down the VM:

virsh shutdown vm1

Then convert all the disk images using this command for each disk image:

Disk scheduler

To change the default disk scheduler in your VM, you can use the following command:

echo $scheduler > /sys/block/$device/queue/scheduler

To check the current scheduler:

cat /sys/block/sda/queue/scheduler

Output:

noop [deadline] cfq

Here the deadline scheduler is being used. To change it:

echo noop > /sys/block/sda/queue/scheduler

Now the noop scheduler is being used:

cat /sys/block/sda/queue/scheduler
[noop] deadline cfq

Remember to add this command to /etc/rc.local to make it survive a reboot. On ubuntu you can also define it in /etc/default/grub. Change GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" to GRUB_CMDLINE_LINUX_DEFAULT="quiet splash elevator=noop" and run an update-grub2 to make it permanent