【发布时间】: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 工作负载实际上是使用 <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上找不到空闲的大页?
【问题讨论】:
标签: qemu libvirt numa huge-pages