Virt Manager介面可設定虛擬機的RAM,但是為什麼還有「最大分配」欄位呢,RAM數值不該是固定的嗎?這代表Libvirt是可以動態分配RAM給虛擬機使用的。
Libvirt可在虛擬機需要RAM時分配給它,不需要多餘的資源的時候還給宿主機。背後仰賴「VirtIO Memory Ballooning」機制。
Balloon意為「記憶體氣球」,最初是設計用來應付KVM的超賣情況(overcommiting),使宿主機能夠執行超過自身RAM需求的二個虛擬機,例如宿主機只有2GB RAM,卻可以執行二個需要2GB RAM的虛擬機。
Libvirt會在虛擬機插入一個memballon裝置,當需要RAM的時候,氣球會放氣(deflate)將RAM給虛擬機
反之則是膨脹(inflate),將RAM還給宿主機
使用者可手動用virsh指令調整虛擬機的RAM佔用,也可以交給Balloon自動做RAM分配。
Balloon需要作業系統支援才可以使用,Linux核心支援Ballloon;Windows則是得安裝virtio驅動才能讓Balloon調配RAM。
1. 環境#
- 宿主機:Ubuntu 24.04
- 虛擬機1:Ubuntu Server 24.04
- 虛擬機2:Windows 11 23H2
2. 宿主機端的設定#
在Linux安裝Virt Manager後就能使用Balloon功能。
點選編輯虛擬機硬體,到記憶體頁面,設定預設分配的RAM和最大分配RAM。例如我這裡設定虛擬機目前分配的RAM為4GB,最多可以用到8GB。
將RAM分配設定為自動調整,請檢查虛擬機xml的
<devices>
區塊是否有啟用memballoon裝置,且傳入autodeflate="on"
參數:
<devcies>
<memballoon model="virtio" autodeflate="on">
<address type="pci" domain="0x0000" bus="0x06" slot="0x00" function="0x0"/>
</memballoon>
</devices>
目前分配的RAM為虛擬機開機後所能存取的數值,如果虛擬機需要更多RAM,宿主機才會分配給它。反之,若虛擬機的RAM小於預設數值,且宿主機需要RAM,則那些RAM會還給宿主機。
雖然Virt Manager的界面可以設定目前要分配多少RAM給虛擬機,但虛擬機必須先關機才能調整。
3. 虛擬機內的設定#
Linux#
使用
free -h
指令查看可用RAM,應該是4GB暫時停用SWAP,再簡單跑個stress-ng壓力測試,強制佔滿更多RAM,超過4GB。
sudo swapoff -a
stress-ng -m 1 --vm-bytes 6G
- 照理說stress-ng耗盡RAM之後就會被中止,但是這裡沒有發生!此時再執行free指令,可以觀察到Balloon自動分配的RAM進來了,這裡並沒有使用到SWAP,RAM是真的變多了。
Windows#
下載最新版 stbale virtio驅動。安裝Guest Tool套件後,Windows裝置管理員的系統應會多出「VirtIO Balloon Driver」
以系統管理員權限開啟終端機,切換到
C:\Program Files\Virtio-Win\Balloon\
資料夾
Set-Location -Path C:\Program Files\Virtio-Win\Balloon\
- 安裝Ballon服務。
blnvr.exe -i
並在Windows的「服務」選單確認Balloon Sevvice是否有自動啟動。
詭異的是,即使設定Balloon之後,工作管理員依然可以看到全部RAM,但是Windows服務佔用比重確實是上升的。
分配8GB RAM的時候大約38%。
而現在只有4GB RAM可用,所以Widnows服務的佔用來到了82%。