Improve KVM performance

In this post I would like to share two tips I have found that greatly improve the performance of KVM guests. Both tips work with Linux guests, although only the second tip will work with windows or BSD guests.

With these tips you should notice an immediate improvement in performance including boot times, general performance, and responsiveness to inputs (mouse / keyboard).

Kernel option noop

With this tip we will use the kernel (boot) option elevator=noop to optimize your virtual hard drive I/O.

For a technical discussion of this option, see this link . If you want a more detailed discussion see this second link.

Grub 2

Using any editor, open /etc/default/grub

sudo -e /etc/default/grub

Look for the line :

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

Add elevator=noop at the end of the line

GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash elevator=noop”

Save your changes and exit your editor.

update grub

sudo update-grub

Reboot – One of the few times you will need to reboot.

Grub 1

With most distros you edit /boot/grub/menu.lst

Using any editor, open Using any editor, open /boot/grub/menu.lst

Look for the kopts line:

# kopt=root=/dev/sda1 ro

Just add this option to the end of the line.

# kopt=root=/dev/sda1 ro elevator=noop

Note: DO NOT remove the # in the front of the line !!!

Then update grub

sudo update-grub

Reboot – One of the few times you will need to reboot.

Fedora is an exception

Fedora is a bit odd about this. Fedora uses /boot/grub/grub.conf , and /boot/grub/menu.lst is a symbolic link to grub.conf .

Specify the noop kernel option at installation

You may specify grub options at installation : Fedora Wiki Installation Options

Adding the noop kernel option post installation

As far as I can see, this is a manual edit. You will need to manually edit the file /etc/grub/grub.conf and add elevator=noop to the end of the kernel line.

Fedora wiki boot options

Save your changes and reboot – One of the few times you will need to reboot.


Cache writeback option

Ibuclaw pointed this option out to me on IRC, and discusses in ibuclaw’s blog.

From man qemu :

By default, writethrough caching is used for all block device.
This means that the host page cache will be used to read and write
data but write notification will be sent to the guest only when the
data has been reported as written by the storage subsystem.

Writeback caching will report data writes as completed as soon as
the data is present in the host page cache. This is safe as long
as you trust your host. If your host crashes or loses power, then
the guest may experience data corruption. When using the -snapshot
option, writeback caching is used by default.

The host page can be avoided entirely with cache=none. This will
attempt to do disk IO directly to the guests memory. QEMU may
still perform an internal copy of the data.

Some block drivers perform badly with cache=writethrough, most
notably, qcow2. If performance is more important than correctness,
cache=writeback should be used with qcow2. By default, if no
explicit caching is specified for a qcow2 disk image,
cache=writeback will be used. For all other disk types,
cache=writethrough is the default.

So either using writeback or disabling the cache will improve performance.

To use this option, rather then specifying a drive with -hda image.qcow we need to use the -drive option

kvm -m 512 -drive file=image.qcow,cache=writeback,media=disk

This option can be used with .iso as well ( note the media=cdrom )

kvm -m 512 -drive file=fedora.iso,cache=writeback,media=cdrom

Warning: Please note that in the event the host node crashes, data loss can result from this option.


KSM

This tip was added by morgan cox (see comments). KSM == Kernel SamePage Merging and was enabled by default on Fedora 12.

See This KVM page from the Arch Wiki.

For a more detailed description of KSM see IBM – Anatomy of Linux Kernel Shared Memory.

This entry was posted in Linux and tagged , . Bookmark the permalink.

10 Responses to Improve KVM performance

  1. Pingback: Tweets that mention Shadows of epiphany » Blog Archive » Improve KVM performance -- Topsy.com

  2. morgan cox says:

    Thanks for the tips.

    You haven’t mentioned that best improvement to KVM and that is to enable KSM.

    You will only be able to do this if you are running 2.6.32+ kernel (for extra performance use 2.6.33+ as this can also share swap pages) and I newish version of qemu-kvm.

    Arch linux not supports it out the box – see – http://wiki.archlinux.org/index.php/KVM#Enabling_KSM

    My tests show the nodes give you approx 25% more memory in KVM environments.

  3. bodhi.zazen says:

    @morgan cox: KSM is already enabled. Must be the default on Fedora.

    Always nice to see the Arch Wiki though =)

  4. Thanks for the tips. Just one note, you mention grub.1st in your article, but it should be grub.lst (the letter l, not the number 1). It’s short for “list”, that’s how you can remember it.

  5. bodhi.zazen says:

    Thank yo Frank Groeneveld , fixed that.

  6. Pingback: Links 19/4/2010: Synaptics Gesture Suite on Linux | Techrights

  7. Juan Miscaro says:

    First you say “if performance is more important than correctness, cache=writeback should be used” then you say “using writethrough […] will improve performance.”

  8. William says:

    cache=writeback will give you a good performance, but it will use a LOT of memory, none will be a good choice

  9. Pingback: Akendos Blog» CentOS 6.2, KVM and io problems

Add Comment Register



Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>