dwceqos网络驱动性能优化

文章介绍

本文会分享一些在QNX系统下对io-pkt-v6-hc驱动模块cpu loading过高问题优化的经验,以及一些调优debug的方法。这些优化措施实施之后可以降低io-pkt-v6-hc在高负载的情况下的cpu loading。本文的调优是基于synopsys公司的dwceqos模块,理论上方法适用于所有采用了该IP core的SOC平台.

问题背景

硬件平台:BST A1000, QNX

ADAS域控通过以太网接收激光雷达部件发送过来的激光数据,测试过程中发现,在激活激光雷达功能的情况下,激光雷达的数据包会出现比较明显的丢帧现象.

初步调查发现,在发生丢帧时,整个系统的cpu loading非常的高(100%),而且持续处于这种状态,整个系统cpu资源处于过载的状态.

从上面的cpu loading表现来看,QNX的io-pkt-v6-hc的整体cpu loading很高.

由于这个问题的存在已经严重影响了功能的正常使用,所以我们想在不影响性能的前提下,尽可能优化cpu loading,已达到一个合理的范围。

调查过程

这里我们需要弄明白的第一个问题是:即当前在这种测试场景下,我们cpu loading表现是否正常?是否符合芯片设计的要求?

这里引出来几个话题:

一、我们的硬件设计是怎样的?了解硬件的整体框架对于我们进行问题调查和优化是必要的

从上面的示意图可以看到,Lidar部件通过以太网与RTL9068 switch进行连接,swtich则通过RGMII与SOC的MAC硬件进行直连.

二、软件框架是怎样的?io-pkt-v6-hc是和那个硬件模块交互?

同样的,我们也需要了解整个系统中与我们问题相关的模块的软件框架大致是怎么样的,特别是数据传输的整个过程.

上图示意了简单的软件框架,这其中涉及到几个部分:

a, app与QNX操作系统的网络模块io-pkt-v6-hc的交互,需要注意的是,io-pkt-v6-hc是QNX的网络服务框架,上面的示意图严格来说并不十分准确,因为APP并不会与io-pkt-v6-hc直接进行交互,但是所有的网络数据交互都会经过io-pkt-v6-hc,再由其调用实际的以太网驱动进行数据传输(图中是MAC-driver)。

有关io-pkt-v6-hc有关的信息可以参考:io-pkt-v6-hc

b, io-pkt-v6-hc与mac-drviver的交互

在我们平台上,io-pkt-v6-hc对接的MAC以太网驱动devnp-dwceqos-mv88e1512.so。在接收网络数据传输时,最先由MAC硬件接收,再由驱动进行处理,然后调用if_input注入qnx的网络子系统中.

io-pkt-v6-hc与mac驱动模块有很多交互,这里不展开,更多细节可以参考这个链接:writing a qnx network driver

c,mac 驱动与硬件的交互

在芯片层面,MAC这个硬件模块大致与CPU以及其他模块的连接大致如下(不完全准确):

其中比较重要的是需要知道,MAC硬件模块与SOC的中断控制器(IC)有数条中断线进行连接,其中的中断号可以通过对应的手册查询到:

这里有必要研究明白mac模块中的中断是如何产生的,在mac硬件中有多中断,有的用于表明异常,有的用于表明状态,我们目前关注的中断是和数据传输相关的中断:

sbd_perch_tx_intr_o[],传输中断

sbd_perch_rx_intr_o[],接收中断

sbd_intr_o,通用中断

更多细节需要你参考手册中“2.6Interrupts” 章节

三、当前的loading状态是否正常?

针对这个问题,我们最先和我们的芯片供应商进行了讨论,但是从反馈来看,他们似乎也并没有什么比较好的解决方法(他们知道这个问题的存在).由于这个部分的驱动代码由ip core供应商开发,所以他们并不十分了解其中的细节.

查看了这个MAC的IP core状态,是synopsys公司的dwceqos模块,这个ip core不止在我们这个SOC上使用,同时在高通的多款芯片上也有应用。

基于这个背景,我们也同时测试了8155 q+a/8155 lv/8255 q+a/8295 q+a 这几个平台上的表现,发现表现基本相同,即在千兆以太网传输的case下,cpu loading普遍会很高.

从各方反馈的结果来看,测试结果似乎符合预期的?但是直觉上又感觉不合理,因为进行网络传输占用如此多都cpu资源似乎并不合理(相比其他平台进行网络传输并不会有很高的loading)。

调查思路

一般来说,cpu负荷过高通常有2个原因,一是,cpu现在的确一直在干活,那么优化的思路是优化cpu的工作内容,二是,cpu一直在被中断,反复的状态切换带来的高消耗。

优化尝试

1,确认是否启用DMA

2,修改网络模块收发buffer size

3,修改驱动加载参数

4,中断优化

基于中断合并的思路,我们翻阅了"DesignWare Cores Ethernet Quality-of-Service
Databook" 
这个ip core的datasheet,其中有一段描述:

