问题描述
使用ros2实现的节点,订阅了较多的topic数量(70个左右), 节点cpu使用率明显升高
使用perf观察火焰图,executor耗时较多.
在ros2 rclcpp的github上搜到确实有一个相关的issue.
官方issue
https://github.com/ros2/rclcpp/issues/1637
原因分析
既然官方问题还没有解决,我们先分析和解决一下吧
进一步使用ebpf工具分析函数的调用次数和单次耗时,发现rmw_wait
单次耗时都比较久,达到了ms级别.因此重点分析rmw_wait
的实现. --------- ebpf工具的使用可以阅读专栏相关文章了解.
发现每次rmw_wait
操作都会先遍历所有要订阅的sub, 所有clients, 所有events, 所有guard_conditions. 然后依次添加到具体DDS实现的wait_set
上,然后调用DDS相关接口等待就绪对象. 当有一个