专栏算法工具链性能分析

性能分析

zhouhui2024-04-10
180
0

背景

实际下游车会同时开着client录制数据包跑功能,集成测试尽量模拟下游测试场景,目的是为了从性能和功能的角度测试版本包,需要收集j5日志、pack信息、性能脚本的性能数据、操作的时间点。

典型工作流程:编译镜像、打包,部署镜像,执行测试,拷贝测试结果、分析日志

流程框架

1、稳定性监控 2、perf 工具 3、pack录制 4、runtime提取 5、日志分析
Description

模块功能

1、稳定性监控:

用于监控稳定性信息,包括mem、cpu、bpu、ddr、net等

数据类型

数据源

保存文件

内存使用量

top -b -n 1 -m

meminfo.txt

CPU使用率

top -b -d 2

top.txt

BPU占用率

cat /sys/devices/system/bpu/bpu0/ratio

bpu_usage.txt

DDR带宽

hrut_ddr -t all -p 100000

ddr_monitor.txt

网络带宽

iftop

iftop.log

IRQ数量

cat /proc/interrupts

irq.txt

IO状态

iostat -mp 2

iostat.txt

2、perf 工具: 使用perf_tool 实现板端进程perf自动测试和日志拷贝功能

a)火焰图分析:

火焰图各轴含义如下,注意x轴不代表时间且按字符排序,函数的cpu消耗。可以通过平均CPU*函数采样点占比的方式近似描述。

img

y轴:调用栈,调用栈越深,火焰越高,顶部就是采样时刻正在执行的函数

x轴:采样数,函数在x轴占据的宽度约宽,表示它被采样到的次数越多,即消耗的资源越多

b)常用分析流程

检查线程采样点占比,火焰图最底层即为特定线程名的资源占比,perf.sh 会自动统计线程的采样点占比并绘图,注意同名线程的消耗会统计到一起

img

检查火焰图平顶,存在平顶函数可能是由于

函数执行CPU消耗较高,如RLECompress函数,存在大量计算操作

函数执行次数较多,如线程数量较多时,线程频繁切换导致schedule()消耗较高

检查常见低效函数,包括malloc、memcpy、cache_invalid等,常见于vector、insert、protobuf、serialize 、hbmem

img

检查火焰图高度,很高很窄的火焰图通常表征存在递归调用

c)在线调试:

将perf工具拷贝到板端,手动执行perf指令进行在线分析

常用指令包括:

监控全局CPU函数热点:./perf top -a -F 1000

监控全局CPU热点函数,并打印所有调用栈: ./perf top -a -F 1000 -g

img

监控进程CPU函数热点:./perf top -a -F 1000 -p PID

监控进程branch-miss:./perf top -aK -e branch-misses -F 1000 -p PID

img

监控进程cache-miss:./perf top -aK -e cache-misses -F 1000 -p PID

img

3、pack录制:

使用matrix client录制pack

4、runtime 提取:

基于bole msg-center 和pack-sdk工具,分析pack中的msg信息,并提取为txt格式

5、日志分析:

感知日志分析:

用于分析各感知进程日志,通过日志打印信息,提取CPU占用、fps、delay等信息。

为了避免两次测试的日志混到一起无法正常区分,需要记录,start 和 end 监控的时间戳,以便筛选监控时间内的日志,在解析的时候,只会解析这个时间段内的日志,让结果更准确

Runtime 消息分析:

用于分析pack中解析到的runtime信息,由于runtime信息较多,因此需要支持多种不同的分析参数

​ -p 指定日志类型、日志目录

​ -f 指定frame id 范围 用于选中特定frame来详细分析数据流

​ -m 指定module名,用于选择感兴趣的模块

​ -w 指定forword号,用于选择感兴趣的forward号

​ -u 指定相对时间,用于选择测试开始后的某个时间段的runtime信息,如启动后10s~20s

​ -t 指定时间戳,用于选择绝对时间戳范围,UTC时间戳

​ -e 指定额外的事件范围,用于统计一帧内两个事件之间的时间间隔

稳定性日志分析:

日志结果分析成果物主要为各类统计结果的png图

​ cpu:统计业务进程和其他平均cpu占用大于0.5%的进程

​ bpu:统计bpu0、bpu1两个核心的数据

​ ddr:统计各端口和总的ddr带宽占用数据

​ mem:统计个进程占用的内存总量

算法工具链
社区征文技术深度解析征程5杂谈
评论0
0/1000