gpt4 book ai didi

linux - Linux 网络上的 SoftIRQ 和快速数据包处理

转载 作者:太空狗 更新时间:2023-10-29 11:07:49 35 4
gpt4 key购买 nike

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

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

  2. 为什么 NAPI 使用轮询来耗尽 RX_buffer?系统刚产生SoftIRQ,正在读取RX buffer,那为什么要轮询呢?

  3. 据推测,通过 softirq 耗尽 RX_Buffer 只会发生在 1 个特定的 RX_Buffer 而不是跨越多个 RX_Buffer?如果是这样,那么增加 netdev_budget 可以延迟其他 RX_buffers 的处理/耗尽?还是可以通过为不同的内核分配不同的 RX_buffer 来缓解这种情况?

  4. 有一些设置可确保立即引发和处理 HardIRQ。但是,SoftIRQ 可能会在稍后处理。是否有设置/配置来确保与网络 RX 相关的 SoftIRQ 也得到最高优先级处理且没有延迟?

最佳答案

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

问题的答案:

  1. 驱动程序在处理软中断时引发的 sofirq 不执行任何操作。这是因为 NAPI 帮助程序代码在尝试引发 softirq 之前首先检查 NAPI 是否已经在运行。即使NAPI没有检查,你也可以see from the softirq source softirqs 被实现为一个位向量。这意味着 softirq 只能是 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. 不,没有这方面的设置。请注意,软中断在引发它们的同一 CPU 上运行。因此,如果您将 RX 队列 1 的 hardirq 处理程序设置为 CPU 16,则软中断将在 CPU 16 上运行。您可以做的一件事是:将您的 hardirq 设置为特定的 CPU,并将使用该数据的应用程序设置为相同的CPU。将所有其他应用程序(如 cron 作业、后台任务等)固定到其他 CPU——这确保只有 hardirq 处理程序、softirq 和将处理数据的应用程序可以运行。

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

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

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com