您的位置:首页 > 其它

网卡多队列学习小结

2015-10-08 23:51 176 查看
1.网卡多队列
网卡多队列是需要多队列网卡支持的。所谓网卡多队列是网卡硬件支持的。

(1)开启软件多队列的方法





(2)查看软件多队列开启的效果
cat /proc/interrupts | grep eth0
cat /proc/interrupts | grep eth0

2.设定IRQ affinity的目的
过多的网卡收包和发包中断集中在一个CPU上,在系统繁忙时,CPU对网卡的中断无法响应,这样导致了服务器端的网络性能降低,从这里可以看出其实网络性能的瓶颈不在于网卡,而是CPU,因为现在的网卡很多都是万兆并且多队列的,如果有过多的中断集中在一个CPU上,将导致该CPU无法处理,所以可以使用该方法将网卡的中断分散到各个CPU上。

3.RPS/RFS
RPS/RFS 功能是在Linux- 2.6.35中有google的工程师提交的两个补丁(注意,这个功能是在linux内核里面的,即是软件层面的),这两个补丁的出现主要是基于以下两点现实的考虑:

(1)对于支持多队列的网卡而言,由于服务器的CPU越来越强劲,可以到达十几核、几十核,而网卡硬件队列则才4个、8个,这种发展的不匹配造成了CPU负载的不均衡。也就是,网卡硬件队列少于CPU核数的情况,即使设定了网卡的IRQ affinity,CPU在处理网卡请求时,仍然各CPU负载不均衡。

(2)对于不支持网卡多队列的网卡而言,即单队列网卡,RPS/RFS相当于在系统层用软件模拟了多队列的情况,以便达到CPU的均衡。
RPS/RFS有称为是软件多队列。

A)RPS
RPS(Receive Packet Steering)主要是把软中断的负载均衡到各个cpu,简单来说,是网卡驱动对每个数据包生成一个hash标识,这个HASH值得计算可以通过四元组来计算(SIP,SPORT,DIP,DPORT),然后由中断处理的地方根据这个hash标识分配到相应的CPU上去,这样就可以比较充分的发挥多核的能力了。通俗点来说就是在软件层面模拟实现硬件的多队列网卡功能,如果网卡本身支持多队列功能的话RPS就不会有任何的作用。该功能主要针对单队列网卡多CPU环境,如网卡支持多队列则可使用SMP
irq affinity直接绑定硬中断。RPS的功能如下图简要呈现:





B)RFS
由于RPS只是单纯把数据包均衡到不同的cpu,这个时候如果应用程序所在的cpu和软中断处理的cpu不是同一个,此时对于cpu cache的影响会很大,那么RFS(Receive Flow Steering)确保应用程序处理的cpu跟软中断处理的cpu是同一个,这样就充分利用cpu的cache,这两个补丁往往都是一起设置,来达到最好的优化效果, 主要是针对单队列网卡多CPU环境。同时开启了RPS/RFS的处理流程简要如下:





4.设定IRQ Affinity
在SMP体系结构中,我们可以通过调用系统调用和一组相关的宏来设置 CPU 亲和力(CPU affinity),将一个或多个进程绑定到一个或多个处理器上运行。中断在这方面也毫不示弱,也具有相同的特性。中断亲和力是指将一个或多个中断源绑定到特定的 CPU 上运行。
开启网卡硬件多队列后,还要将不同的硬件队列的IRQ关联到不同的CPU上才有效果的,即是IRQ Affinity的设定。

设定的方法:
在 /proc/irq 目录中,对于已经注册中断处理程序的硬件设备,都会在该目录下存在一个以该中断号命名的目录 IRQ# ,IRQ# 目录下有一个 smp_affinity 文件(SMP 体系结构才有该文件),它是一个 CPU 的位掩码,可以用来设置该中断的亲和力, 默认值为 0xffffffff,表明把中断发送到所有的 CPU 上去处理。如果中断控制器不支持 IRQ affinity,不能改变此默认值,同时也不能关闭所有的
CPU 位掩码,即不能设置成 0x0。即是我们echo一个位掩码就可以设定IRQ Affinity。

综合来说,网卡多队列的优化就是开启网卡多队列和IRQ Affinity的结合。当然也可以配置软件多队列(PFS/PRS).

学习资料来源:
http://www.ibm.com/developerworks/cn/linux/l-cn-linuxkernelint/
/article/5074563.html
/article/10334735.html
http://blog.csdn.net/turkeyzhou/article/details/752818
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: