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

  • 如果每个 HardIRQ 引发一个 SoftIRQ,并且设备驱动程序在 1 go (netdev_budget) 中读取多个数据包,那么在 1 go 中从 RX 缓冲区中排出的每个数据包引发的 SoftIRQ 会发生什么情况(每个收到的包都会引发一个硬然后软 irq)?这些排队吗?
  • 为什么 NAPI 使用轮询来耗尽 RX_buffer?系统刚刚产生了一个SoftIRQ,正在读取RX缓冲区,那为什么还要轮询呢?
  • 据推测,通过 softirq 排空 RX_Buffer 只会发生在 1 个特定的 RX_Buffer 而不是跨多个 RX_Buffers?如果是这样,那么增加 netdev_budget 会延迟其他 RX_buffers 的处理/耗尽吗?或者可以通过将不同的 RX_buffers 分配给不同的内核来缓解这种情况吗?
  • 有一些设置可以确保立即引发和处理 HardIRQ。但是,SoftIRQ 可能会在稍后处理。是否有设置/配置来确保与网络 RX 相关的 SoftIRQ 也以最高优先级处理并且没有延迟?
  • 最佳答案

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

    回答您的问题:

  • sofirqs 在处理 softirq 时由驱动程序引发,什么也不做。这是因为 NAPI 帮助程序代码在尝试引发软中断之前首先检查 NAPI 是否已经在运行。即使 NAPI 没有检查,您也可以 see from the softirq source 将 softirqs 实现为位向量。这意味着软中断只能是 1 (pending) 或 0 (notpending)。当它设置为 1 时,将其设置为 1 的其他调用将不起作用。
  • softirq 用于启动 NAPI 轮询循环并控制 NAPI 轮询,因此它不会占用 100% 的 CPU 使用率。 NAPI 轮询循环只是一个 for 循环,softirq 代码管理它可以花费多少时间以及它有多少预算。
  • 每个 CPU 处理数据包可以花费全部预算。因此,如果预算设置为 300,并且您有 2 个 CPU,则每个 CPU 可以处理 300 个数据包,总共 600 个。这仅在您的 NIC 支持多个 RX 队列并且您已将 IRQ 分配到单独的 CPU 时才适用加工。如果您的 NIC 没有,您可以使用 Receive Packet Steering 来帮助解决此问题 (RPS)。有关更多信息,请参阅我上面的博客文章。
  • 不,没有这方面的设置。请注意,软中断在引发它们的同一 CPU 上运行。因此,如果您将 RX 队列 1 的硬中断处理程序设置为 CPU 16,那么软中断将在 CPU 16 上运行。您可以做的一件事是:将您的硬中断设置为特定 CPU,并将使用该数据的应用程序设置为相同CPU。将所有其他应用程序(如 cron 作业、后台任务等)固定到其他 CPU 上——这确保只有 hardirq 处理程序、softirq 和将处理数据的应用程序可以运行。

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

    关于linux - Linux 网络上的 SoftIRQ 和快速数据包处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37972854/

    10-15 14:19