微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将物理拆分的虚拟大页面移动到另一个 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 举报,一经查实,本站将立刻删除。