dwceqos网络驱动性能优化

server/2024/10/19 0:18:23/

文章介绍

本文会分享一些在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采样一次)

中断表现


http://www.ppmy.cn/server/128624.html

相关文章

基于SpringBoot民宿预订系统小程序【附源码】

效果如下: 管理员登录界面 管理员功能界面 用户管理界面 房东管理界面 小程序首页界面 民宿房间界面 功能界面 研究背景 随着旅游业的蓬勃发展和人们对旅行体验的不断追求,民宿作为一种独特的住宿方式,因其个性化、温馨及富含地方特色的服务…

2024电脑视频剪辑软件全解析与推荐

视频在现在社会已经逐渐成为了人们记录生活、表达创意和传递信息的重要方式。很多时候为了剪辑方便,电脑成为了视频剪辑的主战场。今天我们一起来探讨下电脑视频剪辑软件的功能和效果吧。 1.FOXIT视频剪辑 连接直达>>https://www.pdf365.cn/foxit-clip/ 不…

R语言绘制直方图

直方图是一种统计图表。它将数据分成若干区间,统计每个区间内数据的数量或频率,用矩形条高度表示。能直观展现数据分布特征,如集中趋势、离散程度等。在数据分析、质量控制、市场调研等领域广泛应用,可帮助人们快速了解数据整体形…

Spring开发最佳实践之跨域处理

1. 跨域处理 1.1 异常现象 1.2 异常原因分析 跨源资源共享的官方定义如下: 跨源资源共享(CORS,Cross Origin Resource Sharing。或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自…

Flutter String 按 ,。分割

在 Flutter 中,如果你想将一个字符串按特定的字符(例如中文逗号 , 和英文句号 .)进行分割,可以使用 Dart 语言的字符串处理功能。具体来说,你可以使用 split 方法,并传入一个正则表达式来匹配这…

车辆重识别(2021NIPS在图像合成方面,扩散模型打败了gans网络)论文阅读2024/10/01

本文在架构方面的创新: ①增加注意头数量: 使用32⇥32、16⇥16和8⇥8分辨率的注意力,而不是只使用16⇥16 ②使用BigGAN残差块 使用Big GAN残差块对激活进行上采样和下采样 ③自适应组归一化层 将经过组归一化操作后的时间步和类嵌入到每…

解决 遇到JWT中claims中获取不到数据的问题

1.先介绍一下JWT的常规流程 用户进行登录将token储存到redis,然后进行其他需要验证的操作时进行验证,比如使用拦截器进行验证,那么id存储的到claims,因为可以在拦截器验证时将其存放到ThreadLocal中,这样通过ThreadLo…

22.第二阶段x86游戏实战2-背包遍历REP指令详解

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…