В Linux я хочу перенести страницы памяти виртуальной машины KVM с одного узла NUMA на другой узел NUMA во время выполнения. Но я не могу найти никаких интерфейсов для этого в гипервизоре KVM или с использованием API libvirt. Затем я попытался использовать эту numa_migrate_pages
функцию -lnuma
и перенести страницы памяти процесса VM. Но я обнаружил, что numa_migrate_pages
функция может переносить только некоторые страницы, она не может переносить все страницы. Например, текст ниже показывает распределение страниц памяти этого процесса VM:
Node0: 0 pages
Node1: 1538 pages
Node2: 270641 pages
Node3: 552 pages
И я хочу перенести все страницы из Node2 в Node0. Но после использования numa_migrate_pages
функции переносятся только некоторые страницы, как показано ниже:
Node0: 7952 pages
Node1: 1538 pages
Node2: 262113 pages
Node3: 552 pages
Затем я открываю файл и обнаруживаю, что большинство страниц, оставленных на Node2, являются анонимными и грязными страницами:/proc/[pid of VM process]/numa_maps
7f572c000000 default anon=262143 dirty=262143 N2=262113 ...
Так почему же не все страницы в Node2 можно перенести в Node0? В чем здесь проблема?
Ответы:
Вы хотите
migratepages
двоичный файл вnumactl
пакете.Использование и пример
Ограничения
Аппаратное обеспечение виртуальной машины
Страницы могут быть заблокированы для узла, например. если они связаны с аппаратным проходом и представляют оборудование, расположенное на определенном узле.
Свободная память и размер страницы
Очевидно, вам нужно достаточно свободной памяти на узле назначения, но она также должна быть не слишком фрагментированной для перемещения больших страниц. Если одна из страниц является непрерывным выделением большого порядка, а свободная память узла назначения не имеет достаточно больших свободных областей, то перемещение большой страницы может завершиться неудачно (в зависимости от того, какое сжатие было запущено и успешно).
источник