我正在尝试在嵌入式Linux环境上测试 NAPI 功能。我使用“pktgen”生成了大量数据包,并尝试在/proc/interrupts处验证我的网络接口(interface)的中断计数。

我发现中断计数相对小于生成的数据包。
另外,我正在尝试将' netdev_budget '的值从1调整为1000(默认值为300),以便在增加netdev_budget时可以观察到中断计数的减少。

但是,增加netdev_budget似乎无济于事。该中断类似于netdev_budget设置为300时观察到的中断计数。

所以这是我的查询:

  • “netdev_budget”对NAPI有什么影响?
  • 我可以/应该调整其他哪些参数以观察中断计数的变化?
  • 是否可以使用其他方法在Linux上测试NAPI功能?(除了直接查看网络驱动程序代码之外)

    任何帮助都非常感激。

    提前致谢。

    最佳答案

    我写了一个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使用率。如果设备在其时间分配期间未接收到足够的数据包以进行处理,则将hardirqs设为可接受的,并禁用NAPI。
  • 如果支持,还可以尝试修改NIC的IRQ合并设置。有关如何执行此操作以及确切含义的更多信息,请参见上面的博客文章。
  • 您应该将监视添加到/proc/net/softnet_stat文件。该文件中的字段可以帮助您确定正在处理多少个数据包,是否用完了时间等。

  • 请允许我考虑的一个问题:

    为什么您的hardirq率很重要?直接无关紧要。 NIC驱动程序中的hardirq处理程序应做的工作尽可能少,因此对系统来说,执行很多操作可能不是问题。如果是这样,您应该仔细测量它,因为这似乎不太可能。但是,您可以调整IRQ合并设置和IRQ CPU亲和力来分配处理,以分别更改由NIC生成和由特定CPU处理的hardirq的数量。

    您应该考虑您是否对数据包处理吞吐量或数据包处理延迟更感兴趣。根据所关注的问题,可以适当地调整网络堆栈。

    请记住:要完全调整和优化Linux网络堆栈,您必须监视和调整每个组件。它们都是交织在一起的,仅监视堆栈的一个方面是困难的(并且常常是不够的)。

    10-01 15:17