Машина имеет 4 узла Numa и загружается с параметром загрузки ядра default_hugepagesz=1G
. Я запускаю виртуальную машину с libvirt / virsh и вижу, что qemu
запускается с -m 65536 ... -mem-prealloc -mem-path /mnt/hugepages/libvirt/qemu
, т.е. запускаю виртуальную машину с 64 ГБ памяти и запрашиваю выделение гостевой памяти из временно созданного файла в / 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
%
Эти выходные данные подтверждают, что память хоста размером 512 ГБ равномерно разделена между numa
узлами, и огромные страницы также равномерно распределены по узлам.
Вопрос в том, как qemu (или kvm?) Определяет, сколько hugepages
выделить? Обратите внимание, что libvirt
xml имеет следующую директиву:
<memoryBacking>
<hugepages/>
<locked/>
</memoryBacking>
Однако из https://libvirt.org/formatdomain.html#memory-tuning каковы значения по умолчанию для выделения огромных страниц и на каких узлах? Возможно ли, чтобы вся память для виртуальной машины была выделена из узла 0? Как правильно это делать?
ОБНОВЛЕНИЕ Поскольку моя VM
рабочая нагрузка фактически закреплена за набором ядер на одном узле numa 0 с помощью элемента <vcpupin>
, я подумал, что было бы неплохо заставить 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?