网卡多队列学习小结
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
网卡多队列是需要多队列网卡支持的。所谓网卡多队列是网卡硬件支持的。
(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
相关文章推荐
- 数据库水平拆分和垂直拆分区别
- 快速学会3DMax高级建模人物骨骼蒙皮
- php使用curl的post方法字符串和数组传值的区别
- 主页 被 2345 篡改怎么办
- 设计模式-Template Method Pattern
- 上拉下拉电阻的一般确定方法
- JavaScript中的windon部分功能演示
- 自定义控件(Task01)——最简单的自定义控件
- AngularJS的优缺点
- 《Web入侵安全测试与对策》读书笔记
- 前端模块化工具-webpack
- 关于最短路
- Java之——简单的网络爬虫实现
- base64的一个应用情景
- 个人数据备份的常见方案
- vim使用技巧
- HTTP协议请求过程
- Linux设置某软件开机自动启动的方法
- 《Web安全测试》读书笔记
- 用sphinx写文档