将物理拆分的虚拟大页面移动到另一个 numa 节点

问题描述

我在一台有 2 个节点的 NUMA 机器上。架构为 x86_64 和 linux 内核版本 4.19.60。

接口 /sys/kernel/mm/transparent_hugepages/enabled 设置为“始终”。 在我的 C 程序中,我使用 malloc() 创建了一个数组,并使用 memset() 在物理内存中对其进行了故障处理。程序是单线程的,固定在node 0的core上,采用了first-touch memory的策略,所以所有的内存都去node 0。但是node 0的内存是碎片化的,从某种意义上说,没有多少物理巨大的内存可用页面(我用另一个程序手动导致)。使用 here 所示的代码,我可以在我的 C 程序中找到被分割成 512 个物理帧的数组的 * 虚拟 * 大页面的列表。如果一个虚拟大页面的第一个 4K 的 pfn 是 2MB 对齐的,那么很可能这个虚拟大页面被映射到一个物理大页面。否则,它不是。

我的目标是在我的程序中调用一些函数,将数组的(物理拆分的)虚拟大页面迁移到节点 1,在那里它们将合并为单个物理大页面。我首先想到使用 move_pages()。但是,我的测试表明,使用 2MB 对齐的页面地址调用 move_pages() 并且对于映射到 RAM 中的 512 4K 虚拟大页面,则只有第一个 4K 页面会移动。其余 511 将保持不变。所以这个方法行不通。

是否有其他方法可以尝试实现目标?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)