4、诊断工具准备:ros2 topic hz、ros2 topic delay、ros2 bag record/play,以及系统级工具perf、htop

做延迟定位,最怕什么?

最怕你连问题在哪都不知道,就开始改代码。

我见过太多团队,一上来就怀疑算法太慢、模型太大,结果折腾半天,发现是某个节点的发布频率根本没对上。所以这一章,咱们先把家伙事儿备齐。说白了,就是给你一套「听诊器」和「手术刀」。

4.1 为什么先准备工具?

你想想看,Autoware 里几十个节点在跑,消息像流水一样在管道里穿梭。哪个节点慢了?哪个话题堵了?光靠肉眼盯屏幕,盯到下班也看不出名堂。

我个人习惯是:先测量,后优化。没有数据支撑的优化,都是瞎猜。

ROS2 自带的几个命令行工具,就是最直接的测量手段。再加上系统级的 perf 和 htop,基本能覆盖 90% 的延迟问题场景。

核心思路:用 ROS2 工具定位「哪个话题/节点有问题」,用系统工具定位「为什么有问题」。

4.2 ros2 topic hz —— 看频率稳不稳

这个命令,我几乎每天都会敲几遍。它的作用很简单:统计一个话题的发布频率。

# 查看 /planning/trajectory 话题的发布频率
ros2 topic hz /planning/trajectory

# 输出示例:
# average rate: 10.002
#   min: 0.098s max: 0.102s std dev: 0.00123s

嗯,这里要注意:平均频率 10Hz 不代表没问题。你得看标准差和最大间隔。

我在项目中遇到过一件事:某个规划节点平均频率 10Hz,但最大间隔到了 500ms。这意味着每过几秒,就会有一次明显的卡顿。对下游的控制节点来说,这就是灾难。

我的经验:如果 std dev 超过平均间隔的 10%,就要警惕了。比如 10Hz 的话题,平均间隔 100ms,标准差超过 10ms 就说明频率不稳定。

4.3 ros2 topic delay —— 看延迟大不大

hz 看的是「发布频率」,delay 看的是「端到端延迟」。这两个概念别搞混了。

delay 命令需要你指定一个「源话题」和一个「目标话题」。它会计算同一个时间戳的消息,从源话题到目标话题花了多久。

# 查看 /sensing/lidar/pointcloud 到 /perception/object_recognition/objects 的延迟
ros2 topic delay /sensing/lidar/pointcloud /perception/object_recognition/objects

# 输出示例:
# average delay: 0.045s
#   min: 0.032s max: 0.089s

说白了,这就是在测量「感知管线」的延迟。如果延迟超过 100ms,那车辆看到障碍物时,实际位置已经变了。这在高速场景下非常危险。

避坑指南:我曾经发现 delay 结果异常大,排查了半天,结果是两个节点的时间戳没有同步。一个用系统时间,一个用传感器时间。所以用 delay 之前,先确认时间戳来源一致。

4.4 ros2 bag record/play —— 回放现场

有些延迟问题是偶发的,跑在路上才出现。这时候就需要 ros2 bag 了。

它的作用就像行车记录仪:把现场数据录下来,回办公室慢慢分析。

# 录制所有话题
ros2 bag record -a -o my_bag

# 回放,并指定倍速
ros2 bag play my_bag --rate 0.5

# 只回放特定话题
ros2 bag play my_bag --topics /planning/trajectory /control/command

我个人习惯是:录全量数据,回放时按需过滤。因为你不确定问题出在哪个环节,录少了回头还得补跑一趟。

小技巧:回放时用 --rate 0.5 放慢一倍,配合 hz 和 delay 命令,能更清楚地看到每个节点的响应时间。

4.5 系统级工具:perf 和 htop

ROS2 工具能告诉你「哪个话题慢了」,但说不清「为什么慢」。这时候就要看系统层面了。

4.5.1 htop —— 看资源吃紧

htop 是 top 的增强版。它能直观显示 CPU 占用、内存使用、每个核的负载。

# 安装
sudo apt install htop

# 运行
htop

在 Autoware 场景下,我一般关注三点:

  • CPU 总占用:超过 80% 就要警惕,说明系统快饱和了
  • 单个核的负载:如果某个核 100%,其他核空闲,说明有线程绑定问题
  • 内存占用:持续增长可能是内存泄漏

有一次我排查延迟问题,发现感知节点 CPU 占用只有 30%,但延迟很大。用 htop 一看,好家伙,它在跟另一个进程抢同一个核。加了 taskset 绑定核心后,延迟直接降了一半。

4.5.2 perf —— 看代码在干嘛

perf 是 Linux 自带的性能分析工具。它能告诉你 CPU 时间花在了哪个函数上。

# 采样 10 秒
sudo perf record -g -p <PID> -- sleep 10

# 生成报告
sudo perf report

这个工具稍微有点门槛,但非常强大。我一般用它来验证自己的猜测:

  • 如果怀疑是锁竞争,看 futex 相关调用
  • 如果怀疑是内存拷贝,看 memcpy 占比
  • 如果怀疑是序列化开销,看 serialize 相关函数

注意:perf 需要 root 权限。另外,采样时间不要太短,至少 10 秒以上,否则数据不具代表性。

4.6 工具使用流程图

下面这张图,是我自己总结的排查流程。每次遇到延迟问题,我就按这个顺序来:

延迟排查工具使用流程 发现延迟问题 ros2 topic hz → 检查频率稳定性 ros2 topic delay → 检查端到端延迟 htop → 检查CPU/内存 perf → 分析函数耗时 定位瓶颈 → 针对性优化

4.7 工具对比总结

最后,我把这几个工具的核心用途整理成一张表,方便你快速查阅:

工具 用途 输出指标 典型场景
ros2 topic hz 检查发布频率 平均频率、最小/最大间隔、标准差 发现节点丢帧、频率抖动
ros2 topic delay 检查端到端延迟 平均延迟、最小/最大延迟 感知管线延迟、控制指令滞后
ros2 bag 录制/回放数据 数据完整性、时间戳一致性 复现偶发问题、离线分析
htop 系统资源监控 CPU占用、内存使用、核负载 资源争抢、内存泄漏
perf 函数级性能分析 热点函数、调用栈、锁竞争 代码级瓶颈定位

我的建议:别想着一次把所有工具都用上。先跑 hz 和 delay,确认问题范围。再用 htop 看资源,最后用 perf 深挖。一步一步来,效率最高。

好了,工具备齐了。下一章咱们就真刀真枪地干——用这些工具去抓一个真实的延迟问题。

可可精品资料库