Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1999004
  • 博文数量: 369
  • 博客积分: 10093
  • 博客等级: 上将
  • 技术积分: 4271
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-21 00:59
文章分类

全部博文(369)

文章存档

2013年(1)

2011年(2)

2010年(10)

2009年(16)

2008年(33)

2007年(146)

2006年(160)

2005年(1)

分类: LINUX

2009-11-20 17:48:06

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

xiaosuo2009-12-30 16:28:40

linux的内存管理器,对于NUMA已经提供了诸多优化,自然包含类似XPS的逻辑,不过,在管理器之外,主动提供NUMA友好的支持将会获得额外好处。

arley2009-12-07 18:13:50

很有用。Thanks.

BenBear2009-11-20 18:45:55

帮顶,哈哈~牛人哪!