快轉到主要內容

VirtIO-Balloon:伸縮自在的RAM,QEMU/KVM虛擬機動態分配記憶體

分類   資訊科技 虛擬機與容器技術
標籤   QEMU-KVM VirtIO Libvirt
🗓️ 民國113年 甲辰年
✍ 切換正體/簡體字
目錄

Virt Manager介面可設定虛擬機的RAM,但是為什麼還有「最大分配」欄位呢,RAM數值不該是固定的嗎?這代表Libvirt是可以動態分配RAM給虛擬機使用的。

Libvirt可在虛擬機需要RAM時分配給它,不需要多餘的資源的時候還給宿主機。背後仰賴「VirtIO Memory Ballooning」機制。

Balloon意為「記憶體氣球」,最初是設計用來應付KVM的超賣情況(overcommiting),使宿主機能夠執行超過自身RAM需求的二個虛擬機,例如宿主機只有2GB RAM,卻可以執行二個需要2GB RAM的虛擬機。

Libvirt會在虛擬機插入一個memballon裝置,當需要RAM的時候,氣球會放氣(deflate)將RAM給虛擬機

圖片來自Redhat的Luiz Capitulino簡報

反之則是膨脹(inflate),將RAM還給宿主機

圖片來自Redhat的Luiz Capitulino簡報

使用者可手動用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. 宿主機端的設定
#

  1. 在Linux安裝Virt Manager後就能使用Balloon功能。

  2. 點選編輯虛擬機硬體,到記憶體頁面,設定預設分配的RAM和最大分配RAM。例如我這裡設定虛擬機目前分配的RAM為4GB,最多可以用到8GB。

  3. 將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>
  1. 目前分配的RAM為虛擬機開機後所能存取的數值,如果虛擬機需要更多RAM,宿主機才會分配給它。反之,若虛擬機的RAM小於預設數值,且宿主機需要RAM,則那些RAM會還給宿主機。

  2. 雖然Virt Manager的界面可以設定目前要分配多少RAM給虛擬機,但虛擬機必須先關機才能調整。

3. 虛擬機內的設定
#

Linux
#

  1. 使用free -h指令查看可用RAM,應該是4GB

  2. 暫時停用SWAP,再簡單跑個stress-ng壓力測試,強制佔滿更多RAM,超過4GB。

sudo swapoff -a

stress-ng -m 1 --vm-bytes 6G
  1. 照理說stress-ng耗盡RAM之後就會被中止,但是這裡沒有發生!此時再執行free指令,可以觀察到Balloon自動分配的RAM進來了,這裡並沒有使用到SWAP,RAM是真的變多了。

Windows
#

  1. 下載最新版 stbale virtio驅動。安裝Guest Tool套件後,Windows裝置管理員的系統應會多出「VirtIO Balloon Driver」

  2. 以系統管理員權限開啟終端機,切換到C:\Program Files\Virtio-Win\Balloon\資料夾

Set-Location -Path C:\Program Files\Virtio-Win\Balloon\
  1. 安裝Ballon服務。
blnvr.exe -i
  1. 並在Windows的「服務」選單確認Balloon Sevvice是否有自動啟動。

  2. 詭異的是,即使設定Balloon之後,工作管理員依然可以看到全部RAM,但是Windows服務佔用比重確實是上升的。

分配8GB RAM的時候大約38%。

而現在只有4GB RAM可用,所以Widnows服務的佔用來到了82%。

參考資料
#

相關文章

Linux KVM啟用巢狀虛擬化,在虛擬機裡面跑虛擬機
分類   資訊科技 虛擬機與容器技術
標籤   Libvirt QEMU-KVM Linux
將Linux的QEMU/KVM網路設定為橋接模式,讓外網可以連線到虛擬機
分類   資訊科技 虛擬機與容器技術
標籤   QEMU-KVM Libvirt
Spice Guest Tools用法,QEMU/KVM虛擬機自動縮放解析度、共享資料夾
分類   資訊科技 虛擬機與容器技術
標籤   Libvirt QEMU-KVM

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur或Postimages。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用圖床網站。