Raymii.org
Quis custodiet ipsos custodes?Home | About | All pages | Cluster Status | RSS Feed
KVM convert qcow2 disk images to raw disk images for performance
Published: 16-02-2014 | Author: Remy van Elst | Text only version of this article
❗ This post is over ten years old. It may no longer be up to date. Opinions may have changed.
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.
Recently I removed all Google Ads from this site due to their invasive tracking, as well as Google Analytics. Please, if you found this content useful, consider a small donation using any of the options below:
I'm developing an open source monitoring app called Leaf Node Monitoring, for windows, linux & android. Go check it out!
Consider sponsoring me on Github. It means the world to me if you show your appreciation and you'll help pay the server costs.
You can also sponsor me by getting a Digital Ocean VPS. With this referral link you'll get $200 credit for 60 days. Spend $25 after your credit expires and I'll get $25!
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:
qemu-img convert /var/lib/libvirt/images/vm1/ubuntu-kvm/tmp20ePgc.qcow2 /var/lib/libvirt/images/vm1/ubuntu-kvm/tmp20ePgc.raw
Edit the VM config:
virsh edit vm1
Change the disk
section to point to the new raw image:
Change the lines <driver name='qemu' type='qcow2'/>
and <source
file='/var/lib/libvirt/images/vm1/ubuntu-kvm/tmp20ePgc.qcow2'/>
to <driver
name='qemu' type='raw'/>
and <source file='/var/lib/libvirt/images/vm1/ubuntu-
kvm/tmp20ePgc.raw'/>
. Like so:
<disk type='file' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<source file='/var/lib/libvirt/images/vm1/ubuntu-kvm/tmp20ePgc.raw'/>
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
That's it. Start the VM:
virsh start vm1
If it all works, remove the qcow2 image:
rm /var/lib/libvirt/images/vm1/ubuntu-kvm/tmp20ePgc.qcow2
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