libvirt: использование огромных страниц в системе NUMA

Машина имеет 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?


person Mark    schedule 24.12.2020    source источник


Ответы (1)


Если вы используете простой элемент <hugepages/>, то libvirt настроит QEMU для выделения из пула огромных страниц по умолчанию. Учитывая ваш default_hugepagesz = 1G, это должно означать, что QEMU выделяет страницы размером 1 ГБ. QEMU выделит столько, сколько необходимо, чтобы удовлетворить размер RAM запроса. Учитывая вашу конфигурацию, эти огромные страницы потенциально могут быть выделены из любого узла NUMA.

С более продвинутой конфигурацией libvirt можно запросить выделение определенного размера огромной страницы и выбрать их из определенных узлов NUMA. Последнее действительно необходимо только в том случае, если вы также блокируете процессоры для определенного узла NUMA хоста.

person DanielB    schedule 04.01.2021
comment
DanielB, спасибо за ваш комментарий. Я обновил свой вопрос, добавив более подробную информацию. - person Mark; 05.01.2021