用于Linux的支持NUMA的命名共享内存
问题描述:
Windows API提供CreateFileMappingNuma函数(http://msdn.microsoft.com/en-us/library/windows/desktop/aa366539(v=vs.85).aspx)以在特定的NUMA节点上创建指定的共享内存空间。用于Linux的支持NUMA的命名共享内存
到目前为止,我还没有找到Linux的等价函数。
我目前的做法是这样的:
- 名为分配共享内存(使用的shm_open(...))
- 确定当前NUMA节点(使用numa_move_pages(...))
- 移动页面到目标节点(再次使用numa_move_pages(...))
有没有人知道更好的方法?
编辑:备案:我建议的实施确实按预期工作!
答
听起来不错。请注意,在调用shm_open()/ fruncate()的地方没有分配页面(不要忘记ftruncate()来设置大小!)。内核只创建vma并等待将来的代码访问将页面错误地分配到物理内存中。因此,在这种状态下调用numa_move_pages()可能会在相关NUMA节点中创建和填充新页面。
请注意,映射相同内存的其他应用程序可能稍后将其移动到其他节点。最重要的是,“消费者”节点上的内存总是更好,因为与从远程内存读取相比,对远程内存的写入通常不会停滞。 – 2014-03-05 18:03:27
由于确切的原因,我将内存移动到特定的节点(以使数据靠近CPU)。不过,我发现,调度人员自己做得很好;-)。这提供的唯一好处是,所有的内存页面都已经在正确的位置,所以在程序开始时你没有“启动”阶段。 – Ben 2014-03-06 14:30:33