背景
实际下游车会同时开着client录制数据包跑功能,集成测试尽量模拟下游测试场景,目的是为了从性能和功能的角度测试版本包,需要收集j5日志、pack信息、性能脚本的性能数据、操作的时间点。
典型工作流程:编译镜像、打包,部署镜像,执行测试,拷贝测试结果、分析日志
流程框架

模块功能
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*函数采样点占比的方式近似描述。
y轴:调用栈,调用栈越深,火焰越高,顶部就是采样时刻正在执行的函数
x轴:采样数,函数在x轴占据的宽度约宽,表示它被采样到的次数越多,即消耗的资源越多
b)常用分析流程
检查线程采样点占比,火焰图最底层即为特定线程名的资源占比,perf.sh 会自动统计线程的采样点占比并绘图,注意同名线程的消耗会统计到一起
检查火焰图平顶,存在平顶函数可能是由于
函数执行CPU消耗较高,如RLECompress函数,存在大量计算操作
函数执行次数较多,如线程数量较多时,线程频繁切换导致schedule()消耗较高
检查常见低效函数,包括malloc、memcpy、cache_invalid等,常见于vector、insert、protobuf、serialize 、hbmem
检查火焰图高度,很高很窄的火焰图通常表征存在递归调用
c)在线调试:
将perf工具拷贝到板端,手动执行perf指令进行在线分析
常用指令包括:
监控全局CPU函数热点:./perf top -a -F 1000
监控全局CPU热点函数,并打印所有调用栈: ./perf top -a -F 1000 -g
监控进程CPU函数热点:./perf top -a -F 1000 -p PID
监控进程branch-miss:./perf top -aK -e branch-misses -F 1000 -p PID
监控进程cache-miss:./perf top -aK -e cache-misses -F 1000 -p PID
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:统计个进程占用的内存总量

