我正在尝试在嵌入式Linux环境中测试 NAPI 功能。我使用过' pktgen'生成大量数据包并尝试在 / proc / interrupts 验证我的网络接口的中断计数。
我发现中断计数比生成的数据包要少。 此外,我正在尝试调整' netdev_budget '值从1到1000(默认值为300),这样我可以观察到netdev_budget增加时中断计数的减少。
然而,增加netdev_budget似乎没有帮助。中断类似于netdev_budget设置为300时观察到的中断计数。
所以这是我的疑问:
' netdev_budget'有什么影响?在NAPI?
我可以/应该调整哪些其他参数来观察中断计数的变化?
我可以用其他方法在Linux上测试NAPI功能吗?(除了直接查看网络驱动程序代码)
任何帮助都很有帮助。
提前致谢。
答案 0 :(得分:5)
我写了一个comprehensive blog post about Linux network tuning,它解释了有关监控,调优和优化Linux网络堆栈(包括NAPI权重)的所有内容。看一看。
请记住:在NAPI启动时,某些驱动程序不禁用NIC中的IRQ。他们应该这样做,但有些根本就没有。您可以通过检查驱动程序中的硬IRQ处理程序来验证这一点,以查看是否正在禁用硬IRQ。
请注意,在某些情况下会重新启用硬IRQ,如博文及以下所述。
至于你的问题:
增加netdev_budget
会增加NET_RX softirq可以处理的数据包数量。可以处理的数据包数量也受限制,该时间限制不可调。这是为了防止NET_RX softirq占用100%的CPU使用率。如果设备在时间分配期间没有收到足够的数据包进行处理,则硬件重新启用并且NAPI被禁用。
如果支持,您还可以尝试修改NIC的IRQ合并设置。请参阅上面的博客文章,了解有关如何执行此操作及其含义的更多信息。
您应该将监控添加到/proc/net/softnet_stat
文件中。此文件中的字段可以帮助您确定正在处理的数据包数量,是否用完了等等。
如果我愿意,您可以考虑一个问题:
为什么你的hardirq率很重要?直接来说,这可能并不重要。 NIC驱动程序中的hardirq处理程序应该尽可能少地工作,因此执行很多操作可能不是系统的问题。如果是,你应该仔细测量,因为它似乎不太可能。不过,您可以调整IRQ合并设置和IRQ CPU亲和性来分配处理,以分别改变由NIC生成并由特定CPU处理的硬件数。
您应该考虑是否可能对数据包处理吞吐量或数据包处理延迟更感兴趣。根据需要考虑的因素,您可以适当调整网络堆栈。
请记住:要完全调整和优化Linux网络堆栈,您必须监视和调整每个组件。它们都交织在一起,很难(通常也不够)监控和调整堆栈的一个方面。