Linux 操作系统原理 — RSS 多队列网卡

目录

文章目录

  • 目录
  • RSS 多队列网卡
  • RSS 技术实现原理
    • RSS Filter
    • RSS HASH
    • 硬中断信号绑定
  • ethtool 操作指令

RSS 多队列网卡

在以往,一张 NIC 只具有一个 Rx Queue,对应一个 CPU Core 来进行收包处理。在多核时代,为了充分利用 Multi-CPU Cores,NIC 也相应的提供了 Multi-Queue(多队列)功能。

结合 NIC RSS(Receive Side Scaling,接收侧扩展)功能,可以将多个 Rx Queues 通过硬中断绑定到不同的 CPU cores 上处理,以此均衡利用 CPU 资源并提高网络吞吐量。例如:Intel 82599 NIC 有 16 个 Queues,可以分别将每个 Queue 的中断号绑定到 16 个 CPU Cores 上。

此外,有些 NIC 还能够同时支持 Multi-Queue Receive 和 Multi-Queue Transmit。

RSS 技术实现原理

RSS Filter

在这里插入图片描述

NIC 通过 HW Filters(过滤器)来分发报文,Filters 首先会将报文分配给某条 Stream(逻辑流),然后将每条 逻辑流 中的报文都被导向不同的 Receive Queues,然后再由不同 CPU Cores 处理。

以 Intel 82599 NIC 为例,有以下 HW Filters 类型:

  1. L2 filter
  2. MAC filter
  3. VLAN filter
  4. L2 type filter
  5. Syn filter
  6. 5-Tuple filter
  7. Flow dirctor
  8. RSS

如上图,当报文经过了一系列 Filters,最后再交由 RSS 处理。

在这里插入图片描述

RSS HASH

在这里插入图片描述

RSS Hash function(e.g. Toeplitz HASH),通过计算 Incoming traffic 中的 Hash type specified(2-3-4-Tuple)得到一个 Hash value,然后再取出 Hash value 中的 LSBs(最低有效位。7bits)去 Lookup Indirection table(RETA,间接寻址表)找到这条 Traffic Flow 对应的 Rx queue。

同时,Hash type specified 和 Indirection table entries 都是可以被 Ethernet driver 或 ethtool CLI 进行编程的。

  • Hash type specified:可以是以下类型。

    • IP 2-tuple(srcIP、dstIP)
    • TCP/UDP 3-tuple(srcIP、dstIP、dstPort)
    • TCP/UDP 4-tuple(srcIP、dstIP、srcPort、dstPort)
  • Indirection table entries:具有 128 个条目,对应 128 个不同的 Queues,还可以设置不同的权重参数。

在这里插入图片描述

在这里插入图片描述

硬中断信号绑定

为了避免 Multi-Queues 导致的报文乱序问题,以及均衡的发挥多核处理器平台的并行能力,通常会通过硬件中断信号绑定的方式将 Multi-Queues 绑定到相应的 CPU Cores 上,结合 RSS 技术,实现将同一条 Flow 的 Traffic 总是交给相同的 Rx Queue 以及相同的 CPU Core 处理。

Linux Kernel v2.6.21 开始支持多队列网卡特性。在 NIC Driver 初始化流程中,Kernel 获悉 net_device 所支持的 Rx/Tx Queue 得数量。然后结合 CPU Cores 的数量,通过 Sum=Min(NIC Queue, CPU Core) 公式计算得出应该被激活 Sum 个 Queues,并申请 Sum 个 IRQ Numbers(硬中断请求号),分配给激活的每个 Queues。

多队列网卡通常采用 MSI-X(Message Signaled Interrupts X,消息信令中断)中断类型。MSI-X 支持为每个 NIC 分配多个 IRQ Numbers,使得每个 Rx Queues 都具有独立的 IRQ Number,因此可以绑定到不同的 CPU Cores 上。

在这里插入图片描述

处理 Rx Queue 硬中断的 CPU Core 也是随后进行处理收包的 CPU Core,如上图所示,当某个 NIC Rx Queue 收到 Frames 时,就触发自己的 IRQ,收到 IRQ 的 CPU Core 就执行 IRQ Number 对应的硬中断处理程序,最终将收包任务下发给该 Core 的 NET_RX_SOFTIRQ 实例处理(每个 Core 都有一个 NET_RX_SOFTIRQ 实例)。

在 NET_RX_SOFTIRQ 中会调用 NAPI 的收包接口,将 Frames 收到具有多个 netdev_queue 的 net_device 结构体中。

在这里插入图片描述

查看网卡启用的中断类型,如下图 MSI-X: Enable+。

$ lspci -vvv

在这里插入图片描述

可以使用 cat /proc/interrupts 查看 IPQs 的 Queue mappings 关系。

下面截选了 Network interface ens192 在每个 CPU cores 上的 IRQs 和 Queues 关系。可以看见,ens192 在 8 个 Cores 上都有中断处理,这是 IRQ 负载均衡器 irqbalance Daemon 作用的结果,但是这种均衡在高性能应用场景并不是最佳实践。例如在 DPDK 场景中,应该将 Queue 绑定到指定的 Core 上。

