libvirt:在NUMA系统上使用hugepage



机器有4个Numa节点,使用内核引导参数default_hugepagesz=1G引导。我用libvirt/virsh启动VM,可以看到qemu-m 65536 ... -mem-prealloc -mem-path /mnt/hugepages/libvirt/qemu启动,即用64GB内存启动虚拟机,并请求它从/mnt/hugepages/libvirt/qemu:中临时创建的文件中分配来宾内存

% fgrep Huge /proc/meminfo
AnonHugePages:    270336 kB
ShmemHugePages:        0 kB
HugePages_Total:     113
HugePages_Free:       49
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:    1048576 kB
Hugetlb:        118489088 kB
%
% numastat -cm -p `pidof qemu-system-x86_64`
Per-node process memory usage (in MBs) for PID 3365 (qemu-system-x86)
Node 0 Node 1 Node 2 Node 3 Total
------ ------ ------ ------ -----
Huge      29696   7168      0  28672 65536
Heap          0      0      0     31    31
Stack         0      0      0      0     0
Private       4      9      4    305   322
-------  ------ ------ ------ ------ -----
Total     29700   7177      4  29008 65889
...
Node 0 Node 1 Node 2 Node 3  Total
------ ------ ------ ------ ------
MemTotal         128748 129017 129017 129004 515785
MemFree           98732  97339 100060  95848 391979
MemUsed           30016  31678  28957  33156 123807
...
AnonHugePages         0      4      0    260    264
HugePages_Total   29696  28672  28672  28672 115712
HugePages_Free        0  21504  28672      0  50176
HugePages_Surp        0      0      0      0      0
%

该输出确认了主机512GB的内存在numa节点之间平均分配,并且巨大的内存也在节点之间平均分布。

问题是qemu(或kvm?(如何确定要分配多少hugepages?请注意,libvirt-xml具有以下指令:

<memoryBacking>
<hugepages/>
<locked/>
</memoryBacking>

然而,从https://libvirt.org/formatdomain.html#memory-调整hugepage分配的默认值是什么以及在哪些节点上?是否可以从节点0为VM分配所有内存?做这件事的正确方法是什么?

UPDATE由于我的VM工作负载实际上使用<vcpupin>元素固定在单个numa节点0上的一组核心上,我认为强制Qemu从同一numa节点分配内存是个好主意:

<numtune>
<memory mode="strict" nodeset="0">
</numtune>

然而,这并没有起作用,qemu在其日志中返回了错误:

os_mem_prealloc insufficient free host memory pages available to allocate guest ram

这是否意味着它无法在numa节点0上找到免费的巨大页面?

如果使用纯<hugepages/>元素,那么libvirt将配置QEMU从默认的巨大页面池中进行分配。假设您的"default_hugepagesz=1G",这应该意味着QEMU分配1GB大小的页面。QEMU将分配所需的数量以满足请求的RAM大小。考虑到您的配置,这些巨大的页面可能会从任何NUMA节点分配。

使用更高级的libvirt配置,可以请求分配特定大小的巨大页面,并从特定的NUMA节点中挑选它们。只有当您还将CPU锁定到特定的主机NUMA节点时,才真正需要后者。

这是否意味着它无法在numa节点0上找到可用的巨大页面?

是的。

numastat -m可以用来了解有多少巨大的页面是完全免费的。

相关内容

  • 没有找到相关文章

最新更新