Virtio balloon實現機理
balloon driver是一種驅動程序,可以從客戶機汲取內存或追添內存給予客戶機。從理論上,如果你的客戶機需要更多的內存,你可以使用balloonDriver給客戶機提供更多內存;如果主機需要從客戶機汲取內存,balloonDriver也可以做到。無論是給客戶機提供更多內存還是主機從客戶機汲取內存都不需要暫停或者重啟客戶機,完全可以動態實現,相當於實現客戶機內存的熱插拔(hot-plugin)。
客戶機內核驅動中由一個稱之為virtio_balloon的驅動,它的作用既可以膨脹自己使用內存大小也可以縮減內存使用量(可以縮減至幾近於無),見於如下圖解
當balloon driver膨脹時,運行在客戶機上的正常應用程序將突然間減少占用內存。當沒有足夠內存時,客戶機就當balloonDriver占用的內存不存在,而使用交換空間或者開啟OOM-killer選擇性的殺死一些進程以求釋放些內存共使用(balloon本身是不可換出,不可殺死的)。
那么balloon driver占用這些內存具有什么含義呢?這些被balloon driver占用的內存正常應用程序又不能使用,這不是浪費嗎?其實這么做主要考慮兩點:
-
客戶機的balloon driver可以通過virtio通道與主機通信,並接受主機給它的伸/縮信號。由客戶機協作,但不直接控制balloon.
-
在balloon中的內存頁從客戶機中取消映射並交回主機,主機可以將這些內存拿出來給其他客戶機。這就像客戶機的內存被摳出一塊出來,如下圖解 :
在Libvirt中有兩項可以控制的設置項稱為currentMemory(當前內存)和maxMemory(最大內存),如下圖解:
maxMemory(最大內存,在libvirt xml文件中為memory)是在客戶機啟動時分配給客戶機的內存。當前,KVM/Xen客戶機不能使用不能超過該值。
currentMemory(當前內存)是可以分配給客戶機中正常應用使用的內存閾值。balloon將占用(充滿)余下的內存並將這些內存交回主機,主機可以拿來在任何需要的地方使用。可以手動地調整currentMemory:編輯libvirt xml文件或者使用virtsh setmem命令。
理想情況,基於主機和客戶機動態申請/釋放內存的需求,balloon driver自動(動態地)伸縮以滿足主機/客戶機。但是目前Libvirt中balloon driver沒有實現該特性,只能通過virsh指令或修改客戶機配置文件實現,還達不到根據主機/客戶機實際負載動態地、自適應地調整。關於ballon driver自適應調整在QEMU中有相關補丁實現,可以參考相關文檔。
[參考文檔]
http://rwmj.wordpress.com/2010/07/17/virtio-balloon/ [需要梯子]
http://blog.braastad.org/?p=211 [需要梯子]
http://www.linux-kvm.org/page/Projects/auto-ballooning
本文檔參考如上帖子或官方文檔意譯(添加個人理解測試以及其他文檔或評論相關內容)