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

jxh*_*jxh 6 x86 x86-64 linux-kernel numa dma

我正在查看Linux环回和IP网络数据处理,似乎没有代码可以覆盖不同套接字上的2个CPU通过环回传递数据的情况.

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

我的问题是:

  • 我是否认为目前在Linux中没有这样做?
  • 我认为这可能在正确的轨道上?
  • 我应该学习哪些内核API或现有的驱动程序来帮助完成这种版本的环回?

osg*_*sgx 2

有多个项目/尝试将接口添加到旨在用于 HPS (mpi) 的内存到内存 DMA 引擎:

  • KNEM 内核模块 - 高性能节点内 MPI 通信 - http://knem.gforge.inria.fr/
  • 跨内存附加 (CMA) - 新系统调用process_vm_readvhttp:process_vm_writev //man7.org/linux/man-pages/man2/process_vm_readv.2.html

KNEM 可能在某些微架构和尺寸上使用 I/OAT Intel DMA 引擎

通过 DMA 引擎进行 I/OAT 复制卸载 一项有趣的异步功能无疑是 I/OAT 复制卸载。 icopy.flags = KNEM_FLAG_DMA;

一些作者表示,它在较新的 Intel 微架构上没有硬件 DMA 引擎的优势:

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

I/OAT 仅对过时的架构有用

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

这些系统调用旨在通过允许通过单个复制操作(而不是使用共享内存或管道时所需的双重复制)交换消息来实现快速消息传递。

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