尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

PX4-Autopilot 性能剖析实战:使用 Poor Man‘s Sampling Profiler(PMSP)与火焰图定位飞控瓶颈

发布时间:2026/9/24 16:50:22

资讯中心
01
ARTICLE

PX4-Autopilot 性能剖析实战:使用 Poor Man‘s Sampling Profiler(PMSP)与火焰图定位飞控瓶颈

PX4-Autopilot 性能剖析实战:使用 Poor Man‘s Sampling Profiler(PMSP)与火焰图定位飞控瓶颈
嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载本文介绍 PX4-Autopilot 内置的Poor Mans Sampling ProfilerPMSP采样剖析方案它通过周期性地中断固件执行并采样当前调用栈经折叠folding与 FlameGraph 的采样—折叠—绘图三级流水线原理。方法概述ApproachPMSP 的本质是一个shell 脚本它实现了一种经典的低成本采样剖析方法该方法最初由 Mark Callaghan 与 Domas Mituzas 提出即poor mans profiler。其工作流程分为三个阶段采样Sampling脚本周期性地通过 GDB 中断halt目标固件的执行抓取当前时刻的调用栈stack trace并把每次抓到的栈信息追加写入一个文本文件。由于采样是随机打点采样次数越多、采样间隔越均匀统计结果就越接近真实的 CPU 时间分布。折叠Folding采样结束后通常需要一个小时甚至更久脚本把收集到的所有调用栈折叠成另一份文本文件——所有相同的调用栈路径被合并并记录其出现次数。折叠结果等价于每个调用路径被采样命中多少次这正是火焰图绘制的输入数据。可视化Graphing折叠后的栈数据被送入FlameGraphBrendan Gregg 开源的调用栈可视化工具生成交互式 SVG 火焰图。整个三级流水线的入口是仓库中的 poor-mans-profiler.sh它位于platforms/nuttx/Debug/目录下与Nuttx.py、gdbinit.in等调试辅助文件同处一个目录。基本使用Basic Usage前置条件Prerequisites由于剖析依赖 GDB 在嵌入式目标上运行 PX4开始之前需要准备齐以下三样东西待剖析的硬件例如一块 Pixhawk 4 / Pixhawk 6X 等飞控板已编译并烧录的固件先在目标硬件上编译并上传 PX4 固件见 boards 下各板卡目录的构建配置调试探针debug probe用于运行 GDB server 并与板卡交互。官方文档推荐 Zubax BugFace BF1 这类基于 Black Magic ProbeBMP的调试器。更多探针选择与接线说明可参考 SWD 调试文档。确定调试器设备号Determine the Debugger Device当使用Zubax BugFace BF1Black Magic Probe时poor-mans-profiler.sh 会自动检测并使用正确的 USB 设备。从脚本源码第 59 行可以看到其默认逻辑gdbdevls /dev/serial/by-id/*Black_Magic_Probe*-if00即脚本自动枚举/dev/serial/by-id/下匹配*Black_Magic_Probe*-if00的设备。如果使用其他类型的探针则需要通过--gdbdev参数显式指定调试器所在的设备节点。在 Ubuntu 上可用如下命令枚举可能的设备ls -alh /dev/serial/by-id/下面示例展示了同时连接 Pixhawk 4 与 Zubax BugFace BF1 时的枚举结果userubuntu:~/PX4-Autopilot$ ls -alh /dev/serial/by-id/ total 0 drwxr-xr-x 2 root root 100 Apr 23 18:57 . drwxr-xr-x 4 root root 80 Apr 23 18:48 .. lrwxrwxrwx 1 root root 13 Apr 23 18:48 usb-3D_Robotics_PX4_FMU_v5.x_0-if00 - ../../ttyACM0 lrwxrwxrwx 1 root root 13 Apr 23 18:57 usb-Black_Sphere_Technologies_Black_Magic_Probe_BFCCB401-if00 - ../../ttyACM1 lrwxrwxrwx 1 root root 13 Apr 23 18:57 usb-Black_Sphere_Technologies_Black_Magic_Probe_BFCCB401-if02 - ../../ttyACM2在此例中脚本会自动选中名为*Black_Magic_Probe*-if00的设备即ttyACM1。若你使用的是其他调试器可从上面的列表中找出对应的 id并通过--gdbdev传入./poor-mans-profiler.sh --elfbuild/px4_fmu-v4_default/px4_fmu-v4_default.elf --nsamples30000 --gdbdev/dev/ttyACM2一键运行RunningPMSP 最便捷的入口是 PX4 的构建系统。下面这条命令会构建px4_fmu-v4pro目标并执行 10000 次采样脚本会自动获取FlameGraph并加入PATH如需自定义采样次数等更细粒度控制见下文实现原理Implementation一节make px4_fmu-v4pro_default profile脚本源码头部注释也给出了完整的使用路径以 Pixhawk 4 / fmu-v5 为例# 0) 准备 flamegraph.pl见下文 PATH 要求 # 1) 连接设备例如 Pixhawk 4 # 2) 构建 PX4: make px4_fmu-v5_default # 3) 烧录 PX4: make px4_fmu-v5_default upload # 4) 连接 JTAG/SWD 调试器例如 DroneCode Probe # 5) 执行剖析: make px4_fmu-v5_default profile理解输出结果Understanding the Output采样与折叠完成后PMSP 调用flamegraph.pl生成火焰图FlameGraph。下图是官方文档给出的输出示例注意静态图片不具备交互性实际产物为可交互的 SVG火焰图的阅读规则如下水平方向每一层由多个矩形条组成矩形的宽度与该函数被采样命中的次数成正比。命中次数越多说明该函数在采样周期内的执行时间时长 × 频率占比越高是潜在的 CPU 热点。垂直方向自下而上为调用栈的层次——底部是根函数如任务入口、px4_main、工作队列调度顶部是叶子函数被层层调用的具体实现。栈越深代表调用链越长。颜色通常用于区分不同函数或不同栈帧颜色本身不携带数值语义默认配色下红色系表示高频热区、黄色系为相对低频的深层调用可结合具体图例判断。因此最宽、最长的平顶区域就是你需要重点审视的热点函数——它往往对应某个繁忙的任务循环或高开销的系统调用。已知问题与注意事项Possible IssuesPMSP 定位为ad-hoc临时应急方案脚本本身存在一些已知缺陷使用时应特别留意GDB 故障可能不被察觉如果 GDB 工作异常脚本可能无法检测到并继续空跑结果自然是毫无可用的栈数据。为避免浪费数小时应周期性检查/tmp/pmpn-gdberr.log——该文件保存了最近一次 GDB 调用的 stderr 输出。脚本源码第 103 行将 GDB 的错误输出重定向到该文件。未来版本应改为以安静模式调用 GDB 并通过退出码判断成败。GDB 偶发永久挂起采样栈时 GDB 可能卡死导致目标被无限期 halt。解决办法是手动中止脚本再带--append选项重新启动追加而非覆盖旧数据。未来版本应给每次 GDB 调用强制加上超时。不支持多线程环境脚本一次采样只记录单条栈。这对单核嵌入式目标没有影响始终只有一个执行线程但限制了它在多线程应用中的适用性。未来版本应让栈折叠器支持每次采样包含多条栈。实现原理Implementation脚本本体位于 platforms/nuttx/Debug/poor-mans-profiler.sh其执行流程与全部可调参数都直接体现在源码中。执行流水线启动自检脚本首先检查flamegraph.pl是否位于PATH中第 43 行否则直接报错退出——FlameGraph 脚本必须存在于PATH否则 PMSP 拒绝启动。采样按指定的采样次数与时间间隔执行采样原始栈数据写入系统临时目录的文本文件。脚本默认的临时文件路径第 100103 行为/tmp/pmpn-stacks.log原始采样栈/tmp/pmpn-folded.txt折叠后的栈/tmp/pmpn-flamegraph.svg最终火焰图 SVG/tmp/pmpn-gdberr.logGDB 的 stderr 输出。折叠采样结束后自动调用栈折叠器输出写入临时目录中相邻的折叠文件。折叠器是脚本内嵌生成的 Python 程序/tmp/pmpn-folder.py第 157 行起它专门处理 C 类型——包括operator、operator、operator、operator-等运算符重载符号以及括号/尖括号/引号内的函数签名解析避免 C 模板与运算符导致栈解析错乱。折叠器还会向 stderr 输出统计信息总栈帧数Total stack frames以及栈顶分布 Top 300 消费函数占比Top consumers可直接在终端看到热点排行。绘图折叠成功后调用flamegraph.pl --fontsize$fgfontsize --width$fgwidth生成交互式 SVG并自动用浏览器打开。注意并非所有图片查看器都支持交互式 SVG建议用 Web 浏览器打开生成的 SVG脚本会优先尝试 firefox、google-chrome其次才是 xdg-open。参数详解脚本通过--keyvalue形式解析参数第 6193 行完整参数如下表参数默认值作用--nsamplesn0跳过采样采样次数。0表示仅基于已有栈文件重新生成折叠与火焰图不访问目标--sleeptimesec0.1两次采样之间的间隔秒数决定总剖析时长--tasknamename空全局采样指定 NuttX 任务名仅采样该任务依赖带 Python 支持的 GDB 与Nuttx.py--elffile无必填指向当前运行 ELF 的路径相对仓库根目录用于把内存地址映射为符号--append关追加到旧栈文件而非覆盖--gdbdevdev自动探测 BMPGDB 连接的目标设备节点--fgfontsizepx10火焰图字体大小--fgwidthpx1900火焰图宽度采样背后的 GDB 调用PMSP 使用arm-none-eabi-gdb采集栈当前仅支持该工具链未来可能扩展。每次采样执行一次批处理式 GDB 调用第 120128 行arm-none-eabi-gdb $elf --nx --quiet --batch \ -ex set print asm-demangle on \ -ex target extended $gdbdev \ -ex monitor swdp_scan \ -ex attach 1 \ -ex bt \ 2 $gdberrfile \ | sed -n s/\(#.*\)/\1/p \ $stacksfile关键点解读--batch保证每次调用非交互、可脚本化--nx跳过用户.gdbinit以免干扰target extended $gdbdevmonitor swdp_scanattach 1完成对目标板的 SWD 连接与挂接btbacktrace抓取当前调用栈输出经sed过滤出#...帧行后追加到栈文件若指定--taskname则改用source $root/Nuttx.py加载 Nuttx.py并通过show mybt $taskname获取指定任务的调用栈此时要求 GDB 带有 Python 支持。由于每次采样都要走完整的 GDB attach/backtrace 流程频繁调用 GDB 会明显干扰目标实时任务的正常运行——因此 PMSP 不适合对强实时性任务做精准剖析脚本注释还建议保证 PC 不超载、调试器所连 USB 主机控制器不拥塞并允许当前用户设置负 nice 值以获得更均匀的采样节奏。ELF 与追加模式为了让 GDB 能把内存地址映射为符号名必须通过--elffile传入当前运行在目标上的可执行文件路径相对仓库根目录。典型用法./poor-mans-profiler.sh --elfbuild/px4_fmu-v4_default/px4_fmu-v4_default.elf --nsamples30000注意每次启动脚本都会覆盖旧栈数据。若希望保留旧栈并继续追加采样使用--append./poor-mans-profiler.sh --elfbuild/px4_fmu-v4_default/px4_fmu-v4_default.elf --nsamples30000 --append不难推断--append配合--nsamples0时脚本会跳过采样环节只基于已有的/tmp/pmpn-stacks.log重新执行折叠与绘图——适合调整--fgwidth、--fgfontsize反复打磨火焰图而无需再次连线采样。小结PMSP 为 PX4 飞控固件提供了一条零侵入、低成本的性能剖析路径只需一块目标板、一个 SWD 调试探针和一份已烧录的固件即可通过make target profile或直接调用 poor-mans-profiler.sh 获得调用栈级别的热点分布。其采样 → 折叠 → 火焰图的流水线虽朴素却与 FlameGraph 生态无缝衔接特别适合在真实硬件上快速定位任务循环、工作队列与驱动路径中的 CPU 瓶颈使用时请务必留意其对实时任务的干扰、GDB 偶发故障与多线程不兼容等已知限制并善用/tmp/pmpn-gdberr.log与--append模式保证采样数据的可靠性。赞分享嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载相关推荐别再手动写摘要了3步完成T5微调长文本摘要自动生成实战别再手动写摘要了3步完成T5微调长文本摘要自动生成实战 长文本手动摘要是苦差事。基于 Transformers Tutorials 项目我们用 T5 模型示例工程Avail Light Client轻节点性能剖析使用火焰图定位瓶颈Avail Light Client轻节点性能剖析使用火焰图定位瓶颈 你是否遇到过Avail Light Client轻节点同步缓慢、CPU占用过高的问题3分钟定位Node.js性能瓶颈从CPU剖析到火焰图实战3分钟定位Node.js性能瓶颈从CPU剖析到火焰图实战 你是否曾遇到Node.js应用突然变慢却找不到原因日志里没有错误内存使用正常但响应时间却越来越文档教程后端上一篇如何免费解锁Grammarly Premium高级版功能Cookie自动搜索工具详解下一篇免费解锁Grammarly Premium高级版三步实现专业写作助手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。