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

2017年02月08日 15:44:37 Murphy_0806 阅读数 10665 标签: rss网卡dpdk 更多

个人分类: DPDK
https://blog.csdn.net/baidu_24553027/article/details/54927724

多队列 深队列的技术 AHCI不如NVME的最大的地方 其实网卡里面也有  多队列 已经 DMA网卡. 
 

多队列网卡是一种技术,最初是用来解决网络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.什么是RSS

RSS(Receive Side Scaling)是一种能够在多处理器系统下使接收报文在多个CPU之间高效分发的网卡驱动技术。

  • 网卡对接收到的报文进行解析,获取IP地址、协议和端口五元组信息
  • 网卡通过配置的HASH函数根据五元组信息计算出HASH值,也可以根据二、三或四元组进行计算。
  • 取HASH值的低几位(这个具体网卡可能不同)作为RETA(redirection table)的索引
  • 根据RETA中存储的值分发到对应的CPU

下图描述了完整的处理流程:

基于RSS技术程序可以通过硬件在多个CPU之间来分发数据流,并且可以通过对RETA的修改来实现动态的负载均衡。

3.在DPDK中配置RSS

DPDK支持设置静态hash值和配置RETA。 不过DPDK中RSS是基于端口的,并根据端口的接收队列进行报文分发的。 例如我们在一个端口上配置了3个接收队列(0,1,2)并开启了RSS,那么 中就是这样的:

{0,1,2,0,1,2,0.........}

运行在不同CPU的应用程序就从不同的接收队列接收报文,这样就达到了报文分发的效果。

在DPDK中通过设置rte_eth_conf中的mq_mode字段来开启RSS功能, rx_mode.mq_mode = ETH_MQ_RX_RSS

当RSS功能开启后,报文对应的rte_pktmbuf中就会存有RSS计算的hash值,可以通过pktmbuf.hash.rss来访问。 这个值可以直接用在后续报文处理过程中而不需要重新计算hash值,如快速转发,标识报文流等。

RETA是运行时可配置的,这样应用程序就可以动态改变CPU对应的接收队列,从而动态调节报文分发。 具体通过PMD模块的驱动进行配置,例如ixgbe_dev_rss_reta_updateixgbe_dev_rss_reta_query

最新文章

  1. 嵌入式&iOS:回调函数(C)与block(OC)回调对比
  2. XMPP iOS客户端实现二:xcode项目配置
  3. 【OpenGL】第二篇 Hello OpenGL
  4. C# 常用结构
  5. SimpleInjector的使用
  6. winform DataGridView控件开发经验
  7. Objective-C该Protocol
  8. 用DOS命令来运行Java代码
  9. 再起航,我的学习笔记之JavaScript设计模式21(命令模式)
  10. ABP框架 - N层架构
  11. 入职第二天:使用koa搭建node server是种怎样的体验
  12. Scrapy爬虫错误日志汇总
  13. cf949C 建模,SCC缩点
  14. 关于Linux MongoDB的安装
  15. 2.4《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——小结
  16. windows应急响应入侵排查思路
  17. 51nod1513
  18. [SharpMap] 屏幕坐标和Map坐标转换
  19. Codeforces 722C(并查集 + 思维)
  20. JSON特殊字符的处理

热门文章

  1. [Docker]docker搭建私有仓库(ssl、身份认证)
  2. 去除弹窗自带url提示
  3. 利用栈实现字符串中三种括号的匹配问题c++语言实现
  4. noi.ac #529 神树的矩阵
  5. Lock和synchronized的区别
  6. angularJS <input type="file> 图片的base64编码
  7. [Deep Learning] GELU (Gaussian Error Linerar Units)
  8. 火焰图分析CPU性能问题
  9. Nginx 配置443 HTTPS
  10. java 获取本地 mac 地址