内核线程中的NAPI轮询

2020-10-25 11:13:59

对LWN用户的好处订阅LWN的主要好处是帮助我们保持发布,但除此之外,订阅者可以立即访问所有网站内容和访问许多额外的网站功能。今天就来报名吧!

管理大量网络流量的系统最终会将其可用CPU时间的很大一部分专门用于网络堆栈本身,其中大部分工作是在软件中断环境中完成的,这在很多方面都会有问题。然而,一旦王伟发布的这个补丁系列被合并到主线上,这种情况可能会改变。一旦数据包到达网络接口,内核通常必须执行相当数量的协议处理工作,然后才能将数据包中的数据传送到等待它的用户空间应用程序。曾几何时,当数据包到达时,网络接口会中断CPU;内核会确认中断,然后触发软件中断来执行此处理工作。这种方法的问题在于,在繁忙的系统上,每秒可能会有数千个数据包到达;处理相应的数千个硬件中断可能会使系统陷入困境。这个问题的解决方案在2003年以一种机制的形式合并,当时被称为newAPI&34;或";napi&34;。支持NAPI的驱动程序可以在大多数时间禁用数据包接收中断,并依赖网络堆栈以频繁的间隔轮询新数据包。轮询可能看起来效率不高,但在繁忙的系统上,内核轮询时总会有新的数据包;然后驱动程序可以一次处理所有等待的数据包。通过这种方式,一次轮询可以取代数十个硬件中断。自2003年以来,NAPI有了很大的发展,但有一个方面保持不变:它仍然运行在软件中断模式下。这些中断一旦由内核排队,将在下一次从硬件中断返回或下一次从内核返回到用户模式时处理。因此,它们在基本上随机的上下文中运行,从当时碰巧正在运行的任何无关进程中窃取时间。软件中断对于系统管理员来说很难管理,如果它们长时间运行,可能会造成令人惊讶的延迟。出于这个原因,内核开发人员多年来一直希望减少或消除它们的使用;不过,它们是一种与内核核心部分紧密相连的旧机制,很难摆脱。Wang的补丁程序集(包含Paolo Abeni、Felix Fietkau和Jakub Kicinski的工作)不能消除软件中断,但它是朝着这个方向迈出的可能一步。应用这些补丁后,内核会选择性地(在管理员控制下)为每个启用NAPI的网络接口创建单独的内核线程。之后,NAPI轮询将在该线程的上下文中进行,而不是在软件中断中进行。这个补丁程序集基本上没有改变需要完成的工作量,但是工作方式发生了很大的变化。一旦NAPI轮询移动到它自己的内核线程,它就会变得更加可见,并受管理员的控制。内核线程可以更改其优先级,并且可以将其绑定到一组特定的CPU上,从而允许管理员根据系统的用户空间工作负荷来调整该工作是如何完成的。同时,CPU调度器将更好地理解NAPI轮询所需的CPU时间,并可以避免运行时CPU过载。相反,处理软件中断所花费的时间对于调度器几乎是不可见的。补丁程序集发布的基准测试结果并不多;这些可用的结果表明,使用线程模式时可能会略微增加开销。以高速率处理数据包的用户往往会为每一纳秒而烦恼,但即使是他们也可能会发现,如果这些结果成立的话,也没什么好争辩的。同时,这些用户还应该看到他们的用户空间代码的更多确定性调度,这也很重要。