在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
局限性
虚拟机硬件
页面可以被锁定到节点,例如。如果它们与硬件直通相关并且它们代表位于特定节点上的硬件。
可用内存和页面大小
显然,目标节点上需要足够的可用内存,但它也需要不要太碎片化才能移动大页面。如果其中一页是大顺序连续分配,并且目标节点可用内存没有足够大的可用区域,则移动大页面可能会失败(取决于触发和成功的压缩)。