本文主要介紹了什么是KVM virtio balloon driver。
首先,如果你從沒聽過這個概念,那什么是balloon driver呢?它是一種給予guest實例或者從guest實例中獲取RAM的方法。(理論上來講),如果你的guest實例需要更多的RAM,你可以通過balloon driver給他分配更多的內存,或者如果宿主機需要在guest實例中取走一下內存,balloon driver也可以做到。這些操作的執行不需要暫停或者重啟guest實例。
virtio_balloon是一個在guest實例中的內核驅動。這個driver表現的像一種奇怪的進程,要么擴展自己的內存使用,要么壓縮自己的內存使用接近什么也沒有,如下圖所示:

當balloon driver擴張時,運行在guest實例中的應用會突然少了很多可用內存,然后guest實例會像沒有多少內存時做的那樣,交換內存并啟動OOM killer(balloon本身是不可交換并且不會被殺掉的)。
那么這個“浪費”內存的內核驅動程序有什么意義呢?有兩點——
第一,驅動通過virtio通道與宿主機通訊,宿主機給其下發指令,比如擴展到指定的大小、現在開始縮小。guest實例配合操作,但是并不直接控制balloon。
第二,balloon中的內存也從guest實例中取消映射,并傳回宿主機,因此宿主機可以將這部分內存傳遞給其他的guest實例使用。看起來就像guest虛機的內存缺失了一塊一樣:

Libvirt有兩個配置項,currentMemory和maxMemory(詳見Memory Allocation):

maxMemory(或<memory>)是在guest實例啟動階段分配的內存。KVM和Xen的guest虛機目前(譯者注:原文發布時間是2010-07-17 14:33)無法找過這個內存上限。currentMemory控制了請求分配給guest實例上應用程序的內存。balloon填充剩余的內存,并且把這部分內存還給宿主機,用于宿主機的在其他地方使用。
該項配置可以手動調整,或者通過編輯XML文件,或者通過virsh setmem命令。