通过环回来优化套接字数据传输NUMA
问题描述:
我正在研究Linux环回和IP网络数据处理,而且似乎没有代码可以涵盖2个不同套接字上的CPU通过环回传递数据的情况。通过环回来优化套接字数据传输NUMA
我认为应该有可能检测到这种情况,然后应用硬件DMA,以避免NUMA争用将数据复制到接收器。
我的问题是:
- 我是正确,这不是目前在Linux中做了什么?
- 我认为这是可能的正确轨道?
- 我应该研究哪些内核API或现有驱动程序来帮助完成这样的环回版本?
答
有几个项目/企图接口添加到拟用于HPS(MPI)内存到内存的DMA引擎:
- KNEM内核模块 - 高性能节点内的MPI通信 - http://knem.gforge.inria.fr/
- 交叉内存连接(CMA) - 新的系统调用
process_vm_readv
,process_vm_writev
:http://man7.org/linux/man-pages/man2/process_vm_readv.2.html
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。
为什么不使用使用[* Unix套接字*](http://en.wikipedia.org/wiki/Unix_domain_socket)? –
@artlessnoise:谢谢你的建议!与其他CPU通信时,unix域套接字的源代码也显示简单的数据副本。我想避免QPI的阻塞性质,并允许硬件辅助DMA执行数据传输。 – jxh
嗯,我明白了。套接字需要复制,因为套接字的每一端(很可能)都是不同的进程。内存到内存DMA实际上并不常见(在硬件中找到)。有一个[DMA基础结构](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/dmaengine.h#n66),它需要被插入到网络堆栈中。对于* Unix套接字*我更有意义。其他可能性是* COW *;但它取决于每个进程中的用例。 –