技術途徑
業界就該問題定義為虛擬機內存復用(復用干嘛? 當然是為了跑更多的虛擬機呀!) :memory overcommit.圍繞次問題主要有4種技術手段,下面簡要介紹和分析:
1 氣泡驅動(ballooning driver)
利用預裝在用戶虛擬機中的前端驅動程序,偷取guest os的內存貢獻給VMM以供其他虛擬機使用.反向易然.
issue:
A 需要實現用戶虛擬機支持的前端驅動程序.
B 不能自動偷取和歸還,需要從DOM0設置.
C 不能實現啟動時的內存復用,只能啟動后偷取(即啟動虛擬機時宿主機必須提供其給定大小的內存)
D 目前xen 引入了pod (Populate-on-demand) 似乎解決了在HVM虛擬機中的限制C
2 基於內容的頁共享(base-content page sharable)
VMM會讓虛擬機共享同樣內容的也面,以達到節約內存的目的。
issue:
A 操作比較重,因為要查看頁面內容。
B 目前VMM只是對前后端驅動所用的頁面,因此能省出的內存數量很有限。
C blktap2目前該技術尚不完善。
3 VMM 換出技術(OnDemand paging/swap)
VMM實現請頁功能,這時guest os 類似進程一樣在VMM缺少內存時能被換出到宿主機磁盤上。該方法對虛擬機透明。
issue:
A 由於對虛擬機透明,所以換出的虛擬機存在不確定性。這樣容易造成“double paging”,也就是guest os中某些頁面已經被換出,而該guest os又被VMM換出,這樣必然讓guest os的性能惡化。
B Xen的實現中hypervisor沒有IO功能,因此要換出頁面則需要借助dom0完成。所以操作復雜,目前尚未真正實現。(kvm中由於hypervisor在內核中實現,guest os 實現基於進程,因此onDemand paging功能省缺實現)
4 Transcient Memory
Oracle 提出的新方法,這種方法實際采用了guest os 內存分配和VMM溝通,也就是向VMM申請,使用完畢,歸還VMM的思路。這種方法最徹底的解決內存復用問題。
issue:
A 需要改變guest os已有的內存分配接口。也就是改造現有系統(雖然是安全的非侵入式改造)。
B 該技術還在發展階段,尚不成熟。
結論:
1 目前最成熟和可投入實用是氣泡驅動.1 該技術已經發展多年 2 linux /windows其前端氣泡驅動都有參考模型。3 ciritx server已經采用氣氣泡 + vm反饋 + dom0上的策略引擎 實現了單機上的內存復用。
2 最理想的方式是采用 Transcient Memory 實現復用,這種方式無疑是將宿主機的整個內存池化、實現了按需分配、用完歸還。避免了使用預先化區——被VM獨占——帶來的分配限制(這好比一個系統5個硬盤,單獨使用和采用LVM方式使用的區別)
3 如果你想更經濟,尤其跑網站等應用——也許你該考慮考慮VPS