KSM

Summary

Allow KVM guest virtual machines to share identical memory pages. This is especially useful when running multiple guests from the same or similar base operating system image. Because memory is shared, the combined memory usage of the guests is reduced.

Completed

Detailed Description

The concept of shared memory is very common in operating system design. For example, when a program is first started it shares all of its memory with the parent program. When either the child or parent program tries to modify some of this memory the kernel allocates a new memory region, copies the original contents and allows the program to modify this new region. This is known as copy on write.

KSM is a new Linux feature which turns this concept on its head. It enables the kernel to look at two already running programs and compare their memory. If any memory regions are exactly identical, the kernel can combine the two regions into one and mark those regions for copy on write as above.

This is especially useful in the case of KVM. When guest virtual machines are started, they can only inherit the memory of the parent qemu-kvm process. However, it is the contents of the guest operating system image which has the data which is most likely to be shareable. KSM allows KVM to request that these identical guest memory regions be shared.

Benefit to Fedora

With this feature Fedora will be able to run guest virtual machines in a potentially much more memory efficient manner. This will mean that Fedora host machines will be capable of hosting more guests than before.

Scope

The main effort here is the kernel support. Since it is not going to make 2.6.31, we need to consider backporting it once the userspace API has been declared stable. KSM is a pretty well self-contained memory management feature, so backporting should be straightforward.

Once the kernel support is available, a minor patch for qemu-kvm is required to enable the memory sharing.

An open question is whether KSM will be enabled for all guests by default. If not, support for enabling it will need to be added to libvirt, virtinst, virt-manager etc.