【发布时间】: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