在 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上呢?这里有什么问题?