1*61046927SAndroid Build Coastguard WorkerPerfetto Tracing 2*61046927SAndroid Build Coastguard Worker================ 3*61046927SAndroid Build Coastguard Worker 4*61046927SAndroid Build Coastguard WorkerMesa has experimental support for `Perfetto <https://perfetto.dev>`__ for 5*61046927SAndroid Build Coastguard WorkerGPU performance monitoring. Perfetto supports multiple 6*61046927SAndroid Build Coastguard Worker`producers <https://perfetto.dev/docs/concepts/service-model>`__ each with 7*61046927SAndroid Build Coastguard Workerone or more data-sources. Perfetto already provides various producers and 8*61046927SAndroid Build Coastguard Workerdata-sources for things like: 9*61046927SAndroid Build Coastguard Worker 10*61046927SAndroid Build Coastguard Worker- CPU scheduling events (``linux.ftrace``) 11*61046927SAndroid Build Coastguard Worker- CPU frequency scaling (``linux.ftrace``) 12*61046927SAndroid Build Coastguard Worker- System calls (``linux.ftrace``) 13*61046927SAndroid Build Coastguard Worker- Process memory utilization (``linux.process_stats``) 14*61046927SAndroid Build Coastguard Worker 15*61046927SAndroid Build Coastguard WorkerAs well as various domain specific producers. 16*61046927SAndroid Build Coastguard Worker 17*61046927SAndroid Build Coastguard WorkerThe mesa Perfetto support adds additional producers, to allow for visualizing 18*61046927SAndroid Build Coastguard WorkerGPU performance (frequency, utilization, performance counters, etc) on the 19*61046927SAndroid Build Coastguard Workersame timeline, to better understand and tune/debug system level performance: 20*61046927SAndroid Build Coastguard Worker 21*61046927SAndroid Build Coastguard Worker- pps-producer: A systemwide daemon that can collect global performance 22*61046927SAndroid Build Coastguard Worker counters. 23*61046927SAndroid Build Coastguard Worker- mesa: Per-process producer within mesa to capture render-stage traces 24*61046927SAndroid Build Coastguard Worker on the GPU timeline, track events on the CPU timeline, etc. 25*61046927SAndroid Build Coastguard Worker 26*61046927SAndroid Build Coastguard WorkerThe exact supported features vary per driver: 27*61046927SAndroid Build Coastguard Worker 28*61046927SAndroid Build Coastguard Worker.. list-table:: Supported data-sources 29*61046927SAndroid Build Coastguard Worker :header-rows: 1 30*61046927SAndroid Build Coastguard Worker 31*61046927SAndroid Build Coastguard Worker * - Driver 32*61046927SAndroid Build Coastguard Worker - PPS Counters 33*61046927SAndroid Build Coastguard Worker - Render Stages 34*61046927SAndroid Build Coastguard Worker * - Freedreno 35*61046927SAndroid Build Coastguard Worker - ``gpu.counters.msm`` 36*61046927SAndroid Build Coastguard Worker - ``gpu.renderstages.msm`` 37*61046927SAndroid Build Coastguard Worker * - Turnip 38*61046927SAndroid Build Coastguard Worker - ``gpu.counters.msm`` 39*61046927SAndroid Build Coastguard Worker - ``gpu.renderstages.msm`` 40*61046927SAndroid Build Coastguard Worker * - Intel 41*61046927SAndroid Build Coastguard Worker - ``gpu.counters.i915`` 42*61046927SAndroid Build Coastguard Worker - ``gpu.renderstages.intel`` 43*61046927SAndroid Build Coastguard Worker * - Panfrost 44*61046927SAndroid Build Coastguard Worker - ``gpu.counters.panfrost`` 45*61046927SAndroid Build Coastguard Worker - 46*61046927SAndroid Build Coastguard Worker 47*61046927SAndroid Build Coastguard WorkerRun 48*61046927SAndroid Build Coastguard Worker--- 49*61046927SAndroid Build Coastguard Worker 50*61046927SAndroid Build Coastguard WorkerTo capture a trace with Perfetto you need to take the following steps: 51*61046927SAndroid Build Coastguard Worker 52*61046927SAndroid Build Coastguard Worker1. Build Perfetto from sources available at ``subprojects/perfetto`` following 53*61046927SAndroid Build Coastguard Worker `this guide <https://perfetto.dev/docs/quickstart/linux-tracing>`__. 54*61046927SAndroid Build Coastguard Worker 55*61046927SAndroid Build Coastguard Worker2. Create a `trace config <https://perfetto.dev/docs/concepts/config>`__, which is 56*61046927SAndroid Build Coastguard Worker a json formatted text file with extension ``.cfg``, or use one of the config 57*61046927SAndroid Build Coastguard Worker files under the ``src/tool/pps/cfg`` directory. More examples of config files 58*61046927SAndroid Build Coastguard Worker can be found in ``subprojects/perfetto/test/configs``. 59*61046927SAndroid Build Coastguard Worker 60*61046927SAndroid Build Coastguard Worker3. Change directory to ``subprojects/perfetto`` and run a 61*61046927SAndroid Build Coastguard Worker `convenience script <https://perfetto.dev/docs/quickstart/linux-tracing#capturing-a-trace>`__ 62*61046927SAndroid Build Coastguard Worker to start the tracing service: 63*61046927SAndroid Build Coastguard Worker 64*61046927SAndroid Build Coastguard Worker .. code-block:: sh 65*61046927SAndroid Build Coastguard Worker 66*61046927SAndroid Build Coastguard Worker cd subprojects/perfetto 67*61046927SAndroid Build Coastguard Worker CONFIG=<path/to/gpu.cfg> OUT=out/linux_clang_release ./tools/tmux -n 68*61046927SAndroid Build Coastguard Worker 69*61046927SAndroid Build Coastguard Worker4. Start other producers you may need, e.g. ``pps-producer``. 70*61046927SAndroid Build Coastguard Worker 71*61046927SAndroid Build Coastguard Worker5. Start ``perfetto`` under the tmux session initiated in step 3. 72*61046927SAndroid Build Coastguard Worker 73*61046927SAndroid Build Coastguard Worker6. Once tracing has finished, you can detach from tmux with :kbd:`Ctrl+b`, 74*61046927SAndroid Build Coastguard Worker :kbd:`d`, and the convenience script should automatically copy the trace 75*61046927SAndroid Build Coastguard Worker files into ``$HOME/Downloads``. 76*61046927SAndroid Build Coastguard Worker 77*61046927SAndroid Build Coastguard Worker7. Go to `ui.perfetto.dev <https://ui.perfetto.dev>`__ and upload 78*61046927SAndroid Build Coastguard Worker ``$HOME/Downloads/trace.protobuf`` by clicking on **Open trace file**. 79*61046927SAndroid Build Coastguard Worker 80*61046927SAndroid Build Coastguard Worker8. Alternatively you can open the trace in `AGI <https://gpuinspector.dev/>`__ 81*61046927SAndroid Build Coastguard Worker (which despite the name can be used to view non-android traces). 82*61046927SAndroid Build Coastguard Worker 83*61046927SAndroid Build Coastguard WorkerTo be a bit more explicit, here is a listing of commands reproducing 84*61046927SAndroid Build Coastguard Workerthe steps above : 85*61046927SAndroid Build Coastguard Worker 86*61046927SAndroid Build Coastguard Worker.. code-block:: sh 87*61046927SAndroid Build Coastguard Worker 88*61046927SAndroid Build Coastguard Worker # Configure Mesa with perfetto 89*61046927SAndroid Build Coastguard Worker mesa $ meson . build -Dperfetto=true -Dvulkan-drivers=intel,broadcom -Dgallium-drivers= 90*61046927SAndroid Build Coastguard Worker # Build mesa 91*61046927SAndroid Build Coastguard Worker mesa $ meson compile -C build 92*61046927SAndroid Build Coastguard Worker 93*61046927SAndroid Build Coastguard Worker # Within the Mesa repo, build perfetto 94*61046927SAndroid Build Coastguard Worker mesa $ cd subprojects/perfetto 95*61046927SAndroid Build Coastguard Worker perfetto $ ./tools/install-build-deps 96*61046927SAndroid Build Coastguard Worker perfetto $ ./tools/gn gen --args='is_debug=false' out/linux 97*61046927SAndroid Build Coastguard Worker perfetto $ ./tools/ninja -C out/linux 98*61046927SAndroid Build Coastguard Worker 99*61046927SAndroid Build Coastguard Worker # Start perfetto 100*61046927SAndroid Build Coastguard Worker perfetto $ CONFIG=../../src/tool/pps/cfg/gpu.cfg OUT=out/linux/ ./tools/tmux -n 101*61046927SAndroid Build Coastguard Worker 102*61046927SAndroid Build Coastguard Worker # In parallel from the Mesa repo, start the PPS producer 103*61046927SAndroid Build Coastguard Worker mesa $ ./build/src/tool/pps/pps-producer 104*61046927SAndroid Build Coastguard Worker 105*61046927SAndroid Build Coastguard Worker # Back in the perfetto tmux, press enter to start the capture 106*61046927SAndroid Build Coastguard Worker 107*61046927SAndroid Build Coastguard WorkerCPU Tracing 108*61046927SAndroid Build Coastguard Worker~~~~~~~~~~~ 109*61046927SAndroid Build Coastguard Worker 110*61046927SAndroid Build Coastguard WorkerMesa's CPU tracepoints (``MESA_TRACE_*``) use Perfetto track events when 111*61046927SAndroid Build Coastguard WorkerPerfetto is enabled. They use ``mesa.default`` and ``mesa.slow`` categories. 112*61046927SAndroid Build Coastguard Worker 113*61046927SAndroid Build Coastguard WorkerCurrently, only EGL and Freedreno have CPU tracepoints. 114*61046927SAndroid Build Coastguard Worker 115*61046927SAndroid Build Coastguard WorkerVulkan data sources 116*61046927SAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~~~~ 117*61046927SAndroid Build Coastguard Worker 118*61046927SAndroid Build Coastguard WorkerThe Vulkan API gives the application control over recording of command 119*61046927SAndroid Build Coastguard Workerbuffers as well as when they are submitted to the hardware. As a 120*61046927SAndroid Build Coastguard Workerconsequence, we need to ensure command buffers are properly 121*61046927SAndroid Build Coastguard Workerinstrumented for the Perfetto driver data sources prior to Perfetto 122*61046927SAndroid Build Coastguard Workeractually collecting traces. 123*61046927SAndroid Build Coastguard Worker 124*61046927SAndroid Build Coastguard WorkerThis can be achieved by setting the :envvar:`MESA_GPU_TRACES` 125*61046927SAndroid Build Coastguard Workerenvironment variable before starting a Vulkan application : 126*61046927SAndroid Build Coastguard Worker 127*61046927SAndroid Build Coastguard Worker.. code-block:: sh 128*61046927SAndroid Build Coastguard Worker 129*61046927SAndroid Build Coastguard Worker MESA_GPU_TRACES=perfetto ./build/my_vulkan_app 130*61046927SAndroid Build Coastguard Worker 131*61046927SAndroid Build Coastguard WorkerDriver Specifics 132*61046927SAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~ 133*61046927SAndroid Build Coastguard Worker 134*61046927SAndroid Build Coastguard WorkerBelow is driver specific information/instructions for the PPS producer. 135*61046927SAndroid Build Coastguard Worker 136*61046927SAndroid Build Coastguard WorkerFreedreno / Turnip 137*61046927SAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^^^ 138*61046927SAndroid Build Coastguard Worker 139*61046927SAndroid Build Coastguard WorkerThe Freedreno PPS driver needs root access to read system-wide 140*61046927SAndroid Build Coastguard Workerperformance counters, so you can simply run it with sudo: 141*61046927SAndroid Build Coastguard Worker 142*61046927SAndroid Build Coastguard Worker.. code-block:: sh 143*61046927SAndroid Build Coastguard Worker 144*61046927SAndroid Build Coastguard Worker sudo ./build/src/tool/pps/pps-producer 145*61046927SAndroid Build Coastguard Worker 146*61046927SAndroid Build Coastguard WorkerIntel 147*61046927SAndroid Build Coastguard Worker^^^^^ 148*61046927SAndroid Build Coastguard Worker 149*61046927SAndroid Build Coastguard WorkerThe Intel PPS driver needs root access to read system-wide 150*61046927SAndroid Build Coastguard Worker`RenderBasic <https://www.intel.com/content/www/us/en/docs/vtune-profiler/user-guide/2023-0/gpu-metrics-reference.html>`__ 151*61046927SAndroid Build Coastguard Workerperformance counters, so you can simply run it with sudo: 152*61046927SAndroid Build Coastguard Worker 153*61046927SAndroid Build Coastguard Worker.. code-block:: sh 154*61046927SAndroid Build Coastguard Worker 155*61046927SAndroid Build Coastguard Worker sudo ./build/src/tool/pps/pps-producer 156*61046927SAndroid Build Coastguard Worker 157*61046927SAndroid Build Coastguard WorkerAnother option to enable access wide data without root permissions would be running the following: 158*61046927SAndroid Build Coastguard Worker 159*61046927SAndroid Build Coastguard Worker.. code-block:: sh 160*61046927SAndroid Build Coastguard Worker 161*61046927SAndroid Build Coastguard Worker sudo sysctl dev.i915.perf_stream_paranoid=0 162*61046927SAndroid Build Coastguard Worker 163*61046927SAndroid Build Coastguard WorkerAlternatively using the ``CAP_PERFMON`` permission on the binary should work too. 164*61046927SAndroid Build Coastguard Worker 165*61046927SAndroid Build Coastguard WorkerA particular metric set can also be selected to capture a different 166*61046927SAndroid Build Coastguard Workerset of HW counters : 167*61046927SAndroid Build Coastguard Worker 168*61046927SAndroid Build Coastguard Worker.. code-block:: sh 169*61046927SAndroid Build Coastguard Worker 170*61046927SAndroid Build Coastguard Worker INTEL_PERFETTO_METRIC_SET=RasterizerAndPixelBackend ./build/src/tool/pps/pps-producer 171*61046927SAndroid Build Coastguard Worker 172*61046927SAndroid Build Coastguard WorkerVulkan applications can also be instrumented to be Perfetto producers. 173*61046927SAndroid Build Coastguard WorkerTo enable this for given application, set the environment variable as 174*61046927SAndroid Build Coastguard Workerfollow : 175*61046927SAndroid Build Coastguard Worker 176*61046927SAndroid Build Coastguard Worker.. code-block:: sh 177*61046927SAndroid Build Coastguard Worker 178*61046927SAndroid Build Coastguard Worker PERFETTO_TRACE=1 my_vulkan_app 179*61046927SAndroid Build Coastguard Worker 180*61046927SAndroid Build Coastguard WorkerPanfrost 181*61046927SAndroid Build Coastguard Worker^^^^^^^^ 182*61046927SAndroid Build Coastguard Worker 183*61046927SAndroid Build Coastguard WorkerThe Panfrost PPS driver uses unstable ioctls that behave correctly on 184*61046927SAndroid Build Coastguard Workerkernel version `5.4.23+ <https://lwn.net/Articles/813601/>`__ and 185*61046927SAndroid Build Coastguard Worker`5.5.7+ <https://lwn.net/Articles/813600/>`__. 186*61046927SAndroid Build Coastguard Worker 187*61046927SAndroid Build Coastguard WorkerTo run the producer, follow these two simple steps: 188*61046927SAndroid Build Coastguard Worker 189*61046927SAndroid Build Coastguard Worker1. Enable Panfrost unstable ioctls via kernel parameter: 190*61046927SAndroid Build Coastguard Worker 191*61046927SAndroid Build Coastguard Worker .. code-block:: sh 192*61046927SAndroid Build Coastguard Worker 193*61046927SAndroid Build Coastguard Worker modprobe panfrost unstable_ioctls=1 194*61046927SAndroid Build Coastguard Worker 195*61046927SAndroid Build Coastguard Worker Alternatively you could add ``panfrost.unstable_ioctls=1`` to your kernel command line, or ``echo 1 > /sys/module/panfrost/parameters/unstable_ioctls``. 196*61046927SAndroid Build Coastguard Worker 197*61046927SAndroid Build Coastguard Worker2. Run the producer: 198*61046927SAndroid Build Coastguard Worker 199*61046927SAndroid Build Coastguard Worker .. code-block:: sh 200*61046927SAndroid Build Coastguard Worker 201*61046927SAndroid Build Coastguard Worker ./build/pps-producer 202*61046927SAndroid Build Coastguard Worker 203*61046927SAndroid Build Coastguard WorkerTroubleshooting 204*61046927SAndroid Build Coastguard Worker--------------- 205*61046927SAndroid Build Coastguard Worker 206*61046927SAndroid Build Coastguard WorkerTmux 207*61046927SAndroid Build Coastguard Worker~~~~ 208*61046927SAndroid Build Coastguard Worker 209*61046927SAndroid Build Coastguard WorkerIf the convenience script ``tools/tmux`` keeps copying artifacts to your 210*61046927SAndroid Build Coastguard Worker``SSH_TARGET`` without starting the tmux session, make sure you have ``tmux`` 211*61046927SAndroid Build Coastguard Workerinstalled in your system. 212*61046927SAndroid Build Coastguard Worker 213*61046927SAndroid Build Coastguard Worker.. code-block:: sh 214*61046927SAndroid Build Coastguard Worker 215*61046927SAndroid Build Coastguard Worker apt install tmux 216*61046927SAndroid Build Coastguard Worker 217*61046927SAndroid Build Coastguard WorkerMissing counter names 218*61046927SAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~~~~~~ 219*61046927SAndroid Build Coastguard Worker 220*61046927SAndroid Build Coastguard WorkerIf the trace viewer shows a list of counters with a description like 221*61046927SAndroid Build Coastguard Worker``gpu_counter(#)`` instead of their proper names, maybe you had a data loss due 222*61046927SAndroid Build Coastguard Workerto the trace buffer being full and wrapped. 223*61046927SAndroid Build Coastguard Worker 224*61046927SAndroid Build Coastguard WorkerIn order to prevent this loss of data you can tweak the trace config file in 225*61046927SAndroid Build Coastguard Workertwo different ways: 226*61046927SAndroid Build Coastguard Worker 227*61046927SAndroid Build Coastguard Worker- Increase the size of the buffer in use: 228*61046927SAndroid Build Coastguard Worker 229*61046927SAndroid Build Coastguard Worker .. code-block:: javascript 230*61046927SAndroid Build Coastguard Worker 231*61046927SAndroid Build Coastguard Worker buffers { 232*61046927SAndroid Build Coastguard Worker size_kb: 2048, 233*61046927SAndroid Build Coastguard Worker fill_policy: RING_BUFFER, 234*61046927SAndroid Build Coastguard Worker } 235*61046927SAndroid Build Coastguard Worker 236*61046927SAndroid Build Coastguard Worker- Periodically flush the trace buffer into the output file: 237*61046927SAndroid Build Coastguard Worker 238*61046927SAndroid Build Coastguard Worker .. code-block:: javascript 239*61046927SAndroid Build Coastguard Worker 240*61046927SAndroid Build Coastguard Worker write_into_file: true 241*61046927SAndroid Build Coastguard Worker file_write_period_ms: 250 242*61046927SAndroid Build Coastguard Worker 243*61046927SAndroid Build Coastguard Worker 244*61046927SAndroid Build Coastguard Worker- Discard new traces when the buffer fills: 245*61046927SAndroid Build Coastguard Worker 246*61046927SAndroid Build Coastguard Worker .. code-block:: javascript 247*61046927SAndroid Build Coastguard Worker 248*61046927SAndroid Build Coastguard Worker buffers { 249*61046927SAndroid Build Coastguard Worker size_kb: 2048, 250*61046927SAndroid Build Coastguard Worker fill_policy: DISCARD, 251*61046927SAndroid Build Coastguard Worker } 252