我们正在设计基于MIPS处理器的SOHO路由器,配上24端口的交换机。CPU运行NAT (配置了iptables)、iptables规则、dhcp等,它没有为这些功能提供任何硬件加速。在全网状模式下测试NAT时(例如,一个WAN端口和其他端口是LAN端口),我们观察到系统的显著减慢,特别是控制台响应非常慢,并且还存在数据包丢失。
“top”显示ksoftirqd占用了超过80%的CPU。
这种行为的原因是什么呢?Linux NAT在用户端运行吗?
发布于 2010-07-28 10:36:14
ksoftirqd是内核线程驱动...软IRQ,如TIMER_SOFTIRQ,SCSI_SOFTIRQ,TASKLET_SOFTIRQ,以及与您的案例相关的内容,NET_TX_SOFTIRQ和NET_RX_SOFTIRQ。这些是在内核的下半部分中实现的,因为上半部分的延迟工作-延迟非常关键的设备驱动程序中的实际中断处理程序。
网卡的实际中断处理程序,或硬件IRQ,关心的是尽可能快地将数据传入/传出设备。它对NAT和其他TCP/IP处理一无所知。它知道它的总线处理(比如PCI)、它的卡特性(环缓冲器、控制/配置寄存器)、DMA,以及一些关于以太网的知识。它通过队列向/从下半部分传递/接收分组(准确地说是skbuf)。
如果您还没有,请看一下ethtool(8)。看看你是否可以调整硬件/驱动程序来做校验和/分段卸载,等等。我对NAT前端没有任何建议,我不使用它。
希望这能对你有所帮助。
编辑:
如注释中所述,请检查网卡硬件是否支持中断,以及支持驱动程序是否支持NAPI。
发布于 2010-07-28 10:31:06
ksoftirqd是IRQ处理程序。您可以检查/proc/interrupts以查看加载的是哪个IRQ。
CPU过载:使用更强大的模型,或使用更简单的iptables规则。Linux NAT运行在内核空间,ksoftirqd在内核空间。
https://stackoverflow.com/questions/3349455
复制相似问题