基于DPDK(x86平台)应用性能优化实践

news2025/8/2 20:30:59

产生性能瓶颈有多方面的原因,包括硬件(自身能力限制或BIOS设置不当)、操作系统(某些feature没打开)和软件。软件方面的性能瓶颈主要是由于编码不当导致,常见原因有以下几种:

  • 数据结构cache line未对齐,访问的数据跨cache line
  • 不恰当的内存操作
  • cache miss严重,经常跨socket访问数据
  • 锁竞争
  • 中断太多
  • context切换频繁

本文讲述了在编码时如何利用x86平台的特点(主要是内存方面)来避免性能瓶颈的技巧,并对性能优化给出一种思路。

UMA与NUMA

UMA(Uniform Memory Access),即统一内存访问。在UMA内存架构中,所有处理器通过一条总线共享内存,如下图所示:

因为UMA结构中,所有处理器均通过同一条总线访问内存,故访问内存所花时间是一样的。且访问时间与数据在内存中的位置无关。而在NUMA(Non Uniform Memory Access,非一致性内存访问)结构中,访问内存所需时间与数据在内存中的位置有关,每个处理器都有自己的本地内存,访问本地内存速度很快,通过共享总线可以访问其他处理器的本地内存。结构如图所示:

正如前面所说,在NUMA结构中,访问内存所需时间与数据在内存中的位置有很大关系。处理器访问自己的本地内存要比访问其他处理器的本地内存要快得多。DPDK支持NUMA架构,接下来主要介绍一些进行内存操作方面需要注意的地方。

减少内存拷贝

出于性能考虑,要最小化数据的内存拷贝。在写代码的时候,当遇见需要拷贝数据时,考虑有没有一种更好的解决方式替代,如传递指针而非整个数据结构;在需要使用strcpy和memcpy时,用rte_strcpy和rte_memcpy作替。

合理分配内存

在实时处理数据包转发的系统中,一般不建议在数据面进行动态内存分配,因为不停的申请和释放动态内存会使堆产生碎片,管理这样的堆开销很大。如果真的需要在程序中动态申请内存,要避免使用libc的malloc接口,使用DPDK提供的类malloc函数作为替代。DPDK主要提供三种内存模型:rte_malloc、rte_mempool、rte_memzone,它们的使用场景如下:

  • 需要使用malloc时,用rte_malloc
  • 需要高性能分配内存时,用rte_mempool
  • 当程序需要分配一大块内存,在程序的生命周期不释放,用rte_memzone

关于内存申请,通常的做法是在程序初始化阶段分配好固定大小内存,通过指针链表串连起来管理它的分配与回收。例如,NAT中的分片处理,当后续分片先于首片到达设备时需要先缓存起来,每次从链表头取出一个结点来缓存报文,当缓存报文处理完后,又把该结点“回收”到链表头部。

尽量访问本地内存

根据前面的介绍,在NUMA系统中,访问本地内存比访问远端内存更佳高效。如上图所示,一个运行在core0上的应用访问数字标号处数据的速度快慢从高到低为1 > 2 > 3 > 4。在程序运行时,要避免进行过多的远端内存访问,DPDK提供在指定socket上分配memory的API。

如果内存充裕的话,可以考虑复制一份数据到另一个socket上来提升数据读取的速度。

数据结构设计

  • 成员变量从大到小排列,避免过多的padding。考虑如下两个结构体:
 struct s1
{
    int a;
    char b;
    char c;
};

struct s2
{   
    char b;
    int a;
    char c;
};

复制

结构体s1的大小为8字节,结构体s2为12字节,在定义时不考虑padding的话,每个结构体变量会浪费4字节。

  • 避免数据结构跨cache line,一条cache line应当正好放下整数个(N≥1)对象。

红色标识的obj2被load在两条cache line,如果访问这个对象时cpu需要更多的时钟,在数据结构时应该避免。可以在定义数据结构时用宏__rte_cache_aligned或加入padding成员。

 struct s3
{
    uint32_t x;
    uint16_t y;
}__rte_cache_aligned;

struct s4
{
    uint32_t x;
    uint16_t y;
    uint16_t padding;
}

复制

数据预取

一般访问CPU的cache效率最高,提前将需要处理的数据load到cache可以提高性能,但预取必须在合适的时间点发起,过早发起预取会导致数据还没有被使用就被替换出cache,最终适得其反,所以需要根据实际应用场景和多次尝试找到最合适的预取时间点。

