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


10

在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?这是什么问题


3
粘贴文字时不要张贴图片。无法搜索图像或将图像粘贴到答案中,甚至无法在与您的显示器大不相同的显示器上读取图像(例如,在较大的高分辨率显示器上无法读取的小字体),或者视障用户使用屏幕阅读器软件(例如颚。
cas

我假设您以root身份运行numa迁移页面?
Lmwangi '16

@Lmwangi是的,我以root身份运行。
简森

Node0上是否有足够的可用页面来完成事务?
亚伦·沃尔斯坦

Answers:


1

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

用法与范例

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

局限性

虚拟机硬件

页面可以被锁定到节点,例如。如果它们与硬件传递有关,并且它们表示位于特定节点上的硬件。

可用内存和页面大小

您显然在目标节点上需要足够的可用内存,但是也不需要太分散以移动大页。如果页面之一是大顺序连续分配,并且目标节点的可用内存没有足够大的可用区域,则移动大页面可能会失败(取决于触发和后续压缩)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.