linux内核对网卡驱动多队列的支持

linux的招牌就是它强大的网络功能,稳定,高效,能随着现实的日新月异而日趋完善。众所周知,linux的网卡由结构体net_device表示,一 个该结构体对应一个可以调度的数据包发送队列,注意,这里不谈数据包接收,数据包的实体在内核中以结构体sk_buff表示,这样的话,上述文字就可以用 以下图示来表示: 
linux内核对网卡驱动多队列的支持 
所谓的网卡对发送数据包的调度指的是多个数据包共享一个网卡的规则,当然就要拥有一系列的约定,比如区分数据包的优先级,区分数据包的类型,内核根据不同的调度策略来对不同的数据包进行排队,然后按照队列的顺序进行发送,关于这些细节不是本文要讨论的内容,可以参考linux内核对网络流量控制的支持方面的资料,需要明白的是,以往不支持多队列的内核中每个网卡拥有一个排队规则,然后根据排队规则的过滤器将数据包区分为一个一个的类,类中还可以嵌套新的更 细的排队规则,这个过程可以看到是以网卡为中心的,因为是每网卡一队列,这个队列指的是根队列,以网卡为中心实际上是一种过时的方式,还可以看成是以现在的观点来看偷懒的方式,毕竟网卡是内核和整个系统中的静态数据,是完全可以把握的,可是这已经不能适合当今的网络应用了,当今是一个必须适应大环境的世界 而不再是局部意义上的入乡随俗的世界了,丰富的数据没有必要入linux网卡的乡随网卡唯一的根队列的俗了,取而代之的是必须为丰富的网络数据提供属于它 们自己的舞台而不是逼迫它们强挤到网卡的根队列等待调度。我们来看一下具体的意义。 
特别在无线设备上,几乎都是网络应用,有声音,有视频,有电子邮件,有实时数据等等。如果将这些数据都统一到一个队列中当然是可以的,因为2.6.27之 前的内核并没有因为没有实现多队列而出现问题,但是这么做是有弊端的,因为我们将必须用一种统一的方式管理它们,可实际上它们的区别很大很大,如果统一的队列有一些什么限制的话,这种限制将会限制到所有的数据,这将导致调度程序的复杂化。事实上真的需要将事情搅和在一起从而必须增加复杂性吗?我们在遇到困 难的时候必须想想现实是什么样子的,然后我们按照真实的世界的样子去做就会得到最好的解决方案,返璞归真真的是一条亘古不变的真理。实现了多队列,每个网卡将拥有很多的根队列,每个应用一个都有可能,这样的话我们就可以随心所欲的控制并且仅仅控制我们想控制的数据包了,比如视频数据强调实时性而对数据的准 确性要求不高,这样我们需要给视频数据包队列更高的发送优先级,为了不使视频效果变得很卡,我们缩短视频数据包队列的长度,而对那些要求准确性但是不要求实时的比如电子邮件的数据包队列,我们可以降低其优先级但是增加队列的长度,仅此而已,不需要变更已经很优美的调度机制就可以轻松实现。实现了多队列的网 卡的图示如下: 
linux内核对网卡驱动多队列的支持 
前面简要说明了多队列的意义,在对内核的更改上也很简单,就是将原先的每个net_device一个的队列改为多个就可以了: 
static inline void qdisc_reset_all_tx(struct net_device *dev) 
 { 

-


 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1273947

上一篇:ASP.NET Signalr 2.0 实现一个简单的聊天室


下一篇:《代码大全》学习笔记 可以工作的类