【问题标题】:SoftIRQs and Fast Packet Processing on Linux networkLinux 网络上的 SoftIRQ 和快速数据包处理
【发布时间】:2016-06-22 15:48:54
【问题描述】:

我一直在阅读有关 Linux 性能调整的文章,以便在接收金融市场数据时获得最快的数据包处理时间。我看到当 NIC 接收到一个数据包时,它通过 DMA 将其放入内存中,然后引发一个 HardIRQ - 这反过来又设置了一些 NAPI 设置并引发了一个 SoftIRQ。 SoftIRQ 然后使用 NAPI/设备驱动程序通过轮询从 RX 缓冲区读取数据,但这仅在有限的时间内运行(net.core.netdev_budget,默认为 300 个数据包)。这些是参考运行 ubuntu 的真实服务器,带有 solarflare NIC 我的问题如下:

  1. 如果每个 HardIRQ 引发一个 SoftIRQ,并且设备驱动程序在 1 go (netdev_budget) 中读取多个数据包,那么在 1 go 中从 RX 缓冲区耗尽的每个数据包引发的 SoftIRQ 会发生什么情况(每个收到的包会引发一个硬中断,然后是软中断)?这些在排队吗?

  2. 为什么 NAPI 使用轮询来耗尽 RX_buffer?系统刚刚生成了一个 SoftIRQ 并且正在读取 RX 缓冲区,那为什么还要轮询呢?

  3. 大概,通过 softirq 排空 RX_Buffer,只会发生在 1 个特定的 RX_Buffer 中,而不是跨多个 RX_Buffer?如果是这样,那么增加 netdev_budget 可以延迟其他 RX_buffers 的处理/耗尽?或者可以通过将不同的 RX_buffers 分配给不同的内核来缓解这种情况?

  4. 有一些设置可以确保 HardIRQ 被立即提出和处理。但是,SoftIRQ 可能会在以后处理。是否有设置/配置来确保与网络 RX 相关的 SoftIRQ 也被优先处理且没有延迟?

【问题讨论】:

  • 这可能更适合 Linux/Ubuntu Stack Exchange 站点之一。

标签: linux ubuntu networking


【解决方案1】:

我写了一篇综合博文,解释了您的问题的答案以及关于调优、优化、分析和理解整个 Linux 网络堆栈here 的所有其他内容。

回答您的问题:

  1. 在处理 softirq 时驱动程序引发的 sofirq 什么也不做。这是因为 NAPI 帮助程序代码在尝试引发 softirq 之前首先检查 NAPI 是否已经在运行。即使 NAPI 没有检查,您也可以see from the softirq source 将 softirqs 实现为位向量。这意味着一个软中断只能是1(待处理)或0(非待处理)。当它设置为 1 时,将其设置为 1 的额外调用将​​无效。

  2. softirq 用于启动 NAPI 轮询循环并控制 NAPI 轮询,因此它不会占用 100% 的 CPU 使用率。 NAPI 轮询循环只是一个 for 循环,softirq 代码管理它可以花费多少时间以及它有多少预算。

  3. 每个处理数据包的 CPU 都可以使用全部预算。因此,如果预算设置为 300,并且您有 2 个 CPU,则每个 CPU 可以处理 300 个数据包,每个数据包总共 600 个。仅当您的 NIC 支持多个 RX 队列并且您已将 IRQ 分配到单独的 CPU加工。如果您的 NIC 没有,您可以使用 Receive Packet Steering 来帮助解决此问题 (RPS)。有关更多信息,请参阅我上面的博文。

  4. 不,没有此设置。请注意,softirq 在提升它们的同一 CPU 上运行。因此,如果您将 RX 队列 1 的硬中断处理程序设置为 CPU 16,那么软中断将在 CPU 16 上运行。您可以做的一件事是:将硬中断设置为特定的 CPU,并将使用该数据的应用程序设置为相同的CPU。将所有其他应用程序(如 cron 作业、后台任务等)固定到其他 CPU - 这确保只有 hardirq 处理程序、softirq 和将处理数据的应用程序可以运行。

如果您希望读取延迟极低的网络数据包,您应该尝试使用名为 busy polling 的新 Linux 内核网络功能。它可用于帮助最小化和减少网络数据包处理延迟。使用此选项会增加 CPU 使用率。

【讨论】:

  • 谢谢@joe-damato。你的博文很有帮助。作为后续行动 - 我有一个带有配对 rx 和 tx 队列(8 套,8 核机器)的 solarflare nic,每套共享一个 IRQ 号。我使用 smp_affinity 来设置哪个 irq 由哪个核心处理。但是,这也将确保传输 (tx) 中断也由同一内核处理。这将如何与 xps 一起使用?还有一种方法可以查看/设置哪个 tx 队列用于特定的应用程序/tcp 连接?
  • 嗨@Nidhi 听起来可能需要一个完全独立的问题而不是评论:) 我的答案是否有任何遗漏才能被接受?
  • 嘿乔,你知道这个问题域的当前状态吗?事情似乎发生了很大变化,您的文章不见了。
猜你喜欢
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多