$ cat  /proc/interrupts
           CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7
...
 57:      20342      30923      33789      25533      46977      64504      78884      70780   PCI-MSI-edge      ens192-rxtx-0
 58:       5162       6797      10395      11019      17324      19285      21365      24282   PCI-MSI-edge      ens192-rxtx-1
 59:      14154      21925      28098      25550      48416      46239      59652      67793   PCI-MSI-edge      ens192-rxtx-2
 60:        429        836        924       1155       1917       2304       2227       3131   PCI-MSI-edge      ens192-rxtx-3
 61:       6667      16537      23922      20526      34824      38050      48226      43089   PCI-MSI-edge      ens192-rxtx-4
 62:        218        617       1149       1235       2559       2551       2098       3710   PCI-MSI-edge      ens192-rxtx-5
 63:      36892      78273      78853      27126      78559      55956      68976     107141   PCI-MSI-edge      ens192-rxtx-6
 64:       3027       6627       7506       6994      12081      13225      14441      19625   PCI-MSI-edge      ens192-rxtx-7
 65:          0          0          0          0          0          0          0          0   PCI-MSI-edge      ens192-event-8
...

如果希望手动分配,则需要先关闭 irqbalance Daemon。

$ service irqbalance stop
$ echo 01 > /proc/irq/57/smp_affinity

但需要注意的是,在大部分场景中,irqbalance Daemon 提供的中断分配优化都是可以起到积极作用的。irqbalance 会自动收集系统数据来分析出使用模式,并依据系统负载状况将工作状态调整为以下两种模式:

  1. Performance mode:irqbalance 会将中断尽可能均匀地分发给各个 CPU 的 Core,以充分提升性能。
  2. Power-save mode:irqbalance 会将中断处理集中到第一个 CPU,保证其它空闲 CPU 的睡眠时间,降低能耗。

ethtool 操作指令

  1. 设置使用 TCPv4 4-tuple HASH 计算。
ethtool -n eth0 rx-flow-hash tcp4
  1. 设置使用 UDPv4 4-tuple HASH 计算。
ethtool -N eth0 rx-flow-hash udp4 sdfn
  1. 设置 RETA 使用 6 个 Queues 的负载均衡。
ethtool -x eth0
ethtool -X eth0 equal 6
  1. 设置开启 Flow director,并将 IPv4 2-tuple 重定向到 Queue0。
ethtool -K eth0 ntuple on
ethtool -N eth0 flow-type ip4 action 0
ethtool -n eth0 flow-type
  1. 设置开启 Flow director,并使用 flexbytes 特性将 TCPv4 dstPort 5001 重定向到 Queue7。
ethtool -K net2 ntuple on
ethtool -N net2 flow-type tcp4 vlan-etype 5001 action 7
ethtool -n eth0 flow-type

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/7768.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用pandas提取含有指定字符串

这里写自定义目录标题name age state point0 Alice 24 NY 641 Bob 42 CA 922 Charlie 18 CA 70name age state point0 Alice 24 NY 642 Charlie 18 CA 700 False1 True2 TrueName: state, dtype: boolname age state point1 Bob 42 CA 922 Charlie 18 CA 700 True1 False2 True…

tmall.service.settleadjustment.modify( 修改结算调整单 )

¥开放平台免费API必须用户授权 提供给服务商在对结算有异议时,发起结算调整单。 通过说明调整单ID,调整费用值,调整原因进行结算调整单修改。 公共参数 请求地址: 公共请求参数: 公共响应参数: 请求参数 响应参数 点击获取key和…

MyBatisPlus-DML编程控制

MyBatisPlus-DML编程控制4,DML编程控制4.1 id生成策略控制知识点1:TableId4.1.1 环境构建4.1.2 代码演示AUTO策略步骤1:设置生成策略为AUTO步骤2:删除测试数据并修改自增值步骤3:运行新增方法INPUT策略步骤1:设置生成策略为INPUT步骤2:添加数据手动设置I…

【hello Linux】Linux权限管理

目录 1.shell命令以及运行原理 2. Linux权限的概念 3. Linux权限管理 3.1 文件访问者的分类 3.2 文件类型 3.3 访问权限 3.4 访问权限的表示方法 4. 访问权限的相关设置 4.1 chmod命令:修改权限 4.2 chown命令:修改文件的拥有者 4.3 chgrp 命令&#xff…

idea中的项目上传gitee

1.把gitee插件安装找重启idea 2.打开gitee网站从设置->私有令牌 获取token信息完成登录 复制到idea中点击log in 点击ok 3.把项目转为git管理 4.上传到gitee 5.去刷新gitee仓库此时就会发现多了一个我们的项目 以下是拷贝新项目到idea操作 http://t.csdn.cn/ycnSX

【Ansys】什么软件模块是DS,它和workbench、mechanical的区别在哪里?

