通过环回来优化套接字数据传输NUMA

问题描述:

我正在研究Linux环回和IP网络数据处理,而且似乎没有代码可以涵盖2个不同套接字上的CPU通过环回传递数据的情况。通过环回来优化套接字数据传输NUMA

我认为应该有可能检测到这种情况,然后应用硬件DMA,以避免NUMA争用将数据复制到接收器。

我的问题是:

  • 我是正确,这不是目前在Linux中做了什么?
  • 我认为这是可能的正确轨道?
  • 我应该研究哪些内核API或现有驱动程序来帮助完成这样的环回版本?
+0

为什么不使用使用[* Unix套接字*](http://en.wikipedia.org/wiki/Unix_domain_socket)? –

+0

@artlessnoise:谢谢你的建议!与其他CPU通信时,unix域套接字的源代码也显示简单的数据副本。我想避免QPI的阻塞性质,并允许硬件辅助DMA执行数据传输。 – jxh

+0

嗯,我明白了。套接字需要复制,因为套接字的每一端(很可能)都是不同的进程。内存到内存DMA实际上并不常见(在硬件中找到)。有一个[DMA基础结构](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/dmaengine.h#n66),它需要被插入到网络堆栈中。对于* Unix套接字*我更有意义。其他可能性是* COW *;但它取决于每个进程中的用例。 –

有几个项目/企图接口添加到拟用于HPS(MPI)内存到内存的DMA引擎:

KNEM可以使用I/OAT在某些Intel DMA引擎微体系结构和尺寸

I/OAT副本卸载通过DMA引擎 一个有趣的异步功能肯定是I/OAT副本卸载。 icopy.flags = KNEM_FLAG_DMA;

有些作者说,这对新的英特尔微架构的硬件DMA引擎没有任何好处:

http://www.ipdps.org/ipdps2010/ipdps2010-slides/CAC/slides_cac_Mor10OptMPICom.pdf

I/OAT只为过时的架构

有用CMA被宣布为类似项目:http://www.open-mpi.org/community/lists/devel/2012/01/10208.php

这些系统调用被设计成允许快速的消息通过 允许消息传递到与单个复制操作 (而不是使用时,其将需要 例如双拷贝进行交换,共享存储器或管道)。

如果可以的话,你不应该使用套接字(尤其是tcp套接字)来传输数据,它们有很高的软件开销,当你在单机上工作时不需要这些开销。标准skb大小限制可能太小以至于无法有效使用I/OAT,因此网络堆栈可能不会使用I/OAT。