多队列网卡简介

转载 2012年05月02日 15:22:03

多队列网卡是一种技术,最初是用来解决网络IO QoS (quality of service)问题的,后来随着网络IO的带宽的不断提升,单核CPU不能完全处满足网卡的需求,通过多队列网卡驱动的支持,将各个队列通过中断绑定到不同的核上,以满足网卡的需求。

常见的有Intel的82575、82576,Boardcom的57711等,下面以公司的服务器使用较多的Intel 82575网卡为例,分析一下多队列网卡的硬件的实现以及linux内核软件的支持。

1.多队列网卡硬件实现

图1.1是Intel 82575硬件逻辑图,有四个硬件队列。当收到报文时,通过hash包头的SIP、Sport、DIP、Dport四元组,将一条流总是收到相同的队列。同时触发与该队列绑定的中断。

图1.1 82575硬件逻辑图

2. 2.6.21以前网卡驱动实现

kernel从2.6.21之前不支持多队列特性,一个网卡只能申请一个中断号,因此同一个时刻只有一个核在处理网卡收到的包。如图2.1,协议栈通过NAPI轮询收取各个硬件queue中的报文到图2.2的net_device数据结构中,通过QDisc队列将报文发送到网卡。

图2.1 2.6.21之前内核协议栈

 


图2.2 2.6.21之前net_device

3. 2.6.21后网卡驱动实现

2.6.21开始支持多队列特性,当网卡驱动加载时,通过获取的网卡型号,得到网卡的硬件queue的数量,并结合CPU核的数量,最终通过Sum=Min(网卡queue,CPU core)得出所要激活的网卡queue数量(Sum),并申请Sum个中断号,分配给激活的各个queue。

如图3.1,当某个queue收到报文时,触发相应的中断,收到中断的核,将该任务加入到协议栈负责收包的该核的NET_RX_SOFTIRQ队列中(NET_RX_SOFTIRQ在每个核上都有一个实例),在NET_RX_SOFTIRQ中,调用NAPI的收包接口,将报文收到CPU中如图3.2的有多个netdev_queue的net_device数据结构中。

这样,CPU的各个核可以并发的收包,就不会应为一个核不能满足需求,导致网络IO性能下降。

图3.1 2.6.21之后内核协议栈

 

图3.2 2.6.21之后net_device

4.中断绑定

当CPU可以平行收包时,就会出现不同的核收取了同一个queue的报文,这就会产生报文乱序的问题,解决方法是将一个queue的中断绑定到唯一的一个核上去,从而避免了乱序问题。同时如果网络流量大的时候,可以将软中断均匀的分散到各个核上,避免CPU成为瓶颈。

 

 

图4.1 /proc/interrupts

5.中断亲合纠正

一些多队列网卡驱动实现的不是太好,在初始化后会出现图4.1中同一个队列的tx、rx中断绑定到不同核上的问题,这样数据在core0与core1之间流动,导致核间数据交互加大,cache命中率降低,降低了效率。


图5.1 不合理中断绑定

linux network子系统的负责人David Miller提供了一个脚本,首先检索/proc/interrupts文件中的信息,按照图4.1中eth0-rx-0($VEC)中的VEC得出中断MASK,并将MASK

写入中断号53对应的smp_affinity中。由于eth-rx-0与eth-tx-0的VEC相同,实现同一个queue的tx与rx中断绑定到一个核上,如图4.3所示。

                                                                                     




图4.2 set_irq_affinity

图4.3 合理的中断绑定

 

set_irq_affinity脚本位于http://mirror.oa.com/tlinux/tools/set_irq_affinity.sh。

6.多队列网卡识别

#lspci -vvv

Ethernet controller的条目内容,如果有MSI-X && Enable+ && TabSize > 1,则该网卡是多队列网卡,如图4.4所示。

图4.4 lspci内容

Message Signaled Interrupts(MSI)是PCI规范的一个实现,可以突破CPU 256条interrupt的限制,使每个设备具有多个中断线变成可能,多队列网卡驱动给每个queue申请了MSI。MSI-X是MSI数组,Enable+指使能,TabSize是数组大小。

网卡多队列学习小结

1.网卡多队列 网卡多队列是需要多队列网卡支持的。所谓网卡多队列是网卡硬件支持的。 (1)开启软件多队列的方法 (2)查看软件多队列开启的效果 cat /proc/inte...

网卡多队列及中断绑定

多队列网卡是一种技术,最初是用来解决网络IO QoS (quality of service)问题的,后来随着网络IO的带宽的不断提升,单核CPU不能完全处满足网卡的需求,通过多队列网卡驱动的支持,将...
  • wyaibyn
  • wyaibyn
  • 2013年11月03日 21:20
  • 11742

DPDK(17):网卡多队列技术与RSS功能介绍、DPDK多队列

转自:http://blog.csdn.net/baidu_24553027/article/details/54927724 多队列网卡是一种技术,最初是用来解决网络IO QoS ...
  • cling60
  • cling60
  • 2017年11月19日 00:06
  • 148

网卡多队列技术与RSS功能介绍

多队列网卡是一种技术,最初是用来解决网络IO QoS (quality of service)问题的,后来随着网络IO的带宽的不断提升,单核CPU不能完全处满足网卡的需求,通过多队列网卡驱动的支持,将...

多队列网卡CPU中断均衡

一、基础 1.相关名词IRQ Interrupt Request,中断请求,从硬件层发出 作用:执行硬件中断的请求 SMP(Symmetrical Multi-Processing) ...

linux下基于SMP架构的多队列网卡的调优(Multi-queue network interfaces with SMP on Linux)

https://greenhost.nl/2013/04/10/multi-queue-network-interfaces-with-smp-on-linux/
  • vah101
  • vah101
  • 2014年08月16日 21:46
  • 8463

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

摘自:http://blog.csdn.net/dog250/article/details/5303416 linux的招牌就是它强大的网络功能,稳定,高效,能随着现实的日新月异而日趋完善...
  • scdxmoe
  • scdxmoe
  • 2014年07月16日 11:44
  • 1242

由于网卡单队列导致的CPU高

现象redis 进程 cpu 跑满原因没有开启网卡多队列,导致只有一个cpu被使用 网卡在同一时刻只能产生一个中断,CPU在同一时刻只能响应一个中断,由于配置的原因,只有一颗cpu去响应中断(这个是...
  • fjq5a
  • fjq5a
  • 2016年12月19日 19:56
  • 503

linux查看网卡型号、驱动版本、队列数

一、如何查看网卡生产厂家和型号?  lspci命令   查看基本信息 lspci, 详细信息lspci -vvv   00:00.0 Host bridge: Intel Corpo...

高速网络下的 Netmap 单 RX 队列内核旁路技术

感谢伯乐在线 @至秦前辈 校稿 原文链接 这里在 前一篇文章 中,我们讨论了 Linux 内核网络协议栈的性能瓶颈。我们详细说明了如何利用内核旁路技术,让用户空间程序可以接收大量的数据包。遗憾的是,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多队列网卡简介
举报原因:
原因补充:

(最多只允许输入30个字)