在使用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 节点。





插入内存前虚拟机内部:




qemu 强制分辨率 qemu设置内存_qemu 强制分辨率

qemu 强制分辨率 qemu设置内存_Server_02



插入内存:


# virsh attach-device --live instance-00000005 mem.xml



插入内存后虚拟机内部:


qemu 强制分辨率 qemu设置内存_qemu 强制分辨率_03



激活新插入的内存,并查看内存:



qemu 强制分辨率 qemu设置内存_Server_04



注:新的内存设备插入之后,内存气泡可调整的上限值也随之增大相应的大小。



四. 热插拔内存后虚拟机内部自动 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 系统都不支持内存热拔操作。