【发布时间】:2016-06-22 15:48:54
【问题描述】:
我一直在阅读有关 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 会发生什么情况(每个收到的包会引发一个硬中断,然后是软中断)?这些在排队吗?
为什么 NAPI 使用轮询来耗尽 RX_buffer?系统刚刚生成了一个 SoftIRQ 并且正在读取 RX 缓冲区,那为什么还要轮询呢?
大概,通过 softirq 排空 RX_Buffer,只会发生在 1 个特定的 RX_Buffer 中,而不是跨多个 RX_Buffer?如果是这样,那么增加 netdev_budget 可以延迟其他 RX_buffers 的处理/耗尽?或者可以通过将不同的 RX_buffers 分配给不同的内核来缓解这种情况?
有一些设置可以确保 HardIRQ 被立即提出和处理。但是,SoftIRQ 可能会在以后处理。是否有设置/配置来确保与网络 RX 相关的 SoftIRQ 也被优先处理且没有延迟?
【问题讨论】:
-
这可能更适合 Linux/Ubuntu Stack Exchange 站点之一。
标签: linux ubuntu networking