当前位置: 首页 > news >正文

dpdk 程序如何配置网卡收发包队列描述符配置?

问题描述

dpdk 程序在配置网卡队列时会涉及收发包队列描述符数量配置问题,收发包描述符的数量看似是一个简单的配置,却对转发性能有着一定的影响。实际业务程序中,收发包描述符大小配置一般参考 dpdk 内部示例程序配置进行,经验之谈是不同的网卡配置不同的描述符大小,如何确定不同网卡最优的值是一个实际的问题。

dpdk 示例程序中的缺省配置

dpdk-19.11 testpmd 示例程序源码中,使用如下变量配置收发包描述符:

#define RTE_TEST_RX_DESC_DEFAULT 0
#define RTE_TEST_TX_DESC_DEFAULT 0
uint16_t nb_rxd = RTE_TEST_RX_DESC_DEFAULT; /**< Number of RX descriptors. */
uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT; /**< Number of TX descriptors. */

这里的 nb_rxd 与 nb_txd 分别表示收包描述符个数与发包描述符个数,可以看到这里缺省的配置都为 0。
第一次读到这块代码感觉有些奇怪,在 testpmd 的所有源码中搜索了下,确认收发包描述符的缺省配置确实是这里实现的。
0 显然是个非法的数据,但是这里的代码又是这样写的,不由让人猜测是不是哪里有针对性地处理,于是分析了下代码,在本文中记录一下。

testpmd 中 nb_rxd 与 nb_txd 真正配置到 dpdk 中的代码

rte_eth_rx_queue_setup
rte_eth_tx_queue_setup

如上两个函数分别配置收包队列与发包队列,这两个函数的第三个参数就是描述符数量的配置项目。

nb_rxd 与 nb_txd 最终通过间接传入到这两个函数中实现描述符配置,说明业务层没有做额外的处理,于是进入到 ethdev 实现中寻找线索。

rte_eth_rx_queue_setup 中相关代码

	        /* Use default specified by driver, if nb_rx_desc is zero */if (nb_rx_desc == 0) {nb_rx_desc = dev_info.default_rxportconf.ring_size;/* If driver default is also zero, fall back on EAL default */if (nb_rx_desc == 0)nb_rx_desc = RTE_ETH_DEV_FALLBACK_RX_RINGSIZE;}

可以看到当描述符配置为 0 时,使用 rte_eth_dev_info_get 获取到的驱动提供的 dev_info.default_rxportconf.ring_size配置的值,如果此配置为 0 则使用宏RTE_ETH_DEV_FALLBACK_RX_RINGSIZE定义的值,其值为 512。

rte_eth_tx_queue_setup 处理逻辑类似,不再赘述。

驱动中设置 default_rxportconf.ring_size 的代码

dpdk pmd 驱动种类繁多,这里以 i40e 驱动为例,分析这部分配置的逻辑。
搜索到 i40e_dev_info_get 函数中有如下代码:

        if (I40E_PHY_TYPE_SUPPORT_40G(hw->phy.phy_types)) {/* For XL710 */dev_info->speed_capa = ETH_LINK_SPEED_40G;dev_info->default_rxportconf.nb_queues = 2;dev_info->default_txportconf.nb_queues = 2;if (dev->data->nb_rx_queues == 1)dev_info->default_rxportconf.ring_size = 2048;elsedev_info->default_rxportconf.ring_size = 1024;if (dev->data->nb_tx_queues == 1)dev_info->default_txportconf.ring_size = 1024;elsedev_info->default_txportconf.ring_size = 512;} else if (I40E_PHY_TYPE_SUPPORT_25G(hw->phy.phy_types)) {/* For XXV710 */dev_info->speed_capa = ETH_LINK_SPEED_25G;dev_info->default_rxportconf.nb_queues = 1;dev_info->default_txportconf.nb_queues = 1;dev_info->default_rxportconf.ring_size = 256;dev_info->default_txportconf.ring_size = 256;} else {/* For X710 */dev_info->speed_capa = ETH_LINK_SPEED_1G | ETH_LINK_SPEED_10G;dev_info->default_rxportconf.nb_queues = 1;dev_info->default_txportconf.nb_queues = 1;if (dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_10G) {dev_info->default_rxportconf.ring_size = 512;dev_info->default_txportconf.ring_size = 256;} else {dev_info->default_rxportconf.ring_size = 256;dev_info->default_txportconf.ring_size = 256;}}

将上述逻辑进行整理,得到如下表格:

⽹卡类型收发包队列数⽬收包描述符个数发包描述符个数
40G XL710120481024
40G XL710大于 11024512
25G XXV710*256256
X710 10G*512256
X710 1G*256256

观察到上面的表格有如下特征:

  1. 收包描述符一般为发包描述符数量的 2 倍
  2. 带宽更高的网卡一般需要配置更大数量的收发包描述符数目

dpdk 网卡收发包队列缺省描述符配置如何确定?

使用驱动内部默认值,默认值不符合要求则单独调优

