1. 程式人生 > >libvirt-內存分配和內存熱插拔

libvirt-內存分配和內存熱插拔

簡單的 nbsp mman src 疑惑 get 使用 熱插拔 加載

在使用libvirt給虛擬機分配內存大小時,涉及到memory和currentMemory兩個字段,很多人都有這個疑惑,為什麽需要兩個呢。其實是和內存氣泡動態調整內存有關系的。簡單的來說,memory是虛擬機啟動時分配給的內存,currentMemory是內存氣泡生效後動態調整到的內存。下面看具體的解釋。

一. 啟動內存
<memory unit=‘KiB‘>8388608</memory>
虛擬機啟動時使用的內存

二. 內存氣泡

在虛擬機的xml文件中配置:

<memory unit=‘KiB‘>8388608</memory>
<currentMemory unit=‘KiB‘>158608</currentMemory>
......
<devices>
<memballoon model=‘virtio‘>
<stats period=‘10‘/>
<address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x07‘ function=‘0x0‘/>
</memballoon>
</devices>
參數說明:
memory:
在qemu命令中使用參數-m來設置的。表示虛擬機在啟動階段使用的內存。包括在啟動或稍後熱插拔時指定的可能的附加內存。
currentMemory:
通過libvirt調整balloon值的初始值是currentMemory。
說明:
1.在虛擬機啟動後加載了內存balloon驅動後就開始對虛擬機內存進行熱插拔,先設置內存為<currentMemory>大小,這個<currentMemory>qemu進程不知道,時記錄在libvirt中的。然後根據需求對內存進行調整(balloon),調整的上限是<memory>,這個<memory>qemu進程是知道的,在虛擬機啟動時使用了這個值。
2.要禁止memballoon設備,可以設置memballoon model=‘none‘
禁止內存氣泡設備後,虛擬機內部看到的內存就是<memory>,也不能通過氣泡進行調整。

通過ballon調整虛擬機內存大小(調整後在虛擬機內部是可以看到虛擬機內存大小變化的):
# virsh qemu-monitor-command instance-00000005 --hmp "info balloon"
# virsh qemu-monitor-command instance-00000005 --hmp "balloon 1024"
或者:
# virsh setmem instance-00000005 2097152
# virsh dommemstat instance-00000005


三. 內存熱插拔

虛擬機的xml文件
<maxMemory slots=‘1‘ unit=‘KiB‘>10388608</maxMemory>
......
<cpu mode=‘host-model‘>
......
<numa>
<cell id=‘0‘ cpus=‘0‘ memory=‘4194304‘ unit=‘KiB‘/>
</numa>
</cpu>
<maxMemory>的值表示通過 hot-plug 可以達到的內存的上限(包含虛擬機初始內存)。其中 slots 表示 DIMM 插槽的數量,每個插槽在運行時都可以插入一個內存設備,上限是 255 個。
<numa>內的配置用於指定虛擬機內的 NUMA 拓撲。

要插入內存設備xml文件
<memory model=‘dimm‘>
<target>
<size unit=‘KiB‘>524287</size>
<node>0</node>
</target>
</memory>
<size>指定設備的內存容量,<node>指定插入到虛擬機的哪個 NUMA 節點。

插入內存前虛擬機內部:

技術分享圖片

插入內存:
# virsh attach-device --live instance-00000005 mem.xml

插入內存後虛擬機內部:

技術分享圖片

激活新插入的內存,並查看內存:

技術分享圖片

註:新的內存設備插入之後,內存氣泡可調整的上限值也隨之增大相應的大小。

四. 熱插拔內存後虛擬機內部自動 online 內存 為了讓系統自動 online 添加的內存,可以設置 udev 規則,內容如下:

/etc/udev/rules.d/99-hotplug-memory.rules
# automatically online hot-plugged memory
ACTION=="add", SUBSYSTEM=="memory",ATTR{state}="online"


五. 目前支持內存熱插的 Windows 版本有:
  Windows Server 2008 R2, Enterprise Edition and Datacenter Edition
  Windows Server 2008, Enterprise Edition and Datacenter Edition
  Windows Server 2003, Enterprise Edition and Datacenter Edition
  所有 Windows 系統都不支持內存熱拔操作。

libvirt-內存分配和內存熱插拔