读取文件会导致NIC中断

时间:2016-10-08 20:18:35

标签: linux filesystems mips jffs2

基于MIPS处理器和Linux 2.6的电路板存在一个非常奇怪的问题。所有传入的以太网数据包都有NIC中断。如果我发送10.000个数据包,我可以看到发生了10.000个NIC中断。

START SYSTEM

SEND 10k PACKETS

/mnt/system # cat /proc/interrupts
          CPU0       
24:      10000         MIPS  NIC
29:       7192         MIPS  timer
30:          0         MIPS  UART1
31:       3092         MIPS  serial

ERR:          0

但是,在我打开和关闭文件系统中的文件(用零或常规填充)后,生成的NIC中断要少得多。例如,对于10k数据包只有2-7k中断。它对系统性能有不利影响,但重新启动后,所有的NIC中断都可以了。

START SYSTEM

std::fstream f;
f.open("/mnt/system/myfile");
f.close(); 

WAIT FOR SOME TIME

SEND 10k PACKETS

/mnt/system # cat /proc/interrupts
          CPU0       
24:       2045         MIPS  NIC
29:       7192         MIPS  timer
30:          0         MIPS  UART1
31:       3092         MIPS  serial

ERR:          0

文件系统是jffs2,闪存驱动器是32M NOR串行设备。 为什么读取文件会导致NIC中断直到重启?

1 个答案:

答案 0 :(得分:2)

警告:这可能不是一个完整的解决方案,但我有一些想法。可能需要更多信息/测试。

当你[系统没有]做其他事情时,网卡驱动程序足以响应中断,ISR将完成对数据包的处理< em>在之前下一个数据包到达。 (即)传入数据包和NIC中断之间存在一对一的关系。

如果您有其他系统活动,这可能延迟进入NIC驱动程序的ISR。此外,由于资源竞争(例如,锁定,kmalloc等),此其他活动可能会降低NIC驱动程序中的处理速度。

同时,更多NIC 数据包到达。最终/最终进入NIC ISR时,它会看到多个数据包未决。它将处理所有这些,没有离开ISR。因此,它可能在每个中断上处理(例如)5个数据包,因此中断计数减少了5倍。

这是大多数“智能”NIC卡和驱动程序的功能。它实际上通过大量NIC流量提高了吞吐量。通常,较少的NIC中断是良好的事物,因为它减少了重复进入/退出ISR的浪费开销。

这实际上取决于数据包到达率和[平均]间隔。

因此,真正的问题是:“当中断计数减少时,您是丢失数据包/数据还是只看到性能损失?”

而且,您如何衡量系统性能差异?

是否使用了相关文件系统(例如,它是root fs)?或者,您的程序是否打开文件访问fs [除了安装它]

我不熟悉jffs2或你的闪存驱动程序,所以我会问你是否怀疑做了一些会在很长一段时间内禁用中断的事情?

<强>更新

我刚刚注意到你使用的是linux 2.6版,那个内核已经有10年了。它已经过了寿命终结,所以它可能没有为驱动程序修复错误,除非平台供应商提供它们。

因此,另一件需要考虑的事情是,任何驱动程序都可能存在导致性能问题的错误。在更现代的内核中修复驱动程序的可能性很大。

如果可以的话,您可能希望切换到更新的内核。如果没有,你可能会留下[不值得]的任务,将较新的驱动程序反向移植到较旧的内核[或至少选择一些错误修复]。