DPDK - RSS
DPDK - RSS
RSS(receive side scaling)是由微软提出的一种负载分流方法,通过计算网络数据报文中的网络层&传输层二/三/四元组HASH值,取HASH值的最低有效位(LSB)用于索引间接寻址表RETA(Redirection Table),间接寻址表RETA中的保存索引值用于分配数据报文到不同的CPU接收处理。现阶段RSS基本已有硬件实现,通过这项技术能够将网络流量分载到多个CPU上,降低操作系统单个CPU的占用率。
Redirection Table(RETA)
INTEL 82576/82599 RETA 为一个包含位宽 4 BITS
的 128
项的索引映射表,通过取固定取HASH值低7位(LSBs),将其映射到RETA表项。输出索引可在运行时动态调整更新来实现网络流量动态的负载均衡,但是更新不能保证与数据报文同步生效。
注:
82576/82599 RETA 4位宽的RSS输出索引意味着RSS最大只支持16队列分流,超过16队列之后的队列RSS无法分流。
INTEL XL710 PF RETA 大小 256, 位宽 6 BITS,支持最大 64 队列分流.
INTEL XL710 VF RETA 大小 64, 位宽 4 BITS,支持最大 16 队列分流.
HASH Function
RSS HASH函数一般采用微软托普利兹算法(Microsoft Toeplitz Based Hash),其中Microsoft(MSFT) RSS定义了IPv4/TcpIPv4/TCPIPv6/IPv6几种HASH计算方法,而后INTEL对其进行了扩展,添加了UdpIPv4/UdpIPv6/STcpIPv4/STcpIPv6支持。
Hash for IPv4 with TCP
Input[12] = @12-15, @16-19, @20-21, @22-23
Result = ComputeHash(Input, 12);
Hash for IPv4 with UDP
Input[12] = @12-15, @16-19, @20-21, @22-23.
Result = ComputeHash(Input, 12);
Hash for IPv4 without TCP
Input[8] = @12-15, @16-19
Result = ComputeHash(Input, 8)
Hash for IPv6 with TCP
Input[36] = @8-23, @24-39, @40-41, @42-43
Result = ComputeHash(Input, 36)
Hash for IPv6 with UDP
Input[36] = @8-23, @24-39, @40-41, @42-43
Result = ComputeHash(Input, 36)
Hash for IPv6 without TCP
Input[32] = @8-23, @24-39
Result = ComputeHash(Input, 32)
注:
不在以上规则范围内数据报文类型,RSS默认输出索引为0。
RSS Random Key
HASH在计算过程中使用到一个320位(40字节)random secret key
作为加密密钥。INTEL 82599网卡中在RSS Random Key Register
(RSSRK)寄存器保存这个KEY。
默认RK:
0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2,
0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0,
0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4,
0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c,
0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa
可通过默认RK与HASH函数结合来验证RSS计算结果:
下表提供的 Toeplitz HASH函数的 IPv4 版本验证数据:
Destination Address :Port | Source Address :Port | IPv4 only | IPv4 with TCP |
---|---|---|---|
161.142.100.80 :1766 | 66.9.149.187 :2794 | 0x323e8fc2 | 0x51ccc178 |
65.69.140.83 :4739 | 199.92.111.2 :14230 | 0xd718262a | 0xc626b0ea |
12.22.207.184 :38024 | 24.19.198.95 :12898 | 0xd2d0a5de | 0x5c2b394a |
209.142.163.6 :2217 | 38.27.205.30 :48228 | 0x82989176 | 0xafc7327f |
202.188.127.2 :1303 | 153.39.163.191 :44251 | 0x5d1809c5 | 0x10e828a2 |
下表包含 Toeplitz HASH函数 IPv6 版本的验证的数据:
Destination Address (Port) | Source Address (Port) | IPv6 only | IPv6 with TCP |
---|---|---|---|
3ffe:2501:200:3::1 (1766) | 3ffe:2501:200:1fff::7 (2794) | 0x2cc18cd5 | 0x40207d3d |
ff02::1 (4739) | 3ffe:501:8::260:97ff:fe40:efab (14230) | 0x0f0c461c | 0xdde51bbf |
fe80::200:f8ff:fe21:67cf (38024) | 3ffe:1900:4545:3:200:f8ff:fe21:67cf (44251) | 0x4b61e985 | 0x02d1feef |
注:
默认RK是为非对称KEY.
Toeplitz 算法可以在BSD源码中找到, 在新版DPDK已有软件实现.
DPDK
DPDK中开启端口RSS需配置rte_eth_conf中的mq_mode字段与rss_hf字段, 并至少配置2 RX QUEUES:
struct rte_eth_conf port_conf_default = {.rxmode = {rx_mode.mq_mode = ETH_MQ_RX_RSS,},.rx_adv_conf = {.rss_conf = {.rss_key = NULL,.rss_hf = ETH_RSS_IP | ETH_RSS_TCP | ETH_RSS_UDP,},},
};
testpmd
启用rxonly模式测试RSS:
testpmd -c 0xffff --socket-mem=8192,8192 -w 81:00.0 -n 2 -r 2 -- --enable-rx-cksum --rss-ip -rss-udp --rxq=2 --txq=2 -i
...
testpmd > set fwd rxonly
testpmd > set verbose 8
testpmd > start
scapy 发送测试报文:
sendp(Ether()/Dot1Q()/IP(src=RandIP(), dst='192.168.4.2'), iface='eth8', count=5)
在testpmd终端可看到以下类似输出:
port 0/queue 0: received 1 packets
src=00:1E:67:3E:CB:D1 - dst=00:22:AA:EA:4B:B3 - type=0x0800 - length=60 - nb_segs=1 - RSS hash=0x6c8d4e08 - RSS queue=0x0 - VLAN tci=0x1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_UDP - sw ptype: L2_ETHER L3_IPV4 L4_UDP - l2_len=14 - l3_len=20 - l4_len=8 - Receive queue=0x0
ol_flags: PKT_RX_VLAN PKT_RX_RSS_HASH PKT_RX_L4_CKSUM_GOOD PKT_RX_IP_CKSUM_GOOD PKT_RX_VLAN_STRIPPED
port 0/queue 0: received 1 packets
src=00:1E:67:3E:CB:D1 - dst=00:22:AA:EA:4B:B3 - type=0x0800 - length=60 - nb_segs=1 - RSS hash=0x68b84a3d - RSS queue=0x0 - VLAN tci=0x1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_UDP - sw ptype: L2_ETHER L3_IPV4 L4_UDP - l2_len=14 - l3_len=20 - l4_len=8 - Receive queue=0x0
ol_flags: PKT_RX_VLAN PKT_RX_RSS_HASH PKT_RX_L4_CKSUM_GOOD PKT_RX_IP_CKSUM_GOOD PKT_RX_VLAN_STRIPPED
`
Reference
Introduction to Receive Side Scaling
Intel® 82599 10 Gigabit Ethernet Controller Datasheet - 7.1.2.8 Receive-Side Scaling (RSS)
DPDK - RSS相关推荐
- DPDK RSS 基础
1 rss 的作用 rss 是网卡提供的分流机制.用来将报表分流到不同的收包队列,以提高收包性能. 引用 Intel 82599 10 GbE Controller Datasheet 其中的 Sec ...
- DPDK — RSS 多队列网卡
目录 文章目录 目录 DPDK RSS RETA 配置接口 DPDK RSS DPDK 支持 RSS 功能,可以通过 rte_eth_dev_configure() 接口来设置每个 Ports 的 R ...
- DPDK rte_mbuf
mbuf表示memory buffer或message buffer, 是DPDK中非常重要的数据结构, 一般用于存放网卡收发的报文, 但也可以用于存储控制消息, 事件等各种数据. 本文基于DPDK ...
- 网卡多队列:RPS、RFS、RSS、Flow Director(DPDK支持)
Table of Contents 多队列简介 RPS介绍(Receive Packet Steering) RFS介绍(Receive flow steering) RSS介绍(receive si ...
- DPDK笔记 RSS(receive side scaling)网卡分流机制
DPDK笔记 RSS(receive side scaling)网卡分流机制 RToax 2020年9月 DPDK 网卡RSS(receive side scaling)简介 DPDK-RSS负载均衡 ...
- linux 网卡rss hash,使用RSS提升DPDK应用的性能
本文描述了RSS以及在DPDK中如何配置RSS达到性能提升和统一分发. DPDK 1.8.0 什么是RSS RSS(Receive Side Scaling)是一种能够在多处理器系统下使接收报文在多个 ...
- DPDK — TestPMD
目录 文章目录 目录 前文列表 TestPMD TestPMD 的转发模式 TestPMD 使用示例 使用多核 切换模式 帮助手册 前文列表 <DPDK - 安装部署> TestPMD T ...
- DPDK 报文收发流程(二十五)
一.报文的接收流程 传统方式接收报文时,当网卡接收到报文后会产生硬件中断,进而报文会通过协议栈,最后到达应用层,这个过程需要内核协议栈的处理. 和传统报文接收不同,当应用层想要接收来自网卡的报文时, ...
- 深入理解DPDK程序设计|Linux网络2.0
hi,大家好,由于移动互联网不断发展,导致网络流量徒增,推动着网络技术不断地发展,而CPU的运行频率基本停留在10年前的水平,为了迎接超高速网络技术的挑战,软件也需要大幅度创新,结合硬件技术的发展,D ...
- 异数OS 2017 DPDK 峰会观后感
1.DPDK in Container 使用虚拟网卡设备技术为每一个容器分配一个IP 网卡适配器(queue).容器技术可以解决虚拟机技术中虚拟机过于臃肿,难于热迁移的问题,可能可以代替美团OVS方案 ...
最新文章
- Java面向对象:覆写与重载
- ViewPager实现翻页步骤
- [Bug] .NET 2.0 的Bug —— ComboBox中不能添加Component.
- 【Linux】一步一步学Linux——dpkg-preconfigure命令(275)
- vue+elementUI 键盘回车事件导致页面刷新的问题
- javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——测试
- [css] 举例说明跟字体相关的属性有哪些
- Linux格式化硬盘为nvme0n1,安装ubuntu16.04系统及解决/dev/nvme0n1p7:clean...block黑屏问题...
- SicilyBrackets Matching
- SQL 基础笔试题 (三)
- 主题模型TopicModel:LDA中的数学模型
- 寻找二叉树最小叶子节点值
- android底部导航栏
- 数据结构—顺序表基本操作(c语言代码)
- 双目相机计算稠密深度点云详解教程
- 材料成型是现代制造业的重要支柱,对经济社会的发展和综合国力的提升有着十分重要的意义。
- 人工智能属于计算机科学研究方向,《人工智能》课程简介
- Excel 筛选后排序 踩雷笔记
- 汽车CAN诊断——报文数据篇
- Pyppeteer使用代理IP(需要权限验证)
热门文章
- mysql安装配置jdbc_JDBC环境配置
- CF984A Game
- emq mysql消息存储_EMQ X 规则引擎系列(二)存储消息到 MySQL 数据库
- mac系统历史版本汇总_苹果发布会 WWDC20 主要更新汇总
- python爬取美女_Python制作爬虫抓取美女图
- android 手机头提示消息,正确的手机头部声明(android,iphone)
- 树莓派串口通信编码_树莓派和STM32通过USB和串口通信记录
- php购物车点击删除,求助 购物车 用session删除 列表的一条
- 处于停机等非正常状态_设备非正常停机管理指导办法
- project软件_Project软件操作篇——第三篇 优化计划