当前位置: 首页 > 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;那么这时候我们就可以使用继承的方式。新类继…...

全自动批量AI改写文章发布软件【软件脚本+技术教程】

项目原理&#xff1a; 利用AI工具将爆款文章改写发布到平台上流量变现,通过播放量赚取收益 软件功能&#xff1a; 1.可以根据你选的文章领域&#xff0c;识别你在网站上抓取的文章链接进来自动洗稿生成过原创的文章&#xff0c;自动配图 2.同时还可以将管理的账号导入进脚本软…...

strongswan:configure: error: OpenSSL Crypto library not found

引子 在配置strongswan时&#xff0c;有时会遇到以下错误&#xff08;其实所有需要openssl的软件configure时都有可能遇到该问题&#xff09;&#xff1a; configure: error: OpenSSL Crypto library not found 解决方法 crypto是什么呢? 是OpenSSL 加密库(lib), 这个库需要op…...

Xcode 常见错误

1. Xcode 15 编译出现以下错误 clang: error: SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum deployment target 从…...

【JavaEE】实现简单博客系统-前端部分

文件目录&#xff1a; 展示&#xff1a; blog_list.html: <!DOCTYPE html> <html lang"cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><t…...

首发scitb包,一个为制作统计表格而生的R包

目前&#xff0c;本人写的第3个R包scitb包已经正式在R语言官方CRAN上线&#xff0c;scitb包是一个为生成专业化统计表格而生的R包。 可以使用以下代码安装 install.packages("scitb")scitb包对我而言是个很重要的R包&#xff0c;我的很多想法需要靠它做平台来实现&a…...

2023-11-06 LeetCode每日一题(最大单词长度乘积)

2023-11-06每日一题 一、题目编号 318. 最大单词长度乘积二、题目链接 点击跳转到题目位置 三、题目描述 给你一个字符串数组 words &#xff0c;找出并返回 length(words[i]) * length(words[j]) 的最大值&#xff0c;并且这两个单词不含有公共字母。如果不存在这样的两个…...

numpy机器学习深度学习 常用函数

Python numpy(np)创建空的字符串数组、矩阵。解决数组中每个元素仅保留单个字符&#xff0c;无法完整填入字符串。 matrix1np.zeros(shape(31,22)).astype(np.str_) matrix1[matrix1 0.0] 1.reshape()方法 作用是将数据按照指定的维度重新组织并返回。也就是reshape&#x…...

连接器切断机维修

目录 起因 机器出现的问题排查 问题 检查 维修方法 今天也开始了设备的维修记录&#xff0c;今天出问题的是连接器切断器的维护&#xff01; 起因 “连接器切断机坏了&#xff0c;有没有维修的&#xff0c;机器不动了&#xff0c;没有报警&#xff0c;没有断电和气管的泄漏&…...

Mysql数据库 8.SQL语言 外键约束

一、外键约束 外键约束——将一个列添加外键约束与另一张表的主键&#xff08;唯一列&#xff09;进行关联之后&#xff0c;这个外键约束的列添加的数据必须要在关联的主键字段中存在 案例 创建原则&#xff1a;先创建不含外键的表也就是班级表 添加外键的方式 一般使用第一…...

ERROR in static/js/xxx.js from UglifyJs Unexpected token name «currentVersion»

添加链接描述 ERROR in static/js/xxx.js from UglifyJs Unexpected token name currentVersion, expected punc 遇到这种异常, 需要运行下面脚本运行npm i -D uglifyjs-webpack-pluginbeta修改webpack.prod.conf.jsjs中引入参数const UglifyJsPlugin require(uglifyjs-webpa…...