Qcow2 disk image is an interesting format which supports features like internal and external snapshots, backing files, image compression, encryption. But also, it’s I/O performance is very slow compared to RAW format. Here are a couple of settings which can extract reasonable performance out of Qcow2 disk images.
Create a qcow2 disk image
First, let’s create a qcow2 disk image using ‘qemu-img’ tool
$ /usr/bin/qemu-img create -f qcow2 -o preallocation=metadata /export/vmimgs/glacier.qcow2 8G
NOTE: At this point in time, preallocation=metadata option is the best we can do to extract max. possible (near RAW) I/O performance out of QCOW2 format. (hint from Kevin Wolf – Qemu/Qcow2 developer )
From the below listing that 970M is the allocated or used size of the guest, 8.1G is the max size the image can ‘grow to’.
[root@moon tmp]# ls -lash /export/vmimgs/glacier.qcow2 970M -rw-r--r--. 1 qemu qemu 8.1G Sep 24 23:45 /export/vmimgs/glacier.qcow2 [root@moon tmp]#
Create the guest
# Create an unattended minimal guest install using a qcow2 disk image virt-install --connect=qemu:///system \ --network=bridge:br0 \ --initrd-inject=/var/tmp/fed-minimal.ks \ --extra-args="ks=file:/fed-minimal.ks console=tty0 console=ttyS0,115200" \ --name=glacier \ --disk path=/export/vmimgs/glacier.qcow2,format=qcow2 \ --ram 2048 \ --vcpus=2 \ --check-cpu \ --hvm \ --location=http://download.fedora.redhat.com/pub/fedora/linux/releases/15/Fedora/x86_64/os/ \ --nographics
The above will create a minimal guest w/ a qcow2 disk image format. Content of the fed-minimal kickstart is here
Once, the guest is created, ensure to have cache=’none’ parameter in ‘disk’ element of the guest’s xml file (if not present, add it and redefine the xml. It looks like below). This is another aspect which can improve the disk I/O performance.
[root@moon ~]# grep cache /etc/libvirt/qemu/glacier.xml -A 4 -B 1 <disk type='file' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source file='/export/vmimgs/glacier.qcow2'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk> [root@moon ~]# virsh define /etc/libvirt/qemu/glacier.xml Domain glacier defined from /etc/libvirt/qemu/glacier.xml [root@moon ~]# virsh start glacier Domain glacier started [root@moon ~]#
I’m still trying to wrap my head around the caching and preallocation mechanisms of the qcow2 format. Meanwhile, work on Qcow2 version-3 is in progress in upstream qemu.
I think you mean qcow3 not “Qcow2 version-3”?
The RFC patch here says it’s Qcow2 version3. Perhaps it ‘maybe’ renamed to Qcow3
http://lists.gnu.org/archive/html/qemu-devel/2011-06/msg02709.html
Pingback: Snapshotting and with libvirt for qcow2 images | Kashyap Chamarthy
Pingback: Little more disk I/O perf. improvement with ‘fallocate’ing a qcow2 disk | Kashyap Chamarthy