在 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
Run Code Online (Sandbox Code Playgroud)
我想把Node2中的所有页面都迁移到Node0。但是使用该numa_migrate_pages功能后,只迁移了部分页面,如下图所示:
Node0: 7952 pages
Node1: 1538 pages
Node2: 262113 pages
Node3: 552 pages
Run Code Online (Sandbox Code Playgroud)
然后我打开文件,发现Node2上剩下的大部分页面都是匿名和脏页:/proc/[pid of VM process]/numa_maps
7f572c000000 default anon=262143 dirty=262143 N2=262113 ...
Run Code Online (Sandbox Code Playgroud)
那么为什么不能将Node2中的所有页面都迁移到Node0上呢?这里有什么问题?
您想要包migratepages中的二进制文件numactl。
sudo migratepages $VM_PID $SRC_NODE $DEST_NODE
sudo migratepages 12345 2 0
Run Code Online (Sandbox Code Playgroud)
页面可以被锁定到节点,例如。如果它们与硬件直通相关并且它们代表位于特定节点上的硬件。
显然,目标节点上需要足够的可用内存,但它也需要不要太碎片化才能移动大页面。如果其中一页是大顺序连续分配,并且目标节点可用内存没有足够大的可用区域,则移动大页面可能会失败(取决于触发和成功的压缩)。
| 归档时间: |
|
| 查看次数: |
1572 次 |
| 最近记录: |