读取文件会杀死 NIC 中断
Reading a file kills NIC interrupts
我在使用基于 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,U盘为32M NOR串口设备。
为什么读取文件会终止 NIC 中断直到重启?
警告:这可能不是一个完整的解决方案,但我有一些想法。可能需要更多 information/testing。
当你[系统不做]其他事情时,NIC 驱动程序 快速 足以响应中断并且 ISR 将在 上完成处理单个 数据包 在 下一个数据包到达之前。 (即)传入数据包和 NIC 中断之间存在一对一的关系。
如果您有其他系统 activity,这可能会 延迟 进入 NIC 驱动程序的 ISR。此外,由于资源竞争(例如锁、kmalloc
等),其他 activity 可能会减慢 NIC 驱动程序中的处理速度
与此同时,更多 NIC 数据包 到达。当 finally/ultimately 输入 NIC ISR 时,它会看到有 多个 数据包待处理。它将处理所有这些,而不离开 ISR。因此,它可能在每个中断上处理(例如)5 个数据包,因此中断 count 减少了 5 倍。
这是大多数 "smart" NIC 卡和驱动程序所做的。它实际上提高了繁重的 NIC 流量的吞吐量。通常,减少 NIC 中断是一件好事 ,因为它减少了重复 entering/exiting ISR 的浪费开销。
这实际上取决于数据包到达率和[平均]间隔。
所以,真正的问题是:"When the interrupt count is reduced, do you lose packets/data or just see performance loss?"
而且,您如何衡量系统性能差异?
有问题的文件系统是否以其他方式使用(例如,它是根文件系统)?或者,您的程序打开文件时 仅 访问 fs [而不是挂载它]
我不熟悉 jffs2
或你的闪存驱动程序,所以我想问你是否怀疑你做了一些会长时间禁用中断的事情?
更新:
我刚刚注意到您使用的是 linux 版本 2.6 该内核大约有 10 年的历史。它已经过时了,所以除非平台供应商提供它们,否则它可能不会得到驱动程序的错误修复。
因此,要考虑的另一件事是任何驱动程序都可能存在导致性能问题的错误。很有可能驱动程序已在更现代的内核中得到修复。
如果可以的话,您可能想切换到更新的内核。如果没有,您可能会面临将较新的驱动程序向后移植到较旧的内核的 [令人羡慕的] 任务 [或者至少挑选一些错误修复]。
我在使用基于 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,U盘为32M NOR串口设备。 为什么读取文件会终止 NIC 中断直到重启?
警告:这可能不是一个完整的解决方案,但我有一些想法。可能需要更多 information/testing。
当你[系统不做]其他事情时,NIC 驱动程序 快速 足以响应中断并且 ISR 将在 上完成处理单个 数据包 在 下一个数据包到达之前。 (即)传入数据包和 NIC 中断之间存在一对一的关系。
如果您有其他系统 activity,这可能会 延迟 进入 NIC 驱动程序的 ISR。此外,由于资源竞争(例如锁、kmalloc
等),其他 activity 可能会减慢 NIC 驱动程序中的处理速度
与此同时,更多 NIC 数据包 到达。当 finally/ultimately 输入 NIC ISR 时,它会看到有 多个 数据包待处理。它将处理所有这些,而不离开 ISR。因此,它可能在每个中断上处理(例如)5 个数据包,因此中断 count 减少了 5 倍。
这是大多数 "smart" NIC 卡和驱动程序所做的。它实际上提高了繁重的 NIC 流量的吞吐量。通常,减少 NIC 中断是一件好事 ,因为它减少了重复 entering/exiting ISR 的浪费开销。
这实际上取决于数据包到达率和[平均]间隔。
所以,真正的问题是:"When the interrupt count is reduced, do you lose packets/data or just see performance loss?"
而且,您如何衡量系统性能差异?
有问题的文件系统是否以其他方式使用(例如,它是根文件系统)?或者,您的程序打开文件时 仅 访问 fs [而不是挂载它]
我不熟悉 jffs2
或你的闪存驱动程序,所以我想问你是否怀疑你做了一些会长时间禁用中断的事情?
更新:
我刚刚注意到您使用的是 linux 版本 2.6 该内核大约有 10 年的历史。它已经过时了,所以除非平台供应商提供它们,否则它可能不会得到驱动程序的错误修复。
因此,要考虑的另一件事是任何驱动程序都可能存在导致性能问题的错误。很有可能驱动程序已在更现代的内核中得到修复。
如果可以的话,您可能想切换到更新的内核。如果没有,您可能会面临将较新的驱动程序向后移植到较旧的内核的 [令人羡慕的] 任务 [或者至少挑选一些错误修复]。