通常在进行数据包处理时会先对数据包进行预取操作。DPDK提供的接口rte_prefetch0会触发cpu进行预取操作,如下是预取数据包的示例代码:

 /* Prefetch first packets */
for (j = 0; j < PREFETCH_OFFSET && j < nb_rx; j++) {
	rte_prefetch0(rte_pktmbuf_mtod(pkts_burst[j], void *));
}
/* Prefetch and forward already prefetched packets */
for (j = 0; j < (nb_rx - PREFETCH_OFFSET); j++) {
	rte_prefetch0(rte_pktmbuf_mtod(pkts_burst[j + PREFETCH_OFFSET], void *));
	l3fwd_simple_forward(pkts_burst[j], portid);
}
/* Forward remaining prefetched packets */
for (; j < nb_rx; j++) {
	l3fwd_simple_forward(pkts_burst[j], portid);
}

复制

其他技巧

  • 对于一些代码行数不多且经常被调用的函数,定义为静态内联函数(static inline function),可以省去函数调用开销
  • 分支预测,对于经常发生或不常发生的分支使用likely()/unlikely()来帮助编译器生成更加高效的可执行文件,减少cache miss

性能瓶颈分析的一般方法

上面提的一些技巧可以帮助在开发过程中规避部分性能陷阱,但仅仅做到这些是不够的,就像任何程序都有bug一样,性能瓶颈始终是存在的。通过阅读代码很难发现产生瓶颈的原因,这时候就需要借助一些测量工具来帮助定位原因了。

通常作性能瓶颈分析时需要找一个软件基准版本,给出一个metric值(通常由测试仪器给出,比如时延、吞吐量),然后再通过分析工具定位出产生性能缺陷的代码,反复修改这部分代码再给出一个metric值与之间的值作比较,直到metric值达到自己的预期为止。

Linux提供了很多开源工具来分析程序性能,比如iostat、perf、vmstat等。Intel也提供了一款专业的性能分析工具VTune帮助开发人员分析和定位程序性能瓶颈。Intel处理器内部有许多事件计数器,当有事件发生时对应的计数器加一,与程序性能相关的计数器有如下几种:

  • cache misses
  • 分支预测错误
  • DTLB misses
  • 长延时指令和异常

通过查看这些计数器值大小便可断定瓶颈原因,这是一种较底层的分析方法,需要对Intel CPU架构有所了解,且不能定位到产生瓶颈的具体代码行。VTune提供的另外一种分析方法Hotspots,能够帮助开发人员找出程序中消耗CPU最多的(热点)函数,通过这些列出的热点函数可以快速定位到代码行。通常使用Hotspots分析能够找出一般常见的性能瓶颈。

VTune提供Windows下的GUI和Linux下的CLI两种版本。我在项目中一般先用CLI版本的VTune采集运行程序机器的数据,然后将产生的结果移至windows下用GUI版本的VTune来分析,图形化的界面能够更利于定位分析。下面是利用VTune分析程序hotspots的demo:

1. 模拟测试环境,运行需要调优的程序;

2. 执行amplxe-cl,指定采集类型和目标程序,开始采集数据,运行结束后会在当前目录下生成类似r000hs名称的目录,里面存放的是收集的结果

 ./amplxe-cl -collect hotspots -target-pid=29892

复制

3. 将目录拷贝到windows下,用VTune打开文件r000hs.amplxe

VTune打开后,出现的是一个关于hotspots的视图(因为之前指定收集的类型为hotspots,如果指定其他收集类型比如cpu events,则会出现对应视图)。里面有多个标签页记录了在采集过程中最耗CPU时间的函数。

Summary标签页记录了程序性能的大概数据,包括CPU耗时,top hotspots和系统信息。

Bottom-up标签页按函数消耗CPU时间从大到小排序,并可以查看函数的调用栈,如果目标程序没有采用编译优化,VTune甚至能定位到具体代码行,通过这些信息就可以很容易找到哪些代码最消耗CPU时间了。

