内存分配 - Memory Allocation
元素定义
<domain>
...
<maxMemory slots='16' unit='KiB'>1524288</maxMemory>
<memory unit='KiB'>524288</memory>
<currentMemory unit='KiB'>524288</currentMemory>
...
</domain>
- <maxMemory>
定义: 虚拟机在运行所能分配的最大内存
<slots>
内存插槽数量
<unit>:
单位 |
算法 |
全称 |
KiB |
2^10 = 1024 bytes |
kibibyte |
KB |
10^3 = 1000 bytes |
kilobytes |
MiB |
2^20 = 1048576 bytes |
mebibytes |
MB |
10^6 = 1000000 bytes |
megabytes |
However, the unit value will be rounded up to the nearest 'kibibyte' by the libvirt.
- <memory>
定义:虚拟机在开机时所能分配到的最大内存
<unit>: 与maxMemory中的unit定义一致
- <currentMemory>
定义:虚拟机当前分配的内存大小,可以指定为一个比<maxMemory>小的值, 用于在后期在线扩展(ballooning)。如果未指定,则默认设置为<memory>的值。
<unit>: 与maxMemory中的unit定义一致
virsh 相关命令
[root@local]# virsh setmaxmem --help
NAME
setmaxmem - change maximum memory limit
SYNOPSIS
setmaxmem <domain> <size> [--config] [--live] [--current]
DESCRIPTION
Change the maximum memory allocation limit in the guest domain.
OPTIONS
[--domain] <string> domain name, id or uuid
[--size] <number> new maximum memory size, as scaled integer (default KiB)
--config affect next boot
--live affect running domain
--current affect current domain
设置最大内存
virsh setmaxmem
1. 配置了numa的虚拟机,不能使用virsh setmaxmem来动态配置maxMemory,如下所示
2. virsh setmaxmem 只能在虚拟机关机的情况下, 对其内存进行修改
3. 在关机模式下,设置maxMemory
设置内存大小
virsh setmem
设置内存需要先对虚拟机进行开机,然后才能热添加/移除虚拟机内存,否则会报虚拟机未运行,不会设置成功。
在对虚拟机进行热添加时,不能超过设定的 maxmemory, 否则也会报错
内存调校 - Memory Tuning
元素样例
<domain>
...
<memtune>
<hard_limit unit='G'>1</hard_limit>
<soft_limit unit='M'>128</soft_limit>
<swap_hard_limit unit='G'>2</swap_hard_limit>
<min_guarantee unit='bytes'>67108864</min_guarantee>
</memtune>
...
</domain>
可以通过该元素对内存大小进行调校
[root@localhost secure]# virsh memtune --help
NAME
memtune - Get or set memory parameters
SYNOPSIS
memtune <domain> [--hard-limit <number>] [--soft-limit <number>] [--swap-hard-limit <number>] [--min-guarantee <number>] [--config] [--live] [--current]
DESCRIPTION
Get or set the current memory parameters for a guest domain.
To get the memory parameters use following command:
virsh # memtune <domain>
OPTIONS
[--domain] <string> domain name, id or uuid
--hard-limit <number> Max memory, as scaled integer (default KiB)
--soft-limit <number> Memory during contention, as scaled integer (default KiB)
--swap-hard-limit <number> Max memory plus swap, as scaled integer (default KiB)
--min-guarantee <number> Min guaranteed memory, as scaled integer (default KiB)
--config affect next boot
--live affect running domain
--current affect current domain
元素解析
- Memtune (optional)
定义:在标签<memtune> 中的列出了该虚拟机的所有可调校的内存参数。
<hard_limit>
定义:虚拟机内存的硬上限(KiB)(虚拟机所能使用的最大内存),在预估不足的情况下(通常也无法预估一个宿主机内所有进程所需的内存大小),虚拟机可能会因为内存不足的原因被宿主机内核强制kill,因此qemu-kvm 强烈建议不设置该参数。但是如果在<memoryBacking>中,因各种原因,虚拟机设置了标签<locked>,那么你将不得不去计算该虚拟机的内存花销并且给 ard_limit一个足够大的值来确保虚拟机的正常运行。
<soft_limit>
定义:虚拟机内存的软上限(KiB),当宿主机内存资源不足时各虚拟机之间会进行内存竞争,此时会限制虚拟机的内存
<swap_hard_limit>
定义:swap_hard_limit = maxmum_memory + swap
<min_gurantee>
定义:虚拟机占用宿主机的最低内存(KiB),该参数仅支持 VMware ESX 和 OpenVZ。
virsh 命令演示
1. 使用 virsh memtune时, hard_limit 的值需要比当前memory的值小。
但是hard_limit的值可以大于max_memory
内存支撑 - Memory Backing
<domain>
...
<memoryBacking>
<hugepages>
<page size="1" unit="G" nodeset="0-3,5"/>
<page size="2" unit="M" nodeset="4"/>
</hugepages>
<nosharepages/>
<locked/>
<source type="file|anonymous|memfd"/>
<access mode="shared|private"/>
<allocation mode="immediate|ondemand"/>
<discard/>
</memoryBacking>
...
</domain>
元素解析
- <hugepages>
定义: 此元素告知宿主机该虚拟机的内存将从大页内存分配而不是从普通的内存中分配。
-
- <page>
定义: 设置虚拟机大页内存与numa node绑定关系。
-
-
- size: 大页内存大小
- unit: 大页内存大小单位
- nodeset: 绑定NUMA node与大页内存
-
- <nosharepages>: 指示宿主机对该虚拟机取消共享内存(通常是内存合并的方式共享)。
- <locked>: 当设置了该参数时,分配给该虚拟机的大页内存将会被锁定且不会被宿主机交换出来。该虚拟机对应的QEMU 进程所使用的内存也会被锁定, 而这个是libvirt所不能事先统计到的,所以不得不解除锁定内存的限制(客户机与QEMU)。所以, 开启此选项存在潜在的风险。当主机内存耗尽时,主机将无法从客户机回收锁定的内存,这意味着分配大量锁定内存的恶意客户机可能会导致对宿主机的拒绝服务攻击。因此,除非业务需要,否则不鼓励使用此选项;如果真的要用,建议在特地场合下设置内存。
- <source>: memory bakcking 的文件类型
- type: file|anonymous|memfd
- <access>:
- mode:shared|private
- <allocation>
- mode
- <discard>
当虚拟机要使用大页时,也需要宿主机已经支持且配置了相应大页,否则虚拟机配置大页会失败。