十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

第103篇 性能分析工具——perf/flamegraph定位机器人性能瓶颈

第103篇 性能分析工具——perf/flamegraph定位机器人性能瓶颈 面试的时候被问过你的机器人程序CPU占用80%怎么找出是哪段代码在吃性能我当时说了句看哪个函数跑得多优化它。面试官追问具体用什么工具我哑了。在机器人开发中性能问题太常见了。点云处理太慢导致帧率跟不上、路径规划算法跑太久导致控制延迟、DDS通信开销太大导致CPU居高不下。这些问题靠猜是不行的你得用数据说话。今天介绍两个最实用的性能分析工具perf和flamegraph。perfLinux自带的性能分析利器perf是Linux内核自带的性能分析工具不需要额外安装大部分发行版自带。它能告诉你程序的时间都花在哪了。最基本的用法perf stat ./robot_node # 统计整体性能指标 perf record -g ./robot_node # 采样并记录调用栈 perf report # 查看分析结果perf stat会给你一组宏观数据任务运行时间、CPU时钟周期、缓存命中率等。这些数据单独看不太有用但可以用来做前后对比。优化前跑一次优化后跑一次看看指标有没有改善。perf record是核心命令。它会对程序进行采样每隔一段时间记录一次当前在执行哪个函数。运行一段时间后比如30秒生成一个perf.data文件。perf report打开分析报告你会看到一个函数列表按占用时间排序。比如Overhead Command Shared Object Symbol 35.2% robot_node robot_node [.] processPointCloud 18.7% robot_node robot_node [.] updateTransform 12.3% robot_node libc.so [.] memcpy 8.1% robot_node robot_node [.] interpolatePath一眼就能看出来processPointCloud占了35%的CPU时间是优化的首要目标。火焰图一眼看穿性能瓶颈perf report的文本输出虽然详细但不直观。火焰图FlameGraph把它可视化了。火焰图是Brendan Gregg发明的一种可视化方式。横轴是函数调用栈的宽度代表占用CPU的比例纵轴是调用深度。越宽的火焰说明占CPU越多就是你该优化的地方。生成火焰图的步骤# 1. 用perf采样 perf record -g -F 99 ./robot_node sleep 30 # 2. 导出为perf脚本格式 perf script out.perf # 3. 用FlameGraph工具生成SVG git clone https://github.com/brendangregg/FlameGraph ./FlameGraph/stackcollapse-perf.pl out.perf | ./FlameGraph/flamegraph.pl flamegraph.svg打开flamegraph.svg你会看到一个彩色的倒置树状图。最底层是程序入口往上层层展开是函数调用。最宽的那块就是性能热点。在机器人项目中火焰图特别适合用来分析点云处理的性能。你跑一段点云处理的代码生成火焰图一眼就能看到是体素滤波在吃CPU还是聚类算法还是坐标变换。机器人项目中的性能优化实战分享几个真实的性能优化案例。案例一点云处理帧率太低。一个激光雷达每秒产生100万个点处理一帧要50ms但雷达每10ms就出一帧。用perf一分析发现70%的时间花在遍历点云的for循环里。优化方法是把逐点处理改成批量处理利用CPU的SIMD指令和缓存局部性。优化后处理一帧降到8ms。案例二TF变换查询太慢。一个导航程序频繁查询TF树每次查询都要遍历整棵树。火焰图显示updateTransform占了20%的CPU。排查后发现是查询频率太高了每秒查1000次但其实100次就够了。降低频率后CPU占用直接降了15%。案例三DDS通信开销大。程序CPU占用60%但业务逻辑只占了20%。剩下的40%全在DDS的序列化和反序列化上。原因是发布的数据里有个大数组每次发布都要拷贝一遍。改成共享内存通信后CPU占用降到了25%。其他有用的性能工具除了perf和火焰图还有几个工具值得了解。valgrind的callgrind模式。它不是采样而是精确统计每个函数的调用次数和执行时间。比perf精确但会让程序慢很多通常慢10到50倍。适合分析短时间运行的代码段比如某个算法函数的性能。valgrind --toolcallgrind ./robot_node callgrind_annotate callgrind.out.xxxcallgrind的输出可以用KCachegrind打开这是一个图形化的调用图分析工具能直观地看到每个函数的调用关系和时间占比。htop和top。最基础的实时性能监控。htop比top好用能看每个线程的CPU占用还能按CPU核心分组显示。在机器人上跑程序的时候开一个htop窗口盯着能及时发现哪个线程异常。如果某个核心长期100%说明有计算密集的任务没做好负载均衡。ROS2自带的性能话题。ROS2节点可以发布一些诊断信息比如topic的发布频率、消息的序列化时间等。用ros2 topic hz /topic_name可以监控某个话题的实际发布频率和预期值对比就能发现性能问题。还有ros2 topic bw /topic_name可以监控带宽占用帮你发现通信层面的瓶颈。tracing工具。对于ROS2这种复杂的分布式系统有时候你需要跨多个节点追踪一条消息的延迟。ROS2支持基于tracetools的追踪配合LTTng使用可以精确地看到每条消息从发布到接收的全链路耗时。这在分析端到端延迟时特别有用。面试中怎么聊性能优化面试官问性能优化经验最忌讳的是泛泛而谈我用过perf分析性能。要讲具体场景和结果。比如我们的点云处理模块帧率只有20fps目标50fps。我用perf采样后发现70%的时间花在点云遍历上原因是逐点处理导致缓存命中率很低。我改成按块处理每次处理64个点的一小块利用CPU缓存的局部性。优化后帧率提到了55fps达标了。这种回答好在有量化数据、有分析过程、有优化手段、有最终结果。面试官一听就知道你真正做过性能优化。内存性能分析除了CPU性能内存访问模式也是机器人代码的关键瓶颈。perf支持缓存命中率分析perf stat -e cache-misses,cache-references ./my_node可以告诉你缓存未命中的比例。如果cache-miss rate超过10%说明你的数据访问模式对缓存不友好。另一个实用工具是cachegrindValgrind套件的一部分它能精确统计每次内存访问的L1/L2缓存命中情况并标注出具体哪行代码导致了最多的缓存未命中。在优化矩阵运算、点云处理这类数据密集型代码时这些信息非常有价值。性能分析的实战流程实际项目中的性能分析通常遵循这个流程先用top或htop找到CPU占用高的进程然后用perf record采集性能数据最后用perf report或火焰图可视化热点函数。另一个实用工具是valgrind的callgrind它可以统计每个函数的调用次数和耗时。在机器人项目中定位性能瓶颈很重要因为实时性往往是硬指标。补充一点perf stat可以快速查看程序的缓存命中率、分支预测失败率等硬件级指标对深入优化性能很有帮助。给你的建议先学会用perf stat和perf report。不需要会所有参数就这两个命令就能帮你定位大部分性能问题。火焰图一定要会画。它不是必须的但在汇报和讨论的时候一张火焰图比一堆数字有说服力得多。还有优化之前先测量。不要凭直觉猜哪里慢用数据说话。很多时候你以为的瓶颈和实际的瓶颈完全不一样。我见过有人花了一周优化路径规划算法结果perf一看瓶颈在日志输出上——每条日志都要写磁盘。上一篇第102篇 GDB进阶——多线程调试、core dump分析和机器人崩溃排查下一篇预告第104篇 代码质量工具——clang-tidy/cppcheck和机器人代码规范
返回列表