ROS 2 rosbag2 播放出现 “Message queue starved. Messages will be delayed.” 的处理步骤

一. 概述

该告警表示播放器的预取(read-ahead)队列被消费得过快而补不满,导致消息发送延迟。通常由磁盘读速、CPU解压/编解码开销、话题数量/频率过高、QoS阻塞或SQLite读取缓存过小引起。

首选:增大预取队列

直接按提示增大:
ros2 bag play <bag_path> --read-ahead-queue-size 10000

如果发行版支持"按时间"预取:
ros2 bag play <bag_path> --read-ahead-queue-duration 10s

观察是否仍出现 starved 警告;根据频率逐步加大(如 2000050000)。

降低播放压力

降速回放:
ros2 bag play <bag_path> --rate 0.5

只播放关键话题:
ros2 bag play <bag_path> --topics /camera/image /lidar/points

或用正则过滤:
ros2 bag play <bag_path> --regex ".(image|imu)."

提升磁盘与CPU可用性

将包拷到本地SSD再播,避免网络盘/机械盘瓶颈。

关闭其他高IO/高CPU进程;确认没有同时进行重度录制等任务。

如包使用压缩(zstd/lz4),可先解压减少播放时CPU开销:
ros2 bag info <bag_path>
ros2 bag decompress <bag_path>

得到解压后的新包目录后再播放
ros2 bag play <decompressed_bag_path>

增大SQLite读取缓存(storage config

创建 storage_config.yaml:

sqlite3: 复制代码
pragmas: "cache_size=-200000;page_size=4096"

说明:cache_size 负值为 KB(此处约200MB缓存);可按内存情况上调。

播放时指定:
ros2 bag play <bag_path> --storage-config-file storage_config.yaml

避免QoS阻塞(将播放端QoS改成非阻塞)

若订阅端使用可靠(reliable)且处理慢,播放器可能被背压。

创建 qos_override.yaml(示例将所有话题改为更"宽松"的Best Effort):
qos_overrides:

/: # 匹配所有话题
reliability: best_effort
durability: volatile
history: keep_last
depth: 20

播放指定:
ros2 bag play <bag_path> --qos-profile-overrides-path qos_override.yaml

修复索引与检查包体

若包损坏或索引异常,可能导致读取抖动:
ros2 bag reindex <bag_path>

使用 ros2 bag info 查看话题频率与压缩配置,结合实际调参。

其它实用建议

优先传入包目录(包含 metadata.yaml 的目录),而非直接 .db3 文件路径。

逐步调参法:先加大 --read-ahead-queue-size;若仍告警,再降速/限话题;仍不行,再用 storage_config 与解压组合。

监控系统资源:top/htopiostatiotopnvidia-smi(如含GPU解码),定位瓶颈。

常见组合命令示例

读取SSD、放大预取、降速、只播关键话题:

复制代码
ros2 bag play <bag_dir>
--read-ahead-queue-size 20000
--rate 0.7
--topics /camera/image_raw /imu/data

配合SQLite大缓存与QoS放宽:

复制代码
ros2 bag play <bag_dir>
--read-ahead-queue-size 50000
--storage-config-file storage_config.yaml
--qos-profile-overrides-path qos_override.yaml

如果包是压缩的,先解压再播:

复制代码
ros2 bag decompress <bag_dir>
ros2 bag play <decompressed_bag_dir> --read-ahead-queue-size 20000
相关推荐
DemonAvenger1 天前
Kafka性能调优:从参数配置到硬件选择的全方位指南
性能优化·kafka·消息队列
winfreedoms3 天前
ROS2知识大白话
笔记·学习·ros2
Javatutouhouduan4 天前
RocketMQ是怎么保存偏移量的?
java·消息队列·rocketmq·java面试·消息中间件·后端开发·java程序员
DemonAvenger4 天前
深入理解Kafka分区策略:实现数据均衡分布的最佳实践
性能优化·kafka·消息队列
予枫的编程笔记5 天前
【Kafka进阶篇】Kafka消息重复消费?Exactly-Once语义落地指南,PID+事务消息吃透
人工智能·kafka·消息队列·exactly-once·分布式消息·kafka幂等性·kafka事务消息
LS_learner5 天前
RViz(ROS Visualization)显示传感器数据、机器人状态、路径规划结果等各种信息的强大图形界面
ros2
切糕师学AI5 天前
什么是死信队列(Dead Letter Queue)?
消息队列·死信队列·mq
LS_learner6 天前
ROS2的jazzy版本的机器人3D仿真软件gazebo的安装和使用
ros2
LS_learner6 天前
Xacro 和 SDF 是进行复杂机器人系统开发与高级仿真的关键技能
ros2
LS_learner6 天前
URDF(Unified Robot Description Format)机器人领域中用于描述机器人模型的标准 XML 格式
ros2