可以在不同的 CPU 内核上执行相同网络数据包的硬和软 IRQ 吗?

Ale*_*lex 5 linux networking x86 interrupt linux-kernel

在 Linux x86_64 内核 3.16 上处理网络数据包时,可以在不同的 CPU 内核上执行相同网络数据包的硬和软 IRQ 吗?

  • Hard-IRQ 引发 Soft-IRQhttp : //she-devel.com/Chaiken_ELCE2016.pdf

    软 IRQ 可以在引发它们的硬 IRQ 之后直接运行,或者稍后在 ksoftirqd 中运行。

  • RSS在与 Hard-IRQ 相同的 CPU-Core 上引发Soft-IRQhttp : //balodeamit.blogspot.ru/2013/10/receive-side-scaling-and-receive-packet.html

    在多队列 (RSS) 的情况下,硬件中断将转到匹配的 CPU 处理器,该处理器还将负责 softIRQ 处理。

  • 在单队列的情况下,没有 RPS,Soft-IRQ 在与 Hard-IRQ 相同的 CPU-Core 上处理,但使用 RPS,Soft-IRQ 在另一个 CPU-Core 上处理而不是 Hard-IRQhttp : //balodeamit.blogspot.ru /2013/10/receive-side-scaling-and-receive-packet.html

    在单队列的情况下,产生的硬件中断来自单个队列,同一个 CPU 也负责处理 softIRQ。如果在单声道队列上启用 RPS,传入的数据包将被散列,负载分布在多个 CPU 处理器上。

  • RPS 在其他 CPU 核心上提高 Soft-IRQ 而不是 Hard-IRQ,它增加了处理器间中断 (IPI) 的速率:https ://en.wikipedia.org/wiki/Interrupt#Performance_issues

    不利的一面是,RPS 会增加处理器间中断 (IPI) 的速率。


是否意味着:

  • 以太网适配器 (NIC) 使用 NIC-DMA 将数据包复制到套接字缓冲区 (mbuf),然后 NIC在 CPU Core-N 上调用Hard-IRQ

  • 然后这个 Hard-IRQ 的代码只不过是通过使用 RPS在不同的 CPU Core-M 上调用Soft-IRQ

  • 在此 CPU Core-M 上,Soft-IRQ 使用内核空间中的 TCP/IP 堆栈处理此数据包

  • 然后我们的应用程序通过使用read(,buf,)从套接字缓冲区(mbuf)获取数据到我们在CPU Core-K上的用户空间中的缓冲区

那是对的吗?

使用 RPS 时,可以在不同的内核上执行相同网络数据包的硬和软 IRQ 吗?

小智 0

我尝试解释我的理解,但可能不正确。请帮忙纠正我的答案。

首先,RPS和RSS的工作原理相同,都是通过哈希将irq/packet映射到特定的CPU核心,例如4元组、V(X)LAN标签等。不同之处在于RPS是在软件上实现的,而RPS是在软件上实现的。 RSS是在硬件上实现的,即NIC。因此,此博客( http://balodeamit.blogspot.ru/2013/10/receive-side-scaling-and-receive-packet.html )中的声明可能与其本身相悖。

其次,RFS 和 aRFS 还执行 CPU 控制。它们将irq/packet映射到与上层应用程序相同的核心以实现亲和性,例如由相同的NUMA节点处理。aRFS 是 RFS 的硬件版本。您可以参考这篇论文(https://dl.acm.org/doi/abs/10.1145/3452296.3472888)了解更多详细信息。

总之,硬中断和软中断可以被映射到相同的CPU核,但是具有不同的引导机制,例如RPS/RSS和RFS/aRFS。