一、DesignSpace和workbench 早期的Workbench称之为DesignSpace,更偏向于建模。 现在DS是license的一种,而分析的模块在11中称之为Simulation(Design Simulation),在12中改名为Mechanical。 所以,你可以…

IFPUG功能点度量4:度量事务功能

一、基本概念 1、事务功能 事务功能是处理数据功能的基本过程。 每个事务功能都是一个基本过程。 事务功能由多个逻辑处理来完成。 事务功能包含三种类型:EI、EO、EQ 2、基本过程 一个基本过程是由一个逻辑处理或者多个逻辑处理来完成的。 如何识别&#xf…

【备考技巧】系统集成(案例分析题)并不难

案例分析考题分析: 正常情况下四道题,计算题20分左右,剩余三道分析题每题15-20分左右。 ☆案例分析题: 从整体管理、范围管理、质量管理、人力资源管理、合同管理&采购管理、配置管理、风险管理、进度管理、成本管理中出简答题…

Jvm学习笔记(二)GC

GC 垃圾收集(GC)起源于Lisp,远比Java的历史更久,它主要思考了三件事情: 哪些内存需要回收?什么时候回收?如何回收? 本章就根据这三个点进行分析。 哪些内存需要回收? 在java堆中存放着无数的…

Mac浏览器无法上网但可以用微信等

可以使用微信QQ等,但是浏览器无法上网,Mac浏览器无法上网怎么办,Mac浏览器无法上网但可以用微信等(百度了一下,没有找到原因是为什么,只找到了解决方法,记录一下) 1.首先我们打开Ma…

Centos安装docker以及通过docker部署Mysql,照做就行!

1.安装docker 1.1给虚拟机联网(反斜杠带表该语句没写完) yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken 1.2更新本地文件镜像 # 设置docker镜像源 yum-config-manager \--add-repo \https://mirrors.aliyun.com/doc…

【Python_Selenium学习笔记(四)】基于Selenium模块实现键盘操作

基于Selenium模块实现键盘操作 前言 在 Selenium 模块中,提供了一个 Keys 类,来处理键盘操作; 在 Selenium 模块中,使用 send_keys() 方法,来模拟键盘输入, 此篇文章主要介绍如何使用 Keys 类 和 send_ke…

vue请求本地JSON文件(注意路径 否则会404)

npm i axios // main.jsimport axios from "axios";Vue.prototype.$axios axios; //全局注册,使用方法为:this.$axios...vue/cli 2 json文件存放目录为 根目录下static/json/aaa.json // 使用getVideoData() {this.$axios.create({baseURL: "&quo…

springboot 部署k8s(二)

系列文章目录 目录 系列文章目录 前言 操作步骤 1.springboot.yaml文件 2.查看deployment 3.查看service服务 4.验证服务 总结 前言 springboot 部署到k8s 上。里面涉及了deployment, Service, NodePort. 操作步骤 1.springboot.yaml文件 apiVersion: apps/v1 kind: …

codeblocks20.3配置wxWidget3.2.2.1

codeblocks20.3 # 英文版自带gcc810,不汉化 wxWidget3.2.2.1 github下载源码 win11专业版 1.下载wxWidget3.2.2.1 源码 2.下载后解压到一个目录中,不要含中文和空格。我放在:d:\wxWidget3.2.2.1 3.打开终端cd build/msw 4.编译wxWidgets 为 …

本行卡转账基本流程说明

1、业务大致流程 2、基本业务描述 大概流程说明:(牵涉到调用硬件、不便多说) 用户插卡后、选择转账交易、依次输入转入账户卡号和转账金额后,用户确定转账信息;转账交易发送前:需要根据插卡账户信息和转账…

Java基础(四)数组

1. 数组的概述 1.1 为什么需要数组 需求分析1: 需要统计某公司50个员工的工资情况,例如计算平均工资、找到最高工资等。用之前知识,首先需要声明50个变量来分别记录每位员工的工资,这样会很麻烦。因此我们可以将所有的数据全部存…

TCP报文 Flood攻击原理与防御方式

TCP交互过程中包含SYN、SYN-ACK、ACK、FIN和RST报文,这几类报文也可能会被攻击者利用,海量的攻击报文会导致被攻击目标系统资源耗尽、网络拥塞,无法正常提供服务。接下来我们介绍几种常见的Flood攻击的原理和防御方式。 SYN Flood攻击与防御…

【Qt】项目开发遇到问题及解决总结

1.控件的触发:toggle()、triggered()、clicked() 区别: 都是按钮点击后发射的信号 clicked():用于Button发射的信号triggered():用于QAction发射的信号, trigger是一次性的。 点击后,无法改变状态。 要么…

【案例教程】基于RWEQ模型的土壤风蚀模数估算及其变化归因分析实践技术

土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一,土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的首要过程。中国风蚀荒漠化面积达160.74104km2,占国土总面积的16.7%,严重影响这些地区的资源开发和社会经…