Kvm has become one of the major virtualization technologies the last years. For Redhat Linux it has even become the default virtualization solution. Kvm´s IO performance is hardly competitive to other virtualization solutions when using the default options. Especially when using qcow2 images, the IO performance of kvm/qemu can be greatly improved by disabling the cache of the underlying host filesystem. This can be done by starting kvm with the cache=none option, in example with the options
instead of just supplying the image file with -hda my_image.qcow2. Then the image file is being opened using the O_DIRECT flag, bypassing the page cache. If the underlying filesystem does not support the O_DIRECT flag, this fails with the error message:
could not open disk image my_image.qcow2: Invalid argument
This is the case for an ext4 filesystem with full journaling enabled. One can easily test if the O_DIRECT flag is supported by the underlying filesystem with a simple dd command on the host:
dd if=some_file of=/dev/null iflag=direct
If the O_DIRECT flag is not supported it results in the following error:
dd: opening `some_file’: Invalid argument
Thus, if safety concerns do not apply, one does not want to use full journaling, to increase performance. The journaling options can be set either in /etc/fstab or in the filesystem itself. For the fstab case the red marked part of the following example entry has to be removed.
/dev/sda7 / ext4 defaults,noatime,nodiratime,async, data=journal 0 1
If the journaling option is set in the filesystem, this can be shown and edited with the tune2fs command. In example tune2fs -l /dev/sda7 displays information on the filesystem on /dev/sda7. If full journaling is enabled, the output contains the journal_data mount option:
Default mount options: journal_data
The option can be removed with tune2fs -o^journal_data /dev/sda7. Afterwards the output of tune2fs -l does not contain the journal_data mount option any more:
Default mount options: (none)
In both cases the filesystem has to be remounted to activate the changes. Afterwards qemum-kvm works with the cache=none option, as described above, and with increased IO performance.