Tracing tools for ROS 2.
ros2_tracing
provides tracing instrumentation for the core ROS 2 packages.
It also provides tools to configure tracing through a launch action and a ros2
CLI command.
ros2_tracing
currently only supports the LTTng tracer.
Consequently, it currently only supports Linux.
Note: make sure to use the right branch, depending on the ROS 2 distro: use rolling
for Rolling, galactic
for Galactic, etc.
Read the ros2_tracing
paper!
If you use or refer to ros2_tracing
, please cite:
- C. Bédard, I. Lütkebohle, and M. Dagenais, "ros2_tracing: Multipurpose Low-Overhead Framework for Real-Time Tracing of ROS 2," IEEE Robotics and Automation Letters, vol. 7, no. 3, pp. 6511–6518, 2022.
BibTeX
@article{bedard2022ros2tracing,
title={ros2\_tracing: Multipurpose Low-Overhead Framework for Real-Time Tracing of ROS 2},
author={B{\'e}dard, Christophe and L{\"u}tkebohle, Ingo and Dagenais, Michel},
journal={IEEE Robotics and Automation Letters},
year={2022},
volume={7},
number={3},
pages={6511--6518},
doi={10.1109/LRA.2022.3174346}
}
Also, check out the ROS World 2021 presentation titled "Tracing ROS 2 with ros2_tracing" (video, slides). Reference:
- C. Bédard, "Tracing ROS 2 with ros2_tracing," in ROS World 2021. Open Robotics, October 2021. [Online]. Available: https://vimeo.com/652633418, (pdf)
- ROS 2 documentation: Building ROS 2 with tracing
- Real-Time Working Group documentation tutorial: How to use
ros2_tracing
to trace and analyze an application - ROS World 2021 demo: github.com/christophebedard/ros-world-2021-demo
As of Iron, the LTTng tracer is a ROS 2 dependency. Therefore, ROS 2 can be traced out-of-the-box on Linux; this package does not need to be re-built.
To make sure that the instrumentation and tracepoints are available:
$ source /opt/ros/rolling/setup.bash # With a binary install
$ source ./install/setup.bash # When building from source
$ ros2 run tracetools status
Tracing enabled
A ROS 2 installation only includes the LTTng userspace tracer (LTTng-UST), which is all that is needed to trace ROS 2. To trace the Linux kernel, the LTTng kernel tracer must be installed separately:
$ sudo apt-get update
$ sudo apt-get install lttng-modules-dkms
For more information about LTTng, refer to its documentation.
To build and remove all instrumentation, use TRACETOOLS_DISABLED
:
$ colcon build --cmake-args -DTRACETOOLS_DISABLED=ON
This will remove all instrumentation from the core ROS 2 packages, and thus they will not depend on or link against the shared library provided by the tracetools
package.
This also means that LTTng is not required at build-time or at runtime.
Alternatively, to only exclude the actual tracepoints, use TRACETOOLS_TRACEPOINTS_EXCLUDED
:
$ colcon build --packages-select tracetools --cmake-clean-cache --cmake-args -DTRACETOOLS_TRACEPOINTS_EXCLUDED=ON
This will keep the instrumentation but remove all tracepoints.
This also means that LTTng is not required at build-time or at runtime.
This option can be useful, since tracepoints can be added back in or removed by simply replacing/re-building the shared library provided by the tracetools
package.
By default, trace data will not be generated, and thus these packages will have virtually no impact on execution. LTTng has to be configured for tracing. The packages in this repo provide two options: a command and a launch file action.
Note: tracing must be started before the application is launched. Metadata is recorded during the initialization phase of the application. This metadata is needed to understand the rest of the trace data, so if tracing is started after the application started executing, then the trace data might be unusable. For more information, refer to the design document. The launch file action is designed to automatically start tracing before the application launches.
The tracing directory can be configured using command/launch action parameters, or through environment variables with the following logic:
- Use
$ROS_TRACE_DIR
ifROS_TRACE_DIR
is set and not empty. - Otherwise, use
$ROS_HOME/tracing
, using~/.ros
forROS_HOME
if not set or if empty.
Additionally, if you're using kernel tracing with a non-root user, make sure that the tracing
group exists and that your user is added to it.
# Create group if it doesn't exist
$ sudo groupadd -r tracing
# Add user to the group
$ sudo usermod -aG tracing $USER
The first option is to use the ros2 trace
command.
$ ros2 trace
By default, it will enable all ROS 2 tracepoints.
The trace will be written to ~/.ros/tracing/session-YYYYMMDDHHMMSS
.
Run the command with -h
for more information.
You must install the kernel tracer if you want to enable kernel events (using the -k
/--kernel-events
option).
If you have installed the kernel tracer, use kernel tracing, and still encounter an error here, make sure to add your user to the tracing
group.
Another option is to use the Trace
action in a Python, XML, or YAML launch file along with your Node
action(s).
This way, tracing automatically starts when launching the launch file and ends when it exits or when terminated.
$ ros2 launch tracetools_launch example.launch.py
The Trace
action will also set the LD_PRELOAD
environment to preload LTTng's userspace tracing helper(s) if the corresponding event(s) are enabled.
For more information, see this example launch file and the Trace
action.
You must install the kernel tracer if you want to enable kernel events (events_kernel
in Python, events-kernel
in XML or YAML).
If you have installed the kernel tracer, use kernel tracing, and still encounter an error here, make sure to add your user to the tracing
group.
See the design document.
LTTng-UST, the current default userspace tracer used for tracing ROS 2, was designed for real-time production applications. It is a low-overhead tracer with many important real-time compatible features:
- userspace tracer completely implemented in userspace, independent from the kernel
- reentrant, thread-safe, signal-safe, non-blocking
- no system calls in the fast path
- no copies of the trace data
However, some settings need to be tuned for it to be fully real-time safe and for performance to be optimal for your use-case:
- timers1: use read timer to avoid a write(2) call
- sub-buffer1 count and size:
- see documentation for sub-buffer count and size tuning tips based on your use-case
- minimize sub-buffer count to minimize sub-buffer switching overhead
- one-time memory allocation/lock/syscall per thread:
- usually done the first time a tracepoint is executed within a thread for URCU thread registration, but registration can be manually performed to force it to be done during your application's initialization
- see this LTTng mailing list message
For further reading:
- LTTng documentation
- Combined Tracing of the Kernel and Applications with LTTng: LTTng-UST architecture and design goals (section 3)
- Survey and Analysis of Kernel and Userspace Tracers on Linux: Design, Implementation, and Overhead: LTTng-UST overhead and design compared to other kernel and userspace tracers (table 6: average latency overhead per tracepoint of 158 ns)
The LTTng kernel tracer has a similar implementation, but is separate from the userspace tracer.
Package containing a ros2cli
extension to enable tracing.
Library to support instrumenting ROS packages, including core packages.
This package claims to be in the Quality Level 1 category, see the Quality Declaration for more details.
See the API documentation.
Package containing tools to enable tracing through launch files.
Package containing tools to read traces.
Package containing tools for tracing-related tests.
Package containing tools to enable tracing.
Package containing unit and system tests for tracetools
.
Package containing system tests for tracetools_launch
.
See tracetools_analysis
.
Footnotes
-
this setting cannot currently be set through the
Trace
launch file action or theros2 trace
command, see #20 ↩ ↩2