读取文件会杀死网卡中断



我有一个非常奇怪的问题,基于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年前的。它已经过了生命周期,所以它可能不会得到驱动程序的错误修复,除非平台供应商提供它们。

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

如果可以的话,您可能需要切换到较新的内核。如果不这样做,您可能会面临将新驱动程序向后移植到旧内核的[不令人羡慕的]任务[或者至少挑选一些错误修复]。

相关内容

  • 没有找到相关文章

最新更新