【问题标题】:libvirt: use of hugepages on NUMA systemlibvirt:在 NUMA 系统上使用大页面
【发布时间】:2021-04-03 04:48:45
【问题描述】:

机器有 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-tuning 不清楚大页面分配的默认值是什么以及在哪些节点上?是否可以从节点 0 为 VM 分配所有内存?这样做的正确方法是什么?

更新 由于我的 VM 工作负载实际上是使用 &lt;vcpupin&gt; 元素固定到单个 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上找不到空闲的大页?

【问题讨论】:

    标签: qemu libvirt numa huge-pages


    【解决方案1】:

    如果您使用普通的 &lt;hugepages/&gt; 元素,那么 libvirt 会将 QEMU 配置为从默认的大页面池中分配。鉴于您的 'default_hugepagesz=1G' 这应该意味着 QEMU 分配 1 GB 大小的页面。 QEMU 将分配尽可能多的内存以满足请求的 RAM 大小。根据您的配置,这些大页面可能会从任何 NUMA 节点分配。

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

    【讨论】:

    • DanielB,感谢您的评论。我用更多细节更新了我的问题。
    猜你喜欢
    • 2015-04-29
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2016-05-23
    相关资源
    最近更新 更多