Linux的NUMA感知命名共享内存

6
Windows API 提供CreateFileMappingNuma函数 (http://msdn.microsoft.com/en-us/library/windows/desktop/aa366539(v=vs.85).aspx) 用于在特定NUMA节点上创建命名的共享内存空间。

到目前为止,我还没有找到Linux的等效功能。

我的当前方法如下:

  1. 分配命名的共享内存(使用shm_open(...))
  2. 确定当前的NUMA节点(使用numa_move_pages(...))
  3. 将页面移动到目标节点(再次使用numa_move_pages(...))

有人知道更好的方法吗?

编辑:记录一下:我的建议实现按预期工作!


请注意,映射相同内存的其他应用程序可能稍后将其移动到不同的节点。此外,将内存放在“消费者”节点上总是更好的选择,因为与从远程内存读取相比,对远程内存进行写入通常不会停顿。 - user405725
我之所以将内存移动到特定节点,正是为了让数据靠近CPU。然而,调度程序自己也很擅长做到这一点,我发现了这一点;-)。这样做的唯一好处是,所有的内存页面已经在正确的位置上,因此您不需要在程序开始时进行“预热”阶段。 - Ben
1个回答

0

听起来没错。请注意,在调用shm_open()/ftruncate()时,没有页面被分配(不要忘记使用ftruncate()设置大小!)。内核只是创建vma并等待将来的代码访问将页面故障到物理内存中。因此,在这种状态下调用numa_move_pages()可能会产生在相关NUMA节点中创建和填充新页面的效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接