Ale*_*lex 5 linux networking x86 interrupt linux-kernel
在 Linux x86_64 内核 3.16 上处理网络数据包时,可以在不同的 CPU 内核上执行相同网络数据包的硬和软 IRQ 吗?
Hard-IRQ 引发 Soft-IRQ:http : //she-devel.com/Chaiken_ELCE2016.pdf
软 IRQ 可以在引发它们的硬 IRQ 之后直接运行,或者稍后在 ksoftirqd 中运行。
RSS在与 Hard-IRQ 相同的 CPU-Core 上引发Soft-IRQ:http : //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-IRQ:http : //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。