NAPI 在 IRQ Coalesce 之前有什么优势?

What are the advantages NAPI before the IRQ Coalesce?

众所周知,有两种方法可以避免高负载网络中硬件中断的一些开销,当硬件中断太多时,切换到它们会花费太多时间。这对于程序风格的性能和选择方法非常重要。

  1. NAPI (New API) - Does not use hardware interrupts, and polls 以太网设备每隔一段时间。 Linux内核默认使用中断驱动模式,只有当传入的数据包流量超过一定阈值时才会切换到轮询模式。

http://en.wikipedia.org/wiki/New_API The kernel can periodically check for the arrival of incoming network packets without being interrupted, which eliminates the overhead of interrupt processing.

  1. Interrupt coalescing - Uses hardware interrupts, but if interrupt occur, then disables interrupt and starts poll,持续一段时间后,轮询终止,中断被激活。

https://en.wikipedia.org/wiki/Interrupt_coalescing a technique in which events which would normally trigger a hardware interrupt are held back, either until a certain amount of work is pending, or a timeout timer triggers.

这两种方法都没有显着的中断成本 - 这是默认中断驱动模式的优势。

但第二种方法 - 中断合并 更合理,因为它:

IRQ Coalesce 之前的 NAPI 有什么优势?

我将 NAPI 视为中断合并的一种形式。我想你的问题可能源于对NAPI的误解。首先,中断涉及到NAPI。还有,NAPI的轮询其实不是"in vain"。请记住,对于 NAPI,其思想是高吞吐量流量是突发的。在 "packet received interrupt" 发生后仅 "starts" NAPI。

这里简要概述了 NAPI 应该如何使用:

内核启动 "packet received" 中断,使用 NAPI 的网络设备驱动程序检测到。然后网络设备驱动程序 禁用与接收数据包相关的中断 并使用 NAPI,告诉 Linux 网络子系统轮询设备驱动程序。轮询函数由设备驱动程序实现,并传递给网络子系统,并包含设备驱动程序的数据包处理程序。当接收到足够的数据包或超时后,重新使能接收数据包中断,一切从头再来。

所以 NAPI 基本上只是 Linux 网络子系统中的一个集中式 API,用于支持中断合并以减少接收活锁情况。 NAPI 为设备驱动程序开发人员提供了一个干净的中断合并框架。 NAPI 并非一直 运行,而是仅在实际接收到流量时才会发生,这使其本质上是一种中断合并方案……至少在我的书中是这样。

注意:这都是在使用 NAPI 的网络设备驱动程序的上下文中,但实际上 NAPI 可用于任何有点打扰。这也是NAPI的好处之一。

如有理解错误,欢迎指出!

让我们从没有 napi 和中断合并开始。

第一种情况:活锁。这意味着当来自服务器进程的许多中断 post 不断发生时,CPU 仅处理中断并且永远不允许用户级进程 运行 并实际为请求提供服务。为此,我们创建了 napi,它以混合模式(中断 + 轮询)处理它。当中断发生时,处理它并轮询一段时间以解决后续请求。

第二种情况:优化。在引发中断之前,设备在将中断传递给 CPU 之前首先等待一位。在等待的过程中,其他请求可能很快完成,这样可以将多个中断合并为一个中断传递,从而降低中断处理的开销。

综上所述,他们之间没有冲突。它们适用于不同的情况,尽管 napi 也可以优化 CPU 开销。

参考:计算机系统设计原理。