【问题标题】:Optimize socket data transfer over loopback wrt NUMA通过 NUMA 环回优化套接字数据传输
【发布时间】:2015-07-02 08:09:51
【问题描述】:

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

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

我的问题是:

  • 我是否正确,这在 Linux 中目前没有完成?
  • 我认为这是否可行?
  • 我应该研究哪些内核 API 或现有驱动程序来帮助完成这样一个版本的环回?

【问题讨论】:

  • 为什么不使用Unix socket
  • @artlessnoise:感谢您的建议! unix 域套接字的源代码还显示了与不同 CPU 通信时的简单数据副本。我想避免 QPI 的阻塞特性,并允许硬件辅助 DMA 执行数据传输。
  • 嗯,我明白了。套接字需要复制,因为套接字的每一端(很可能)是一个不同的进程。内存到内存 DMA 实际上并不常见(在硬件中可以找到)。有一个DMA infra-structure,需要将其插入网络堆栈。 Unix 套接字 对我来说更有意义。其他可能性是COW;但这取决于每个流程中的用例。
  • 我看到大部分都是在iov_iter.c中实现的。还有一个额外的问题是进程空间中的内存甚至可能没有被映射(它处于交换或分页状态)。内存到内存 DMA 需要物理 RAM 中的所有内容。此外,如果您实际使用memcpy(),那是幸运的,因为copy_from_user 等通常具有更高的开销。我不确定 x86 是否使用 DMA 代码;可能只有 PPC 和 ARM。

标签: linux-kernel x86 x86-64 dma numa


【解决方案1】:

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

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

通过 DMA 引擎卸载 I/OAT 复制 一个有趣的异步特性当然是 I/OAT 复制卸载。 icopy.flags = KNEM_FLAG_DMA;

一些作者说它没有硬件 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多