記憶體膨脹(memory ballooning)
記憶體膨脹(memory ballooning)是超管理器從「不想還記憶體」的虛擬機器手中回收閒置記憶體的巧妙方法。它要解決的問題來自超量配置(overcommit):主機常向虛擬機器承諾的記憶體總量超過它實際擁有的量,賭它們不會同時都用到自己全部的份額。當主機真的吃緊時,它需要從某台虛擬機器拿回記憶體——但客體作業系統以為所有記憶體都是它自己的,不會主動讓出。超管理器不能直接搶走頁,因為那可能毀掉客體。它需要客體配合。
訣竅是在客體裡安裝一個氣球驅動程式(balloon driver)。當主機面臨記憶體壓力時,它叫這個驅動程式「充氣」:驅動程式為自己配置一大塊客體記憶體並把它釘住,彷彿客體真的在用它。從客體作業系統看來那塊記憶體現在被佔用了,於是客體不再去碰它——而關鍵在於,驅動程式接著把這些如今閒置的實體頁框交還給超管理器,由它分給更需要的虛擬機器。當壓力緩解時,主機叫驅動程式「放氣」,把記憶體釋放回客體。氣球實際上是在客體內部施加溫和的壓力,讓客體自己決定該讓出什麼。
記憶體膨脹之所以重要,是因為它讓一台主機能跑比它純 RAM 所容許更多的虛擬機器,撫平「虛擬機器極少同時達到尖峰」這個事實。誠實的告誡是它並非憑空造記憶體:若每台虛擬機器真的同時都需要它全部的記憶體,膨脹幫不上忙,主機只能退回緩慢的磁碟置換,可能嚴重傷害效能。氣球充得太猛,甚至會把客體推進輾轉(thrashing)。它是回收閒置記憶體的工具,不是憑空變出不存在記憶體的工具。
一台主機有 64 GB,卻已向旗下虛擬機器承諾了總共 80 GB。當可用記憶體吃緊時,它要求一台閒置虛擬機器的氣球驅動程式,在那個客體內部抓走 8 GB。客體此時看到較少的可用記憶體,便釋放了它其實不太需要的快取;那 8 GB 的頁框便交給一台真正需要的繁忙虛擬機器。
氣球驅動程式在客體內部施壓,使它釋放出主機可重用的記憶體。
膨脹回收的是閒置記憶體,而非創造記憶體。若客體真的同時都需要全部 RAM,超量配置就失敗,主機只能置換到磁碟,慢得多——膨脹倚賴的是「虛擬機器不會同時達到尖峰」這個賭注。