看 Understanding Linux Network Internals - chap10 之 NAPI,不是特别明白里面的话,其实是不了解文章叙述的背景,遂Google之,得一段小强文如下,位子虽短,功力可见。
NAPI 之前的Linux NIC驱动总是在接收到数据包之后产生一个IRQ,然后在驱动的ISR里面将这个skb加入本地的softnet,然后触发本地的 NET_RX_SOFTIRQ软中断做后续处理。这是一个典型的流水线(Pipeline)模型。但是问题就发生在这个流水线模型,如果包速过高,那么因为IRQ的优先级高于SoftIRQ,导致系统的大部分资源都在响应中断,并且因为softnet的队列大小有限,接收到的超额数据包也只能丢掉,所以这个时候这个模型有些时候只是在用宝贵的系统资源做无用功。NAPI就在轮询模式和中断模式之间取了一下折中,改ISR为:将对应NIC加入 NET_RX_SOFTIRQ软中断要轮询的设备列表里面,然后关闭NIC的IRQ,触发NET_RX_SOFTIRQ软中断。在 NET_RX_SOFTIRQ软中断中,设备被轮询以接收数据包并处理,直到没有数据包后将设备移离轮询列表,并重新开启NIC的IRQ。这样,前面的问题就没有了。
数据包的释放,以前是依靠另外一个软中断NET_TX_SOFTIRQ来处理的,现在Linux认为支持NAPI的设备都应该在其对应的poll接口中处理。也就是说,无论是RX的ISR,还是TX的ISR,都应该启动NAPI,对NIC进行轮询。
XPS是将数据包的释放工作放到发送数据包的CPU上,以期最好的内存本地性。无疑在NUMA计算机上,对性能的改进将是显著的。
等RPS和XPS都进入官方内核,Linux网络子系统对于多处理的支持将进入一个新的阶段,很值得期待,让我们一起努力!
阅读(1383) | 评论(0) | 转发(0) |