- Debugging/Logging - 飞行日志分析
- Debugging/Logging - ULog文件格式
- 教程
- 教程 - 地面站
- 教程 - 编写应用程序
- 教程 - QGC的视频流
- 教程 - 远距离视频流
- 教程 - u-blox M8P RTK
- 新手上路
- 新手上路 - 初始设置
- 新手上路 - 安装工具链
- 安装工具链 - Mac OS
- 安装工具链 - Linux
- Linux - Advanced Linux
- 安装工具链 - Windows
- 新手上路 - Fast RTPS installation
- 新手上路 - 代码编译
- 新手上路 - 高级配置
- 新手上路 - 贡献& 开发者电话会议
- 贡献& 开发者电话会议 - GIT例程
- 贡献& 开发者电话会议 - Documentation
- 新手上路 - Licenses
- 概念解读
- 概念解读 - 飞行模式
- 概念解读 - 结构概述
- 概念解读 - 飞行控制栈
- 概念解读 - 中间件
- 概念解读 - 混控和执行器
- 概念解读 - PWM限制状态机
- Hardware
- Hardware - 自驾仪硬件
- 机型 - 统一的基础代码
- 机型 - 参考机型
- 机型 - 添加一个新的机型
- Data Links - SiK Radio
- Data Links - Wifi数传
- Data Links - 数传
- I2C总线 - SF1XX lidar
- 传感器和执行机构总线 - UAVCAN总线
- UAVCAN总线 - UAVCAN Bootloader
- UAVCAN总线 - UAVCAN固件升级
- UAVCAN总线 - UAVCAN配置
- UAVCAN总线 - UAVCAN 的各种笔记
- 传感器和执行机构总线 - UART
- UART - uLanding Radar
- 传感器和执行机构总线 - 设置云台控制
- 传感器和执行机构总线 - 相机触发器
- Hardware - 协同电脑
- 仿真
- 仿真 - 基本仿真
- 仿真 - Gazebo仿真
- 仿真 - HITL仿真
- 仿真 - 连接到ROS
- 仿真 - AirSim仿真
- 仿真 - 多机仿真
- 中间件及架构
- 中间件及架构 - uORB消息机制
- 中间件及架构 - MAVLink消息机制
- 中间件及架构 - 守护程序
- 中间件及架构 - 驱动框架
- 模块 & 命令
- 模块 & 命令 - 命令
- 模块 & 命令 - 通信
- 模块 & 命令 - 驱动
- 模块 & 命令 - 系统
- Robotics
- Robotics - 用Linux进行外部控制
- Robotics - ROS
- ROS - 在RPi上安装ROS
- ROS - MAVROS (ROS上的MAVLink)
- ROS - MAVROS外部控制例程
- ROS - 外部位置估计
- ROS - Gazebo Octomap
- Robotics - DroneKit
- Debugging/Logging
- Debugging/Logging - FAQ
- Debugging/Logging - 系统控制台
- Debugging/Logging - 自驾仪调试
- Debugging/Logging - Sensor/Topic Debugging
- Debugging/Logging - 仿真调试
- Debugging/Logging - System-wide Replay
- Debugging/Logging - 发送调试的值
- Debugging/Logging - Profiling
- Debugging/Logging - 日志记录
- 教程 - 光流
- 教程 - ecl EKF
- 教程 - 飞行前检查
- 教程 - 着陆检测
- 教程 - Linux系统下使用S.Bus驱动
- Advanced Topics
- Advanced Topics - 系统启动
- Advanced Topics - 参数&配置
- Advanced Topics - 参考参数
- Advanced Topics - 安装Intel RealSense R200的驱动
- Advanced Topics - 切换状态估计器
- Advanced Topics - 外部模块
- Advanced Topics - STM32 Bootloader
- 测试和持续集成
- 测试和持续集成 - 持续集成
- 测试和持续集成 - Jenkins持续集成环境
- 测试和持续集成 - 综合测试
- 测试和持续集成 - Docker容器
- 测试和持续集成 - 维护
Debugging/Logging - Profiling
translated_page: https://github.com/PX4/Devguide/blob/master/en/debug/profiling.md
translated_sha: 95b39d747851dd01c1fe5d36b24e59ec865e323e
Poor Man’s Sampling Profiler
官网英文原文地址:https://dev.px4.io/advanced-profiling.html
本节介绍如何通过分析来评估PX4系统的性能。
本节的想法源于Mark Callaghan和Domas Mituzas.
方法
PMSP是一个shell脚本,它会定期中断固件的运行,并对当前堆栈踪迹进行采样。采样的堆栈踪迹会被追加到一个文本文件中。一旦采样结束(通常要花一个小时,或者更长时间),收集的堆栈踪迹会被 folded。folding的结果是另一个含有相同堆栈踪迹的文本文件,相同的堆栈踪迹(比如那些在程序中相同点获得的)会合并到一起,并记录发生的次数。然后这个折叠的堆栈信息会被送入可视化脚本,这个脚本我们使用FlameGraph - an open source stack trace visualizer.
执行
脚本的位置在 Debug/poor-mans-profiler.sh
。一旦开始运行,脚本会以指定的时间间隔运行指定数量的采样。收集的采样信息会存储在位于系统的临时文件夹(例如 /tmp
)下的文本文件中。一旦采样结束,脚本会自动调用这个堆栈文件夹,输出信息会存储在临时文件夹下的相邻文件中。如果堆栈folded
成功,脚本会调用 FlameGraph(火焰图) 脚本,并把结果保存在交互式的SVG文件中。请注意并不是所有的图片浏览器都支持交互式图片;推荐在网页浏览器中打开SVG结果。
FlameGraph脚本必须在 PATH
中,否则 PMSP 拒绝执行。
PMSP使用GDB收集堆栈踪迹。目前使用的是 arm-none-eabi-gdb
,未来可能会加入其他工具链。
为了能够将内存位置映射到符号上,脚本需要被引用到当前在目标上运行的可执行文件上。这通过选项 --elf=<file>
来实现。这个参数是一个指向当前执行的 ELF 的路径(相对于代码库的根路径)。
用法示例:
./poor-mans-profiler.sh --elf=build/px4fmu-v4_default/src/firmware/nuttx/firmware_nuttx --nsamples=30000
注意每次运行脚本都会覆盖旧的堆栈。如果你想向旧的堆栈追加而不是重写,使用选项 --append
:
./poor-mans-profiler.sh --elf=build/px4fmu-v4_default/src/firmware/nuttx/firmware_nuttx --nsamples=30000 --append
正如人们怀疑的那样, --append
加上 --nsamples=0
会指示脚本在不访问目标的情况下重新生成SVG。
请阅读脚本深入理解脚本是如何工作的。
理解输出
下面是一个样例输出的截屏(并不是交互性的)
在火焰图上,水平方向表示堆栈帧,每个帧的宽度正比于它被采样的次数。反过来,函数最终被采样的次数正比于执行的持续时间频率。
可能的问题
该脚本是作为一种特殊解决方案开发的,所以仍然存在一些问题。使用它时请注意:
- 如果GDB发生故障,脚本可能无法检测到并继续运行。这种情况下显然不能产生可用的堆栈信息。为了避免这种情况,用户需要时不时地查看
/tmp/pmpn-gdberr.log
文件,在里面包含着最近一次对GDB调用的stderr输出。在将来脚本会改为以安静模式调用,会通过exit code来指示问题。
有时GDB会在采样堆栈踪迹的时候卡死。这时候目标会一直暂停。解决办法是手动退出脚本,再用
--append
选项重新运行脚本。将来,脚本会给每个GDB调用强制设置一个timeout。不支持多线程环境。这不影响单核嵌入式目标,因为他们总是以单线程执行,但这种限制会使得分析器不能兼容许多其他的应用。在将来,会修改堆栈文件夹(stack folder译注:翻译存疑,stack folder可能指的是 相同堆栈踪迹的合并操作)以使每次采样支持多堆栈踪迹。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论