这段话简单概括来说是,如果你想优化性能,那么最好使用IOC标志位&定时器来产生中断,而不是每次DMA传输完成都产生一次中断.

其中还有一段关于中断模式的描述:

简单概括来说就是,在中断模式0(default)的情况下,只要检测到RX/TX的IOC标志位都会立即触发通用中断(sbd_intr_o),而在1/2模式下,则完全不触发sbd_intr_o中断,而只会触发sbd_perch_tx_intr_o[]或者sbd_perch_rx_intr_o[]

到这里,我们又遇到了问题: 该如何确认我当前驱动工作在那个模式下?

通过驱动代码&SOC芯片手册,我们可以确定这个GMAC控制的寄存器地址,通过devmem2直接读取其值:

note:

1,这里读到的值是我修改过之后的值,默认情况下读到的值是0x0

2,如果devmem2工具不可用,那么可以用qnx提供的in32/out32来读写寄存器

4.1 中断模式修改

到这里,我们首先尝试直接修改中断模式,修改为1/2模式之后,网络驱动完全不可用,无法传输数据。想了下,原因其实很简单,因为驱动已经指定了中断触发的源是sbd_intr_o,我们更改模式之后,因为并没有中断源与当前驱动挂钩,所以即使有数据传输产生也不会产生任何函数调用。

我们通过修改驱动更新了中断源为sbd_perch_rx_intr_o,测试之后发现效果并没有什么变化

原因在于,现在每次DMA描述符都被设置了IOC标志位,意味着,每次传输完成都会产生sbd_perch_rx_intr_o中断,与我们预期还是不符合.

4.2 中断模式修改+修改中断源+定时器触发

基于上面的原因,我们清除了驱动中大部分都DMA描述符的IOC标志位,只在特定的DMA描述符上设置IOC标志位,比如4/16/32。

不过这个时候还是有问题,因为DMA传输只在有IOC标志位的描述符传输完成时产生中断,如果没有检测到IOC标识符则不会产生中断,那么数据的实时性就没有保证了,比如你只传递了一次数据,那么这个数据并不会及时得接收到(因为还未达到IOC触发阈值).

为了解决这个问题,我们需要增加一个timer来定时触发中断,按照手册的描述:

当timer寄存器写入数值时,如果此时一个RX DMA传输完成,且IOC标志位没有被设置,那么timer将会启动,在RWT*RWTU个系统时钟后超时,并产生中断.

优化结果对比

优化前测试结果

iperf3传输速度:

cpu loading表现(每隔1s采样一次)

中断表现:

优化后测试结果

iperf3 测试表现:

cpu loading表现(每隔1s采样一次)

中断表现

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

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

相关文章

【Android 源码分析】Activity生命周期之onPause

忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

【STM32 HAL库】MPU6050 DMP库移植 与 自检失败的处理

【STM32 HAL库】MPU6050 DMP库移植 与 自检失败的处理 本文参考移植步骤文件配置代码修改inv_mpu.cinv_mpu.hinv_mpu_dmp_motion_driver.c 使用 自检失败怎么处理ret -1改正DEBUG过程 ret -9改正DEBUG过程 本文参考 B站 CSDN 移植步骤 文件配置 新建一个 dmp 文件夹 并将…

【Linux】进程地址空间、环境变量:从理论到实践(三)

🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 🚀 前言一:🔥 环境变量 🥝 基本概念🥝 常见环境变量🥝 查看环境变量方法 二:🔥 测试 &…

Nat. Commun.:飞秒激光书写受蚂蚁启发的可重构微型机器人集体

背景介绍生物在各种环境中的集体行为十分普遍,它们能够自发有序地完成单个个体难以完成的任务。目前,生物集体的形成主要分为两大类。第一类生物个体之间没有直接接触,如蜜蜂、鱼和鸟类,这导致这些集体不稳定,容易受到…

Linux网络编程 -- 网络基础

本文主要介绍网络的一些基础概念,不涉及具体的操作原理,旨在构建对网络的基础认识。 1、网络的早期发展历程 20世纪50年代 在这一时期,计算机主机非常昂贵,而通信线路和设备相对便宜。为了共享计算机主机资源和进行信息的综合处…

基于图像的3D动物重建与生成

一、背景与目标 3D-Fauna 是一款用于基于图像和视频进行四足动物3D重建与生成的开源方案。自然界展示了复杂的相似性与多样性,该方法通过学习来自网上图片的四足动物的3D形态,能够从单张图片生成可动画化的带有纹理的3D网格模型。其最终目标是通过大量扩展现有的解决方案,实…

数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(一).创建基础表

一. 使用工具和命令 1.1 使用的工具 Navicat Premium 17 :“Navicat”是一套可创建多个连接的数据库管理工具。 MySQL版本8.0.39 。 1.2 使用的命令 Navicat中使用的命令 命令命令解释SHOW DATABASES;展示所有的数据库CREATE DATABASE 数据库名称; 创…

