我有一个非常奇怪的问题,基于MIPS处理器和Linux 2.6的板。所有传入的以太网数据包都有网卡中断。如果我发送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个中断。它对系统性能有不利的影响,但在重新启动后,所有带有网卡中断的东西都恢复正常。
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, u盘为32M NOR串行设备。为什么读取文件会导致网卡中断直到重启?
警告:这可能不是一个完整的解决方案,但我有一些想法。可能需要更多的信息/测试。
当你不做[系统做]其他任何事情时,网卡驱动程序快足以响应中断,ISR将在下一个数据包到达之前完成对单个数据包的处理。(即)在传入数据包和NIC中断之间存在一对一的关系。
如果您有其他系统活动,这可能会延迟进入网卡驱动程序的ISR。此外,由于资源竞争(例如锁、kmalloc
等),这个其他活动可能会减慢网卡驱动程序中的处理速度。
同时,更多的NIC 报文到达。当网卡ISR最终进入时,它看到有多个数据包等待。它将处理所有的,而不离开ISR。因此,它可能在每个中断上处理(例如)5个数据包,因此中断计数减少了5倍。
这是大多数"智能"网卡和驱动程序所做的。它实际上提高了网卡流量大时的吞吐量。通常,较少的NIC中断是一件好的事情,因为它减少了重复进入/退出ISR所浪费的开销。
这实际上取决于数据包到达率和[平均]间隔。
所以,真正的问题是:"当中断计数减少时,你会丢失数据包/数据还是只看到性能损失?"你是如何衡量系统性能差异的?
文件系统是否被其他方式使用(例如,它是根文件系统)?或者,您的程序打开文件时是否只有权限访问fs[而不是挂载它]
我不熟悉jffs2
或你的闪存驱动器,所以我会问你是否怀疑做一些事情,将禁用中断一段时间?
更新:
我刚刚注意到你正在使用linux 2.6版本,内核大约是10年前的。它已经过了生命周期,所以它可能不会得到驱动程序的错误修复,除非平台供应商提供它们。
因此,另一件要考虑的事情是,任何驱动程序都可能有导致性能问题的错误。很有可能这些驱动程序已经在更现代的内核中被修复了。
如果可以的话,您可能需要切换到较新的内核。如果不这样做,您可能会面临将新驱动程序向后移植到旧内核的[不令人羡慕的]任务[或者至少挑选一些错误修复]。