Chinaunix首页 | 论坛 | 博客
  • 博客访问: 154333
  • 博文数量: 23
  • 博客积分: 51
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-04 11:48
个人简介

be the change you want to see in the world

文章分类

全部博文(23)

文章存档

2014年(1)

2013年(20)

2011年(2)

分类: LINUX

2013-09-04 17:06:03

网络的速度一直在进步,同时CPU的速度却几乎停了下来转而向多CPU/Core/Thread方向发展,Linux网络子系统要想跟上网络的发展速度,必须将其内部的接收和发送流程尽可能的并行化。

对于从本地发出的数据包,如果发送数据包的应用程序是多线程的,那么其发送过程本身就已经是多线程的了,这部分无须做太多工作。对于数据包的转发的和接收就完全是另一种情形了:在哪个CPU上响应的中断,就在哪个CPU上做后续的处理。

如果IO-APIC支持将中断RR(轮转)发送到所有的允许响应NIC(网卡)中断的CPU上,那么这个情况多少会缓解,但是会引入包乱序的问题,乱序对于TCP来说,可是非常的糟糕,所以这并不是一个好的解决办法。

如果网卡支持多个接收队列,并且每个接收队列都有一个对应的中断,那么我们可以将这些中断分散绑定到CPU上,获得较好的Throughput(吞吐量)。但是接收队列的数量和CPU/Core/Thread的数量很难达到匹配,并且即使匹配,也可能不容易做到按权重分配,而且每个NIC的做法可能还不一致,导致配置非通用。

目前Linux在这方面的工作是,不过还有要走,估计进入2.6.23是没什么希望了,所以我别出心裁的想出了通过暂缓无RPS之痛,经过几轮迭代之后,终于稳定。奈何,Linux社区仍然认为RPS才是“人间正道”,所以我的多队列版IFB并未并入,我也终止了用tasklet替代我实现多队列版IFB用的内核线程的工作。等RPS正是进入Linux,我将重启IFB的并行优化,计划是通过每个CPU/Core/Thread绑定一个tasklet来实现。

我上面给出的多队列版IFB的补丁已经稳定,如有需要,敬请使用,也算我没白忙一场!
阅读(2114) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~