Chinaunix首页 | 论坛 | 博客
  • 博客访问: 305803
  • 博文数量: 54
  • 博客积分: 3050
  • 博客等级: 中校
  • 技术积分: 601
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-25 16:53
文章分类
文章存档

2012年(1)

2011年(7)

2010年(46)

我的朋友

分类: LINUX

2010-01-25 18:30:46

看 Understanding Linux Network Internals - chap10 之 NAPI,不是特别明白里面的话,其实是不了解文章叙述的背景,遂Google之,得一段小强文如下,位子虽短,功力可见。


今天讨论XPS(Xmit Packet Steering),得知现在Linux网络子系统假定:支持NAPI的NIC驱动不光要通过NAPI的poll接口接收包,还要用它处理包的释放,以降低对NET_TX_SOFTIRQ软中断的需求,提高系统性能。不禁让人感叹Linux内核变化之快!

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网络子系统对于多处理的支持将进入一个新的阶段,很值得期待,让我们一起努力!
阅读(1354) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~