【问题标题】:How many maximum different CPU-Cores can be used to processing of one IP-packet?最多可以使用多少个不同的 CPU 内核来处理一个 IP 数据包?
【发布时间】:2016-04-16 08:18:11
【问题描述】:

例如,我们有 1 个具有 8 个内核的 CPU。 一个 IP 包通过 Eth0->TCP/IP->App 时最多可以使用多少个不同的 CPU-Core 来处理它(不包括应用程序中的处理)?

例如,是否可以是 3 个 CPU 核:

  1. 进程硬件中断
  2. 处理校验和计算
  3. 进程复制内核空间 -> 用户空间(其指针已发送到套接字)

这对性能非常重要,因为内核之间的每次数据传输都非常昂贵。

【问题讨论】:

  • 这是一个非常有趣的问题。我不确定你为什么认为这很重要,但从内核设计的角度来看,这很有趣。
  • 在我看来,一种更简单、更有成效的并行方法是让不同的内核处理不同的数据包。并且 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


【解决方案1】:

一般来说,您将在一个内核上处理中断,有可能参与处理它的实际内核工作将发生在另一个内核上,最后将其交给在第三个内核上运行的应用程序。在某些操作系统上,您可以设置进程亲和性以及中断处理程序亲和性,以避免数据反弹。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2014-04-13
    • 2013-04-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多