(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂

更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,永久学习,或点击这里加qun免费
领取,关注我持续更新哦! !   

在性能调优时,最好使用未经编译器优化的版本测试,这样VTune能够帮助定位到具体的代码行。采集时间不宜过长,否则会导致VTune分析缓慢,一般设置为60s即可,可通过amplxe-cl的参数指定,具体使用方法参考Intel Developer Zone。

总结

性能优化是个体力活又是一个细心活,需要反复的代码修改和测试数据才能找到性能瓶颈所在。熟悉底层开发环境和x86系统结构对性能优化有很大帮助,只有在了解开发环境之后才能写出跑得更快的代码,只有熟知CPU内部结构才能在优化时提供更多的线索,一款好的分析工具也是必不可少的。本文只是讲了性能优化技巧的冰山一角,更多的是要在实际项目中不断摸索积累经验,具体问题具体对待。

原文链接:https://cloud.tencent.com/developer/article/1394706

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【多线程】读写锁ReentrantReadWriteLock源码分析

【多线程】读写锁ReentrantReadWriteLock源码分析&#xff08;一&#xff09;读写锁ReentrantReadWriteLock源码分析【1】类图结构和参数【2】写锁的获取和释放&#xff08;1&#xff09;lock方法&#xff08;2&#xff09;lockInterruptibly方法&#xff08;3&#xff09;tryL…

GPS+北斗定位借助Arduino的数值显示

GPS北斗定位借助Arduino的数值显示 一、前言二、硬件要求三、参数基础四、原理剖析五、使用方式六、程序概要七、成果展示八、数据解析九、总结一、前言 较多的导航软件在生活中层出不穷&#xff0c;但是卫星定位同样也适用于轨迹记录、经纬分析、授时系统等&#xff0c;多样的…

【杰理AC696X】外挂FLASH音乐播放及Bin文件制作

外挂FLASH音乐播放及Bin文件制作 测试SDK版本&#xff1a;《ac696n_soundbox_sdk_v1.6.0》 文章目录外挂FLASH音乐播放及Bin文件制作前言一、板级配置1.1 SPI配置1.2 FLASH配置二、FLASH音乐播放测试三、FLASH BIN文件制作1.1 FLASHPCWinHex1.2 U盘分区工具WinHex1.3 FLASHPCF…

嵌入式单片机智能药盒设计(含代码)

目录 前言 设计的内容 &#xff08;1&#xff09;显示 &#xff08;2&#xff09;定时时间与用药量的设定 &#xff08;3&#xff09;实时时间调节 &#xff08;4&#xff09;报警功能 时钟模块 蓝牙模块 系统软件设计 系统主程序 按键函数 中断服务函数 作品展示 测试药…

2023年天津农学院专升本专业课参考教材

2023年天津农学院高职升本科专业课参考教材一、人力资源管理专业 1、《人力资源管理实用教程》 (第2版)&#xff0c;吴宝华&#xff0c;北京大学出版社 2、《人力资源管理》&#xff08;第4版&#xff09;&#xff0c;刘昕&#xff0c;中国人民大学出版社 3、《人力资源管理概论…

kobject 与sysfs属性文件读写

kobject和kset的简单总结 • kobject是struct kobject类型的对象。Kobject 有一个名字和一个引用计数。kobject 也有一个父指针&#xff08;允许 kobjects 被安排到层次结构中&#xff09;&#xff0c;一个特定的类型&#xff0c;也许还有一个在 sysfs 虚拟文件系统中的表示。…

OceanBase 4.0 解读:分布式查询性能提升,我们是如何思考的?

关于作者 王国平 OceanBase高级技术专家 目前OceanBase SQL引擎的技术负责人。2016年加入 OceanBase&#xff0c;负责SQL引擎的研发工作。2008年毕业于哈尔滨工业大学&#xff0c;2014年在新加坡国立大学获得博士学位&#xff0c;博士期间主要研究方向是数据库领域的(多)查询…

C++入门(2)-类与对象

类与对象初步认识类与对象一、面向过程与面向对象的区别二、类与结构体三、类的定义四、类的实例化五、类对象六、this指针七、构造函数八、析构函数九、拷贝构造函数十、运算符重载函数初步认识类与对象 一、面向过程与面向对象的区别 C语言是面向过程进行编程&#xff0c;注…

springboot整合其他项目

目录 一&#xff0c;集成Druid 学习地址&#xff1a; 主要讲监控 基于springboot视图渲染技术上增加代码 1.1 增加pom依赖 1.2 先在application.yml中添加Druid的数据源 1.3 其次在全局配置文件application.yml中添加所需的配置 配置截图&#xff1a; 配置解析 1.4 启动…

电脑录屏快捷键是什么?win10自带屏幕录制在哪

​在使用电脑的过程中&#xff0c;我们难免会遇到使用电脑录屏功能。有时候可能是想录制网课&#xff0c;有时候可能是想录制游戏的精彩操作&#xff0c;有时候可能只是想录制会议内容。 电脑录屏能够将重要的画面内容进行录制&#xff0c;十分的方便。但也有很多的小伙伴不清…

Python基础(三):PyCharm安装和使用

文章目录 PyCharm安装和使用 一、PyCharm的作用 二、PyCharm系统要求 三、下载和安装 四、PyCharm基本使用 五、PyCharm的基本设置 1、修改主题 2、修改代码文字格式 3、修改解释器 4、项目管理 PyCharm安装和使用 14天学习训练营导师课程&#xff1a;杨鑫《Python…

一、VSCode——免安装

介绍 Visual Studio Code支持可移植模式。此模式使 VS Code 创建和维护的所有数据都位于自身附近&#xff0c;因此可以跨环境移动。 此模式还提供了设置 VS Code 扩展的安装文件夹位置的方法&#xff0c;这对于阻止在 Windows AppData 文件夹中安装扩展的企业环境非常有用。 …

极市打榜|70G+已标注数据集出炉,油品泄露识别等全新算法上线!

极市打榜 算法打榜是极市平台推出的一种算法项目合作模式&#xff0c;至今已上线 100 产业端落地算法项目&#xff0c;已对接智慧城市、智慧工地、明厨亮灶等多个行业真实需求&#xff0c;算法方向涵盖目标检测、行为识别、图像分割、视频理解、目标跟踪、OCR等。 开发者报名…

CAN 协议控制器和物理总线之间的接口芯片SIT1040T 高速 CAN 总线收发器

CAN 协议控制器和物理总线之间的接口芯片SIT1040T 高速 CAN 总线收发器 CAN是最新进的现场总线,灵活性好,通讯可靠性高,抗干扰能力强&#xff0c;超长通信距离等优点,110个节点,兼带CAN-FD功能产品,容错电压可达-70V~ 70V,温度范围高达-40C ~ 150C最初应用于汽车电子,目前已广…

安信可Ai-WB1系列AT指令连接MQTT阿里云物联网平台

文章目录前言1 准备材料2 创建云端设备3 硬件连接4 配置终端设备5 MQTT实现发布&订阅消息联系我们前言 本文将介绍安信可AI-WB1系列通过AT指令接入阿里云物联网平台&#xff0c;实现MQTT的订阅和发布。 1 准备材料 AI-WB1系列模组或者开发板USB转TTL模块/Type-C数据线阿…

数仓建设教程

50000字&#xff0c;数仓建设保姆级教程&#xff0c;离线和实时一网打尽(理论实战) 上 - 腾讯云开发者社区-腾讯云 (tencent.com)50000字&#xff0c;数仓建设保姆级教程&#xff0c;离线和实时一网打尽(理论实战) 下_五分钟学大数据的技术博客_51CTO博客#yyds干货盘点#最强最全…

什么是DDoS攻击?企业服务器是否需要DDoS防御

有时候你可能会遇到某个网站突然打不开&#xff0c;这一段时间后发布自己被DDos攻击的公告&#xff0c; 那么&#xff0c;为什么DDOS攻击能让服务器瘫痪&#xff1f;黑客又如何执行DDos攻击的呢&#xff1f; DDoS全称为Distributed Denial of Service&#xff08;分布式拒绝服…

Anemoi hash:一种SNARK-friendly的哈希函数

随着zk的兴起&#xff0c;出现了一大批zk友好且面向算术化(Arithmetization-Oriented)的哈希函数&#xff0c;如MiMC-Hash, Rescue–Prime, Poseidon等等&#xff0c;本文要介绍的Anemoi是今年新出的一种zk友好且面向算术化的哈希函数&#xff0c;与其他哈希函数相比&#xff0…

让我们进入面向对象的世界(三)

文章目录前言一.了解什么是继承二.我们针对继承来设计一个动物继承树前言2.1 第一步 找出共同属性和行为的对象2.2 设计代表共同状态行为的类2.3 决定子类是否让某项行为有不同的运作方式。2.4我们仔细去观察一下子类的特征&#xff0c;争取更多的抽象化的机会。三.继承的相关语…

leetcode:887. 鸡蛋掉落【经典dp定义】

目录题目截图题目分析ac code总结题目截图 题目分析 变量&#xff1a;鸡蛋的数量&#xff0c;楼层n&#xff0c;尝试的次数m有一个单调性容易发现&#xff1a;尝试的次数越多&#xff0c;能解决楼层越高的确切值另一个单调性&#xff1a;鸡蛋的数量越多&#xff0c;能够解决楼…