代码配置方式如下:

  1. 应用程序调用 rte_eth_rx_queue_setup 时设置 nb_rx_desc 参数为 0
  2. 应用程序调用 rte_eth_tx_queue_setup 时设置 nb_tx_desc 参数为 0
  3. 重新编译应用部署运行,测试性能是否达标

此时 dpdk 内部会根据不同网卡类型获取驱动缺省配置进行设置,如果驱动未提供缺省值,则使用全局默认值,这些配置值都是最优配置。

收发包描述符影响什么?

发包流程

在 网卡手册阅读:ixgbe 发包流程研究 这篇文章中我描述过 intel 82599 网卡的发包流程,其中一个关键的结构是环形描述符队列。

dpdk 驱动发包时,首先会申请【空闲】的发包描述符,然后使用 mbuf 中的字段填充描述符,填充完成后再更新 TDT 寄存器(设置了一个门限降低频繁访问寄存器 I/O 的性能影响)。

网卡硬件读取 TDH 与 TDT之间的发包描述符发起 PCIE 传输 copy 报文到内部的 fifo 中然后更新 TDH 并回写描述符(也存在一个门限)。

上图实际运作过程中,TDH 在不断的追 TDT,到达环的底部后再回到起始位置。

cpu 填充发包描述符的速度很快,这个环形队列的长度在某种程度上代表了cpu 缓冲给 PCIE 传输与网卡更新描述符的时间,理想的情况是 cpu 一直能够获取到空闲的描述符,这样 cpu 等待的时间就非常少了,cpu 与 PCIE、网卡的并行性更好,性能表现也就更好了。

如果将描述符的数量设置为 1,在这种极端的情况下,cpu 就要不断地等待,接近于上文描述的在 rte_eth_tx_burst 中等待发包完成的情况。

在 dpdk 问题分析:dpdk-19.11 性能优于 dpdk-16.04 问题分析 这篇文章中,我就曾经描述过通过调大 dpdk-16.04 的默认描述符个数来达到性能优化的目标,背后的原理就是增加留给 PCIE 传输报文与网卡处理的缓冲时间。

收包流程

收包流程也存在一个环形描述符队列,其中的并行性问题与发包大致相同,不过发包描述符的数量配置在一定情况下对收包也有影响,增加发包描述符为网卡硬件传输缓冲了更多时间,但是也意味着对报文 buf 占用了更多的时间,当收包已经接近负载的时候,可能会因为发包描述符的调整导致 buf 不足,出现 imissed,一般需要对收发包描述符整体调优,单点调优的意义不大。

总结

网卡收发包队列描述符配置看似是一个小的配置,其背后也有诸多细节。如何确定一个最优的配置常常不是一个容易的问题,需要对现有的实现跟底层原理有相对清晰的了解,既知道哪种配置是最优的,也知道为啥它是最优的,这点就相对有些难度了。

相关文章:

dpdk 程序如何配置网卡收发包队列描述符配置?

问题描述 dpdk 程序在配置网卡队列时会涉及收发包队列描述符数量配置问题&#xff0c;收发包描述符的数量看似是一个简单的配置&#xff0c;却对转发性能有着一定的影响。实际业务程序中&#xff0c;收发包描述符大小配置一般参考 dpdk 内部示例程序配置进行&#xff0c;经验之…...

二蛋赠书七期:《云原生数据中台:架构、方法论与实践》

前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此&#xff0c;我非常感激大家一直…...

计算机毕设 基于大数据的服务器数据分析与可视化系统 -python 可视化 大数据

文章目录 0 前言1 课题背景2 实现效果3 数据收集分析过程**总体框架图****kafka 创建日志主题****flume 收集日志写到 kafka****python 读取 kafka 实时处理****数据分析可视化** 4 Flask框架5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&a…...

初识rust

调试下rust 的执行流程 参考&#xff1a; 认识 Cargo - Rust语言圣经(Rust Course) 新建一个hello world 程序&#xff1a; fn main() {println!("Hello, world!"); }用IDA 打开exe&#xff0c;并加载符号&#xff1a; 根据字符串找到主程序入口&#xff1a; 双击…...

shiro-cve2016-4437漏洞复现

一、漏洞特征 Apache Shiro是一款开源强大且易用的Java安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性。 因为在反序列化时,不会对其进行过滤,所以如果传入恶意代码将会造成安全问题 在 1.2.4 版本前, 加…...

【MongoDB-Redis-MySQL-Elasticsearch-Kibana-RabbitMQ-MinIO】Java全栈开发软件一网打尽

“Java全栈开发一网打尽&#xff1a;在Windows环境下探索技术世界的奇妙之旅” 前言 全栈开发是一项复杂而令人兴奋的任务&#xff0c;涵盖了从前端到后端、数据库到可视化层、消息队列到文件存储的广泛领域。本文将带您深入探讨在Windows环境下进行全栈开发的过程&#xff0…...

Implementing class错误解决

最近在使用IDEASmart Tomcat启动项目时&#xff0c;报以下错误&#xff1a; Injection of resource dependencies failed; nested exception is java.lang.IncompatibleClassChangeError: Implementing class根据网上结论加上我这里的原因&#xff0c;总共以下几个方面&#x…...

