我一直在阅读有关 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 缓冲区,那么为什么要进行轮询呢?
据推测,通过软中断耗尽 RX_Buffer 只会发生在 1 个特定的 RX_Buffer 上,而不会发生在多个 RX_Buffer 上?如果是这样,那么增加 netdev_budget 会延迟其他 RX_buffer 的处理/耗尽吗?或者可以通过将不同的 RX_buffer 分配给不同的内核来缓解这种情况吗?
有一些设置可以确保立即引发和处理 HardIRQ。然而,SoftIRQ 可能会在稍后处理。是否有设置/配置来确保与网络 RX 相关的 SoftIRQ 也得到最高优先级且无延迟的处理?
答案1
关于第四个问题的回答,
是的 网络网卡是与软中断相关的外设,因为软中断是所有下半部机制中最高优先级的。
因此,为了防止延迟可能导致随后丢包,使用了软中断。
基本上,NAPI 机制还旨在处理那些由于某些原因而内核无法使用中断机制处理的速度的数据包。
我建议直接阅读 LDD3 中网络驱动程序的章节。这里是对此有帮助的链接。