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 BITS128 项的索引映射表,通过取固定取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相关推荐

  1. DPDK RSS 基础

    1 rss 的作用 rss 是网卡提供的分流机制.用来将报表分流到不同的收包队列,以提高收包性能. 引用 Intel 82599 10 GbE Controller Datasheet 其中的 Sec ...

  2. DPDK — RSS 多队列网卡

    目录 文章目录 目录 DPDK RSS RETA 配置接口 DPDK RSS DPDK 支持 RSS 功能,可以通过 rte_eth_dev_configure() 接口来设置每个 Ports 的 R ...

  3. DPDK rte_mbuf

    mbuf表示memory buffer或message buffer, 是DPDK中非常重要的数据结构, 一般用于存放网卡收发的报文, 但也可以用于存储控制消息, 事件等各种数据. 本文基于DPDK ...

  4. 网卡多队列:RPS、RFS、RSS、Flow Director(DPDK支持)

    Table of Contents 多队列简介 RPS介绍(Receive Packet Steering) RFS介绍(Receive flow steering) RSS介绍(receive si ...

  5. DPDK笔记 RSS(receive side scaling)网卡分流机制

    DPDK笔记 RSS(receive side scaling)网卡分流机制 RToax 2020年9月 DPDK 网卡RSS(receive side scaling)简介 DPDK-RSS负载均衡 ...

  6. linux 网卡rss hash,使用RSS提升DPDK应用的性能

    本文描述了RSS以及在DPDK中如何配置RSS达到性能提升和统一分发. DPDK 1.8.0 什么是RSS RSS(Receive Side Scaling)是一种能够在多处理器系统下使接收报文在多个 ...

  7. DPDK — TestPMD

    目录 文章目录 目录 前文列表 TestPMD TestPMD 的转发模式 TestPMD 使用示例 使用多核 切换模式 帮助手册 前文列表 <DPDK - 安装部署> TestPMD T ...

  8. DPDK 报文收发流程(二十五)

    一.报文的接收流程 传统方式接收报文时,当网卡接收到报文后会产生硬件中断,进而报文会通过协议栈,最后到达应用层,这个过程需要内核协议栈的处理. 和传统报文接收不同,当应用层想要接收来自网卡的报文时, ...

  9. 深入理解DPDK程序设计|Linux网络2.0

    hi,大家好,由于移动互联网不断发展,导致网络流量徒增,推动着网络技术不断地发展,而CPU的运行频率基本停留在10年前的水平,为了迎接超高速网络技术的挑战,软件也需要大幅度创新,结合硬件技术的发展,D ...

  10. 异数OS 2017 DPDK 峰会观后感

    1.DPDK in Container 使用虚拟网卡设备技术为每一个容器分配一个IP 网卡适配器(queue).容器技术可以解决虚拟机技术中虚拟机过于臃肿,难于热迁移的问题,可能可以代替美团OVS方案 ...

最新文章

  1. Java面向对象:覆写与重载
  2. ViewPager实现翻页步骤
  3. [Bug] .NET 2.0 的Bug —— ComboBox中不能添加Component.
  4. 【Linux】一步一步学Linux——dpkg-preconfigure命令(275)
  5. vue+elementUI 键盘回车事件导致页面刷新的问题
  6. javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——测试
  7. [css] 举例说明跟字体相关的属性有哪些
  8. Linux格式化硬盘为nvme0n1,安装ubuntu16.04系统及解决/dev/nvme0n1p7:clean...block黑屏问题...
  9. SicilyBrackets Matching
  10. SQL 基础笔试题 (三)
  11. 主题模型TopicModel:LDA中的数学模型
  12. 寻找二叉树最小叶子节点值
  13. android底部导航栏
  14. 数据结构—顺序表基本操作(c语言代码)
  15. 双目相机计算稠密深度点云详解教程
  16. 材料成型是现代制造业的重要支柱,对经济社会的发展和综合国力的提升有着十分重要的意义。
  17. 人工智能属于计算机科学研究方向,《人工智能》课程简介
  18. Excel 筛选后排序 踩雷笔记
  19. 汽车CAN诊断——报文数据篇
  20. Pyppeteer使用代理IP(需要权限验证)

热门文章

  1. mysql安装配置jdbc_JDBC环境配置
  2. CF984A Game
  3. emq mysql消息存储_EMQ X 规则引擎系列(二)存储消息到 MySQL 数据库
  4. mac系统历史版本汇总_苹果发布会 WWDC20 主要更新汇总
  5. python爬取美女_Python制作爬虫抓取美女图
  6. android 手机头提示消息,正确的手机头部声明(android,iphone)
  7. 树莓派串口通信编码_树莓派和STM32通过USB和串口通信记录
  8. php购物车点击删除,求助 购物车 用session删除 列表的一条
  9. 处于停机等非正常状态_设备非正常停机管理指导办法
  10. project软件_Project软件操作篇——第三篇 优化计划