如何将进程的所有内存页从一个NUMA节点迁移到另一个NUMA节点?

如何将进程的所有内存页从一个NUMA节点迁移到另一个NUMA节点?

在Linux中,我想在运行时将KVM虚拟机的内存页面从一个NUMA节点迁移到另一个NUMA节点。但我找不到任何接口可以在 KVM 虚拟机管理程序中或使用 libvirt API 执行此操作。然后我尝试使用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呢?这里有什么问题?

答案1

您想要包migratepages中的二进制文件numactl

用法和示例

sudo migratepages $VM_PID $SRC_NODE $DEST_NODE
sudo migratepages 12345 2 0

局限性

虚拟机硬件

页面可以被锁定到节点,例如。如果它们与硬件直通相关并且它们代表位于特定节点上的硬件。

可用内存和页面大小

显然,目标节点上需要足够的可用内存,但它也需要不要太碎片化才能移动大页面。如果其中一页是大顺序连续分配,并且目标节点可用内存没有足够大的可用区域,则移动大页面可能会失败(取决于触发和成功的压缩)。

相关内容