【发布时间】:2016-04-16 08:18:11
【问题描述】:
例如,我们有 1 个具有 8 个内核的 CPU。 一个 IP 包通过 Eth0->TCP/IP->App 时最多可以使用多少个不同的 CPU-Core 来处理它(不包括应用程序中的处理)?
例如,是否可以是 3 个 CPU 核:
- 进程硬件中断
- 处理校验和计算
- 进程复制内核空间 -> 用户空间(其指针已发送到套接字)
这对性能非常重要,因为内核之间的每次数据传输都非常昂贵。
【问题讨论】:
-
这是一个非常有趣的问题。我不确定你为什么认为这很重要,但从内核设计的角度来看,这很有趣。
-
在我看来,一种更简单、更有成效的并行方法是让不同的内核处理不同的数据包。并且 2 和 3 可以从 CPU 中卸载。如果每次中断可以处理多个数据包,则可以摊销 1 的成本。
-
大部分硬件已经支持2。3取决于系统设计,但很难避免。它也由堆栈的不同部分完成。完全忽略数据包的处理是在不同级别完成的,因此是在不同的模块中完成的。至少原始以太网帧通常不会移入/移出用户空间。一般来说,内核应该保持局部性,但这不仅仅是以太网帧的问题。
-
@John Hascall 是的,我可以在 1 步中使用 NAPI 进行 irq-coalescing。但是当 1 个以太网帧包含整个 1 个 IP 数据包时,硬件解复用(当不同的内核处理不同的数据包时)需要使用大帧 (JIMBO) 和小 IP 数据包,或者每个 CPU 核心使用 1 个 Eth:stackoverflow.com/q/18408363/1558037 和这个问题正是关于:这些步骤的成本是多少,以及在这些步骤中使用以太网适配器和硬件 TCP 卸载引擎的核心之间的数据传输(卸载一些步骤)。
-
不确定“核心之间的数据传输”是什么意思。除了一些管理数据之外,核心之间没有太多需要传输的内容,除非您指的是 NUMA 系统架构。虽然真的很有趣,但这个问题对于 SO 来说太宽泛了——变量太多。这不是一个讨论论坛。
标签: c sockets tcp linux-kernel linux-device-driver