关于 国产系统UOS系统Qt开发Tcp服务器外部连接无法连接上USO系统 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134254817 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…...

初阶JavaEE(15)(Cookie 和 Session、理解会话机制 (Session)、实现用户登录网页、上传文件网页、常用的代码片段)

接上次博客&#xff1a;初阶JavaEE&#xff08;14&#xff09;表白墙程序-CSDN博客 Cookie 和 Session 你还记得我们之前提到的Cookie吗&#xff1f; Cookie是HTTP请求header中的一个属性&#xff0c;是一种用于在浏览器和服务器之间持久存储数据的机制&#xff0c;允许网站…...

C++入门学习(1)命名空间和输入输出

前言 在C语言和基本的数据结构学习之后&#xff0c;我们终于迎来了期待已久的C啦&#xff01;C发明出来的意义就是填补一些C语言的不足&#xff0c;让我们更加方便的写代码&#xff0c;所以今天我们就来讲一下C语言不足的地方和在C中的解决办法&#xff01; 一、命名空间 在学习…...

AI:58-基于深度学习的猫狗图像识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...

【原创】java+swing+mysql宠物领养管理系统设计与实现

摘要&#xff1a; 生活中&#xff0c;有很多被人遗弃的宠物&#xff0c;这些宠物的处理成为了一个新的难题。生活中也有许多人喜欢养宠物&#xff0c;为了方便大家进行宠物领养&#xff0c;提高宠物领养管理的效率和便利性。本文针对这一问题&#xff0c;提出设计和实现一个基…...

虚拟机Linux-Centos系统网络配置常用命令+Docker 的常用命令

目录 1、虚拟机Linux-Centos系统网络配置常用命令2、Docker 的常用命令2.1 安装docker步骤命令2.2 在docker容器中安装和运行mysql 2、dockerfile关键字区别(ADD/COPY,CMD/ENTRYPOINT) 1、虚拟机Linux-Centos系统网络配置常用命令 进入网络配置文件目录 cd /etc/sysconfig/ne…...

数据分析相关知识整理_--秋招面试版

一、关于sql语句(常问&#xff09; 1&#xff09;sql写过的复杂的运算 聚合函数&#xff0c;case when then end语句进行条件运算&#xff0c;字符串的截取、替换&#xff0c;日期的运算&#xff0c;排名等等&#xff1b;行列转换&#xff1b; eg&#xff1a;行列转换 SELE…...

HMM与LTP词性标注之命名实体识别与HMM

文章目录 知识图谱介绍NLP应用场景知识图谱&#xff08;Neo4j演示&#xff09;命名实体识别模型架构讲解HMM与CRFHMM五大要素&#xff08;两大状态与三大概率&#xff09;HMM案例分享HMM实体识别应用场景代码实现 知识图谱介绍 NLP应用场景 图谱的本质&#xff0c;就是把自然…...

Sui发布RPC2.0 Beta,拥抱GraphQL并计划弃用JSON-RPC

为了解决现有RPC存在的许多已知问题&#xff0c;Sui正在准备推出一个基于GraphQL的新RPC服务&#xff0c;名为Sui RPC 2.0。GraphQL是一种开源数据查询和操作语言&#xff0c;旨在简化需要复杂数据查询的API和服务。 用户目前可以访问Sui主网和测试网网络的Beta版本的只读快照…...

设计模式—结构型模式之桥接模式

设计模式—结构型模式之桥接模式 将抽象与实现解耦&#xff0c;使两者都可以独立变化。 在现实生活中&#xff0c;某些类具有两个或多个维度的变化&#xff0c;如图形既可按形状分&#xff0c;又可按颜色分。如何设计类似于 Photoshop 这样的软件&#xff0c;能画不同形状和不…...

【RabbitMQ】RabbitMQ 消息的堆积问题 —— 使用惰性队列解决消息的堆积问题

文章目录 一、消息的堆积问题1.1 什么是消息的堆积问题1.2 消息堆积的解决思路 二、惰性队列解决消息堆积问题2.1 惰性队列和普通队列的区别2.2 惰性队列的声明方式2.3 演示惰性队列接收大量消息2.4 惰性队列的优缺点 一、消息的堆积问题 1.1 什么是消息的堆积问题 消息的堆积…...

深度优先遍历与连通分量

深度优先遍历(Depth First Search)的主要思想是首先以一个未被访问过的顶点作为起始顶点&#xff0c;沿当前顶点的边走到未访问过的顶点。当没有未访问过的顶点时&#xff0c;则回到上一个顶点&#xff0c;继续试探别的顶点&#xff0c;直至所有的顶点都被访问过。 下图示例的…...

Python学习笔记--类的继承

七、类的继承 1、定义类的继承 说到继承&#xff0c;你一定会联想到继承你老爸的家产之类的。 类的继承也是一样。 比如有一个旧类&#xff0c;是可以算平均数的。然后这时候有一个新类&#xff0c;也要用到算平均数&#xff0c;那么这时候我们就可以使用继承的方式。新类继…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...