From acc7e4f4b6be6238a53f5313122e9a39131311e6 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Fri, 19 Apr 2024 15:34:51 -0700 Subject: [PATCH] Adapt ros2_tracing tutorial for Humble Signed-off-by: Christophe Bedard --- source/Tutorials/Advanced.rst | 1 + .../ROS2-Tracing-Trace-and-Analyze.rst | 195 ++++++++++++++++++ .../images/ros2_tracing_guide_result_plot.png | Bin 0 -> 34266 bytes 3 files changed, 196 insertions(+) create mode 100644 source/Tutorials/Advanced/ROS2-Tracing-Trace-and-Analyze.rst create mode 100644 source/Tutorials/Advanced/images/ros2_tracing_guide_result_plot.png diff --git a/source/Tutorials/Advanced.rst b/source/Tutorials/Advanced.rst index 78289383065..5178d109949 100644 --- a/source/Tutorials/Advanced.rst +++ b/source/Tutorials/Advanced.rst @@ -10,6 +10,7 @@ Advanced Advanced/FastDDS-Configuration Advanced/Recording-A-Bag-From-Your-Own-Node-CPP Advanced/Recording-A-Bag-From-Your-Own-Node-Py + Advanced/ROS2-Tracing-Trace-and-Analyze Advanced/Reading-From-A-Bag-File-CPP Advanced/Simulators/Simulation-Main Advanced/Security/Security-Main diff --git a/source/Tutorials/Advanced/ROS2-Tracing-Trace-and-Analyze.rst b/source/Tutorials/Advanced/ROS2-Tracing-Trace-and-Analyze.rst new file mode 100644 index 00000000000..246f9636df7 --- /dev/null +++ b/source/Tutorials/Advanced/ROS2-Tracing-Trace-and-Analyze.rst @@ -0,0 +1,195 @@ +How to use ros2_tracing to trace and analyze an application +=========================================================== + +This tutorial shows how to use `ros2_tracing `_ to trace and analyze a ROS 2 application. +For this tutorial, the application will be `performance_test `_. + +Overview +-------- + +This tutorial covers: + +1. running and tracing a ``performance_test`` run +2. analyzing the trace data using `tracetools_analysis `_ to plot the callback durations + +Prerequisites +------------- + +This tutorial is aimed at real-time Linux systems. +See the :doc:`real-time system setup tutorial <../Miscellaneous/Building-Realtime-rt_preempt-kernel-for-ROS-2>`. +However, the tutorial will work if you are using a non-real-time Linux system. + +Installing and building +----------------------- + +.. note:: + + This tutorial should generally work with all supported Linux distributions. + However, you might need to adapt some commands. + +Install all dependencies for ROS 2 on Linux by following the :doc:`source installation instructions <../../Installation/Alternatives/Ubuntu-Development-Setup.rst>`. +Stop before the *Build the code in the workspace* section. + +Install `LTTng `_ and ``babeltrace``. + +.. code-block:: bash + + sudo apt-get update + sudo apt-get install -y lttng-tools liblttng-ust-dev python3-lttng python3-babeltrace babeltrace + +Then create a workspace, import the ROS 2 {DISTRO_TITLE} code, and clone ``performance_test`` and ``tracetools_analysis``. + +.. code-block:: bash + + cd ~/ + mkdir -p tracing_ws/src + cd tracing_ws/src/ + vcs import src/ --input https://raw.githubusercontent.com/ros2/ros2/{DISTRO}/ros2.repos + cd src/ + git clone https://gitlab.com/ApexAI/performance_test.git + git clone https://github.com/ros-tracing/tracetools_analysis.git --branch {DISTRO} + cd .. + +Install dependencies with rosdep. + +.. code-block:: bash + + rosdep update + rosdep install --rosdistro {DISTRO} --from-paths src --ignore-src -y + +Then build up to ``performance_test`` and configure it for ROS 2. +See its `documentation `_. +We also need to build ``ros2trace`` to set up tracing using the ``ros2 trace`` command and ``tracetools_analysis`` to analyze the data. + +.. code-block:: bash + + colcon build --packages-up-to ros2trace ros2run tracetools_analysis performance_test --cmake-args -DPERFORMANCE_TEST_RCLCPP_ENABLED=ON + +Source the installation and verify that tracing is enabled: + +.. code-block:: bash + + source install/setup.bash + ros2 run tracetools status + +You should see ``Tracing enabled`` in the output. +This confirms that LTTng was properly detected and that the instrumentation built into the ROS 2 core is enabled. + +Next, we will run a ``performance_test`` experiment and trace it. + +Tracing +------- + +Step 1: Trace +^^^^^^^^^^^^^ + +In one terminal, source the workspace and set up tracing. +When running the command, a list of ROS 2 userspace events will be printed. +It will also print the path to the directory that will contain the resulting trace (under ``~/.ros/tracing``). + +.. code-block:: bash + + # terminal 1 + cd ~/tracing_ws + source install/setup.bash + ros2 trace --session-name perf-test --list + +Press enter to start tracing. + +Step 2: Run Application +^^^^^^^^^^^^^^^^^^^^^^^ + +In a second terminal, source the workspace. + +.. code-block:: bash + + # terminal 2 + cd ~/tracing_ws + source install/setup.bash + +Then run the ``performance_test`` experiment (or your own application). +We simply create an experiment with a node publishing ~1 MB messages to another node as fast as possible for 60 seconds using the second highest real-time priority so that we don't interfere with critical kernel threads. +We need to run ``performance_test`` as ``root`` to be able to use real-time priorities. + +.. code-block:: bash + + # terminal 2 + sudo ./install/performance_test/lib/performance_test/perf_test -c rclcpp-single-threaded-executor -p 1 -s 1 -r 0 -m Array1m --reliability RELIABLE --max-runtime 60 --use-rt-prio 98 + +If that last command doesn't work for you (with an error like: "error while loading shared libraries"), run the slightly-different command below. +This is because, for security reasons, we need to manually pass ``*PATH`` environment variables for some shared libraries to be found (see `this explanation `_). + +.. code-block:: bash + + # terminal 2 + sudo env PATH="$PATH" LD_LIBRARY_PATH="$LD_LIBRARY_PATH" ./install/performance_test/lib/performance_test/perf_test -c rclcpp-single-threaded-executor -p 1 -s 1 -r 0 -m Array1m --reliability RELIABLE --max-runtime 60 --use-rt-prio 98 + +.. note:: + + If you're not using a real-time kernel, simply run: + + .. code-block:: bash + + # terminal 2 + ./install/performance_test/lib/performance_test/perf_test -c rclcpp-single-threaded-executor -p 1 -s 1 -r 0 -m Array1m --reliability RELIABLE --max-runtime 60 + +Step 3: Validate Trace +^^^^^^^^^^^^^^^^^^^^^^ + +Once the experiment is done, in the first terminal, press enter again to stop tracing. +Use ``babeltrace`` to quickly look at the resulting trace. + +.. code-block:: bash + + babeltrace ~/.ros/tracing/perf-test | less + +The output of the above command is a human-readable version of the raw Common Trace Format (CTF) data, which is a list of trace events. +Each event has a timestamp, an event type, some information on the process that generated the event, and the values of the fields of the given event type. + +Use the arrow keys to scroll, or press ``q`` to exit. + +Next, we will analyze the trace. + +Analysis +-------- + +`tracetools_analysis `_ provides a Python API to easily analyze traces. +We can use it in a `Jupyter notebook `_ with `bokeh `_ to plot the data. +The ``tracetools_analysis`` repository contains a `few sample notebooks `_, including `one notebook to analyze subscription callback durations `_. + +For this tutorial, we will plot the durations of the subscription callback in the subscriber node. + +Install bokeh and then open the sample notebook. + +.. code-block:: bash + + pip3 install bokeh + jupyter notebook ~/tracing_ws/src/tracetools_analysis/tracetools_analysis/analysis/callback_duration.ipynb + +This will open the notebook in the browser. + +Replace the value for the ``path`` variable in the second cell to the path to the trace directory: + +.. code-block:: python + + path = '~/.ros/tracing/perf-test' + +Run the notebook by clicking the *Run* button for each cell. +Running the cell that does the trace processing might take a few minutes on the first run, but subsequent runs will be much quicker. + +You should get a plot that looks similar to this: + +.. image:: ./images/ros2_tracing_guide_result_plot.png + :alt: callback durations result plot + :align: center + +We can see that most of the callbacks take less than 0.01 ms, but there are some outliers taking over 0.02 or 0.03 ms. + +Conclusion +---------- + +This tutorial showed how to install tracing-related tools and build ROS 2 with tracing instrumentation. +Then it showed how to trace a `performance_test `_ experiment using `ros2_tracing `_ and plot the callback durations using `tracetools_analysis `_. + +For more trace analyses, take a look at the `other sample notebooks `_ and the `tracetools_analysis API documentation `_. +The `ros2_tracing design document `_ also contains a lot of information. diff --git a/source/Tutorials/Advanced/images/ros2_tracing_guide_result_plot.png b/source/Tutorials/Advanced/images/ros2_tracing_guide_result_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..a3de6b90a4fc07db808271bf8a90f82d1ef30dd1 GIT binary patch literal 34266 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 F{{oZq|GNMH literal 0 HcmV?d00001