基于STM32的数字温度传感器设计与实现

引言 STM32 是由意法半导体(STMicroelectronics)开发的基于 ARM Cortex-M 内核的微控制器系列,以其强大的处理能力、丰富的外设接口和低功耗著称,广泛应用于嵌入式系统设计中。在这篇文章中,我们将介绍如何基于 STM32…

深度学习:基于MindSpore实现ResNet50中药分拣

ResNet基本介绍 ResNet(Residual Network)是一种深度神经网络架构,由微软研究院的Kaiming He等人在2015年提出,并且在ILSVRC 2015竞赛中取得了很好的成绩。ResNet主要解决了随着网络深度增加而出现的退化问题,即当网络…

数据结构与算法——动态规划算法简析

1.初步了解动态规划 由于本篇博客属于动态规划的初阶学习,所以大多都是简单的表示,更深层次的学术用语会在之后深度学习动态规划之后出现,本文主要是带各位了解一下动态规划的大致框架 1.1状态表示 通常的我们会开辟一个dp数组来存储需要表示…

015 品牌关联分类

文章目录 后端CategoryBrandEntity.javaCategoryBrandController.javaCategoryBrandServiceImpl.javaCategoryServiceImpl.javaBrandServiceImpl.java删除 npm install pubsub-jsnpm install --save pubsub-js这个错误是由于在尝试安装 pubsub-js 时,npm 发现了项目…

数据结构(栈和队列的实现)

1. 栈(Stack) 1.1 栈的概念与结构 栈是一种特殊的线性表,其只允许固定的一段插入和删除操作;进行数据插入和删除的一段叫做栈顶,另一端叫栈底;栈中的元素符合后进先出LIFO(Last In First Out&…

C++——模拟实现vector

1.查看vector的源代码 2.模拟实现迭代器 #pragma oncenamespace jxy {//模板尽量不要分离编译template <class T>class vector{public:typedef T* iterator;//typedef会受到访问限定符的限制typedef const T* const_iterator;//const迭代器是指向的对象不能修改&#xf…

透明物体的投射和接收阴影

1、让透明度测试Shader投射阴影 &#xff08;1&#xff09;同样我们使用FallBack的形式投射阴影&#xff0c;但是需要注意的是&#xff0c;FallBack的内容为&#xff1a;Transparent / Cutout / VertexLit&#xff0c;该默认Shader中会把裁剪后的物体深度信息写入到 阴影映射纹…

毕业设计_基于springboot+ssm+bootstrap的旅游管理系统【源码+SQL+教程+可运行】【41001】.zip

毕业设计_基于springbootssmbootstrap的旅游管理系统【源码SQL教程可运行】【41001】.zip 下载地址&#xff1a; https://download.csdn.net/download/qq_24428851/89828190 管理系统 url: http://localhost:8080/managerLoginPageuser: admin password: 123 用户门户网站…

【设计模式-解释模式】

定义 解释器模式是一种行为设计模式&#xff0c;用于定义一种语言的文法&#xff0c;并提供一个解释器来处理该语言的句子。它通过为每个语法规则定义一个类&#xff0c;使得可以将复杂的表达式逐步解析和求值。这种模式适用于需要解析和执行语法规则的场景。 UML图 组成角色…

SPDK从安装到运行hello_world示例程序

SPDK从安装到运行示例程序 #mermaid-svg-dwdwvhrJiTcgTkVf {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dwdwvhrJiTcgTkVf .error-icon{fill:#552222;}#mermaid-svg-dwdwvhrJiTcgTkVf .error-text{fill:#552222;s…

android compose ScrollableTabRow indicator 指示器设置宽度

.requiredWidth(30.dp) Box(modifier Modifier.background(Color.LightGray).fillMaxWidth()) {ScrollableTabRow(selectedTabIndex selectedTabIndex, // 默认选中第一个标签containerColor ColorPageBg,edgePadding 1.dp, // 内容与边缘的距离indicator { tabPositions…

【本地缓存】Java 中的 4 种本地缓存

目录 1、手写一个简单的本地缓存1.1、封装缓存实体类1.2、创建缓存工具类1.3、测试 2、Guava Cache2.1、Guava Cache 简介2.2、入门案例2.2.1、引入 POM 依赖2.2.2、创建 LoadingCache 缓存 2.3、Guava Cache 的优劣势和适用场景 3、Caffeine3.1、Caffeine 简介3.2、对比 Guava…

图的基本概念 - 离散数学系列(五)

目录 1. 图的定义 节点与边 2. 度与路径 节点的度 路径与圈 3. 图的连通性 连通图与非连通图 强连通与弱连通 连通分量 4. 实际应用场景 1. 社交网络 2. 城市交通系统 3. 网络结构 5. 例题与练习 例题1&#xff1a;节点的度 例题2&#xff1a;判断连通性 练习题…