首页 > 解决方案 > 将(物理拆分的)虚拟大页面移动到另一个 numa 节点

问题描述

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

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

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

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

标签: linuxmemorynuma

解决方案


推荐阅读