1*6dbdd20aSAndroid Build Coastguard Worker# Perfetto - System profiling, app tracing and trace analysis 2*6dbdd20aSAndroid Build Coastguard Worker 3*6dbdd20aSAndroid Build Coastguard WorkerPerfetto is a production-grade open-source stack for performance 4*6dbdd20aSAndroid Build Coastguard Workerinstrumentation and trace analysis. It offers services and libraries for 5*6dbdd20aSAndroid Build Coastguard Workerrecording system-level and app-level traces, native + java heap profiling, a 6*6dbdd20aSAndroid Build Coastguard Workerlibrary for analyzing traces using SQL and a web-based UI to visualize and 7*6dbdd20aSAndroid Build Coastguard Workerexplore multi-GB traces. 8*6dbdd20aSAndroid Build Coastguard Worker 9*6dbdd20aSAndroid Build Coastguard Worker 10*6dbdd20aSAndroid Build Coastguard Worker 11*6dbdd20aSAndroid Build Coastguard Worker## Recording traces 12*6dbdd20aSAndroid Build Coastguard Worker 13*6dbdd20aSAndroid Build Coastguard WorkerAt its core, Perfetto introduces a novel userspace-to-userspace 14*6dbdd20aSAndroid Build Coastguard Worker[tracing protocol](/docs/design-docs/api-and-abi.md#tracing-protocol-abi) based 15*6dbdd20aSAndroid Build Coastguard Workeron direct protobuf serialization onto a shared memory buffer. The tracing 16*6dbdd20aSAndroid Build Coastguard Workerprotocol is used both internally for the built-in data sources and exposed to 17*6dbdd20aSAndroid Build Coastguard WorkerC++ apps through the [Tracing SDK](/docs/instrumentation/tracing-sdk.md) and the 18*6dbdd20aSAndroid Build Coastguard Worker[Track Event Library](/docs/instrumentation/track-events.md). 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard WorkerThis new tracing protocol allows dynamic configuration of all aspects of tracing 21*6dbdd20aSAndroid Build Coastguard Workerthrough an extensible protobuf-based capability advertisement and data source 22*6dbdd20aSAndroid Build Coastguard Workerconfiguration mechanism (see 23*6dbdd20aSAndroid Build Coastguard Worker[Trace configuration docs](/docs/concepts/config.md)). 24*6dbdd20aSAndroid Build Coastguard WorkerDifferent data sources can be multiplexed onto different subsets of 25*6dbdd20aSAndroid Build Coastguard Workeruser-defined buffers, allowing also streaming of 26*6dbdd20aSAndroid Build Coastguard Worker[arbitrarily long traces](/docs/concepts/config.md#long-traces) into the 27*6dbdd20aSAndroid Build Coastguard Workerfilesystem. 28*6dbdd20aSAndroid Build Coastguard Worker 29*6dbdd20aSAndroid Build Coastguard Worker### System-wide tracing on Android and Linux 30*6dbdd20aSAndroid Build Coastguard Worker 31*6dbdd20aSAndroid Build Coastguard WorkerOn Linux and Android, Perfetto bundles a number of data sources that are able to 32*6dbdd20aSAndroid Build Coastguard Workergather detailed performance data from different system interfaces. For the full 33*6dbdd20aSAndroid Build Coastguard Workersets and details see the _Data Sources_ section of the documentation. Some 34*6dbdd20aSAndroid Build Coastguard Workerexamples: 35*6dbdd20aSAndroid Build Coastguard Worker 36*6dbdd20aSAndroid Build Coastguard Worker* [Kernel tracing](/docs/data-sources/cpu-scheduling.md): Perfetto integrates 37*6dbdd20aSAndroid Build Coastguard Worker with [Linux's ftrace][ftrace] and allows to record kernel events (e.g 38*6dbdd20aSAndroid Build Coastguard Worker scheduling events, syscalls) into the trace. 39*6dbdd20aSAndroid Build Coastguard Worker 40*6dbdd20aSAndroid Build Coastguard Worker* [/proc and /sys pollers](/docs/data-sources/memory-counters.md), which allow 41*6dbdd20aSAndroid Build Coastguard Worker to sample the state of process-wide or system-wide cpu and memory counters 42*6dbdd20aSAndroid Build Coastguard Worker over time. 43*6dbdd20aSAndroid Build Coastguard Worker 44*6dbdd20aSAndroid Build Coastguard Worker* Integration with Android HALs modules for recording [battery and energy-usage 45*6dbdd20aSAndroid Build Coastguard Worker counters](/docs/data-sources/battery-counters.md). 46*6dbdd20aSAndroid Build Coastguard Worker 47*6dbdd20aSAndroid Build Coastguard Worker* [Native heap profiling](/docs/data-sources/native-heap-profiler.md): a 48*6dbdd20aSAndroid Build Coastguard Worker low-overhead heap profiler for hooking malloc/free/new/delete and associating 49*6dbdd20aSAndroid Build Coastguard Worker memory to call-stacks, based on out-of-process unwinding, configurable 50*6dbdd20aSAndroid Build Coastguard Worker sampling, attachable to already running processes. 51*6dbdd20aSAndroid Build Coastguard Worker 52*6dbdd20aSAndroid Build Coastguard Worker* Capturing [Java heap dumps](/docs/data-sources/java-heap-profiler.md) with an 53*6dbdd20aSAndroid Build Coastguard Worker out-of-process profiler tightly integrated with the Android RunTime that 54*6dbdd20aSAndroid Build Coastguard Worker allows to get full snapshots of the managed heap retention graph (types, 55*6dbdd20aSAndroid Build Coastguard Worker field names, retained size and references to other objects) without, however, 56*6dbdd20aSAndroid Build Coastguard Worker dumping the full heap contents (strings and bitmaps) and hence reducing the 57*6dbdd20aSAndroid Build Coastguard Worker serialization time and output file size. 58*6dbdd20aSAndroid Build Coastguard Worker 59*6dbdd20aSAndroid Build Coastguard WorkerOn Android, Perfetto is the next-generation system tracing system and replaces 60*6dbdd20aSAndroid Build Coastguard Workerthe chromium-based systrace. 61*6dbdd20aSAndroid Build Coastguard Worker[ATrace-based instrumentation](/docs/data-sources/atrace.md) remains fully 62*6dbdd20aSAndroid Build Coastguard Workersupported. 63*6dbdd20aSAndroid Build Coastguard WorkerSee [Android developer docs](https://developer.android.com/topic/performance/tracing) 64*6dbdd20aSAndroid Build Coastguard Workerfor more details. 65*6dbdd20aSAndroid Build Coastguard Worker 66*6dbdd20aSAndroid Build Coastguard Worker### Tracing SDK and user-space instrumentation 67*6dbdd20aSAndroid Build Coastguard Worker 68*6dbdd20aSAndroid Build Coastguard WorkerThe [Perfetto Tracing SDK](/docs/instrumentation/tracing-sdk.md) enables C++ 69*6dbdd20aSAndroid Build Coastguard Workerdevelopers to enrich traces with app-specific trace points. You can choose 70*6dbdd20aSAndroid Build Coastguard Workerbetween the flexibility of defining your own strongly-typed events and creating 71*6dbdd20aSAndroid Build Coastguard Workercustom data sources or using the easier-to-use 72*6dbdd20aSAndroid Build Coastguard Worker[Track Event Library](/docs/instrumentation/track-events.md) which allows to 73*6dbdd20aSAndroid Build Coastguard Workereasily create time-bounded slices, counters and time markers using annotations 74*6dbdd20aSAndroid Build Coastguard Workerof the form `TRACE_EVENT("category", "event_name", "x", "str", "y", 42)`. 75*6dbdd20aSAndroid Build Coastguard Worker 76*6dbdd20aSAndroid Build Coastguard WorkerThe SDK is designed for tracing of multi-process systems and multi-threaded 77*6dbdd20aSAndroid Build Coastguard Workerprocesses. It is based on [ProtoZero](/docs/design-docs/protozero.md), a library 78*6dbdd20aSAndroid Build Coastguard Workerfor direct writing of protobuf events on thread-local shared memory buffers. 79*6dbdd20aSAndroid Build Coastguard Worker 80*6dbdd20aSAndroid Build Coastguard WorkerThe same code can work both in fully-in-process mode, hosting an instance of the 81*6dbdd20aSAndroid Build Coastguard WorkerPerfetto tracing service on a dedicated thread, or in _system mode_, connecting 82*6dbdd20aSAndroid Build Coastguard Workerto the Linux/Android tracing daemon through a UNIX socket, allowing to combine 83*6dbdd20aSAndroid Build Coastguard Workerapp-specific instrumentation points with system-wide tracing events. 84*6dbdd20aSAndroid Build Coastguard Worker 85*6dbdd20aSAndroid Build Coastguard WorkerThe SDK is based on portable C++17 code [tested](/docs/contributing/testing.md) 86*6dbdd20aSAndroid Build Coastguard Workerwith the major C++ sanitizers (ASan, TSan, MSan, LSan). It doesn't rely on 87*6dbdd20aSAndroid Build Coastguard Workerrun-time code modifications or compiler plugins. 88*6dbdd20aSAndroid Build Coastguard Worker 89*6dbdd20aSAndroid Build Coastguard Worker### Tracing in Chromium 90*6dbdd20aSAndroid Build Coastguard Worker 91*6dbdd20aSAndroid Build Coastguard WorkerPerfetto has been designed from the grounds to replace the internals of the 92*6dbdd20aSAndroid Build Coastguard Worker[chrome://tracing infrastructure][chrome-tracing]. Tracing in Chromium and its 93*6dbdd20aSAndroid Build Coastguard Workerinternals are based on Perfetto's codebase on all major platforms (Android, 94*6dbdd20aSAndroid Build Coastguard WorkerCrOS, Linux, MacOS, Windows). 95*6dbdd20aSAndroid Build Coastguard WorkerThe same [service-based architecture](/docs/concepts/service-model.md) of 96*6dbdd20aSAndroid Build Coastguard Workersystem-wide tracing applies, but internally the Chromium Mojo IPC system is 97*6dbdd20aSAndroid Build Coastguard Workerused instead of Perfetto's own UNIX socket. 98*6dbdd20aSAndroid Build Coastguard Worker 99*6dbdd20aSAndroid Build Coastguard WorkerBy default tracing works in in-process mode in Chromium, recording only data 100*6dbdd20aSAndroid Build Coastguard Workeremitted by Chromium processes. On Android (and on Linux, if disabling the 101*6dbdd20aSAndroid Build Coastguard WorkerChromium sandbox) tracing can work in hybrid in-process+system mode, combining 102*6dbdd20aSAndroid Build Coastguard Workerchrome-specific trace events with Perfetto system events. 103*6dbdd20aSAndroid Build Coastguard Worker 104*6dbdd20aSAndroid Build Coastguard Worker_(Googlers: see [go/chrometto](https://goto.google.com/chrometto) for more)_ 105*6dbdd20aSAndroid Build Coastguard Worker 106*6dbdd20aSAndroid Build Coastguard Worker## Trace analysis 107*6dbdd20aSAndroid Build Coastguard Worker 108*6dbdd20aSAndroid Build Coastguard WorkerBeyond the trace recording capabilities, the Perfetto codebase includes a 109*6dbdd20aSAndroid Build Coastguard Workerdedicated project for importing, parsing and querying new and legacy trace 110*6dbdd20aSAndroid Build Coastguard Workerformats, [Trace Processor](/docs/analysis/trace-processor.md). 111*6dbdd20aSAndroid Build Coastguard Worker 112*6dbdd20aSAndroid Build Coastguard WorkerTrace Processor is a portable C++17 library that provides column-oriented 113*6dbdd20aSAndroid Build Coastguard Workertable storage, designed ad-hoc for efficiently holding hours of trace data 114*6dbdd20aSAndroid Build Coastguard Workerinto memory and exposes a SQL query interface based on the popular SQLite query 115*6dbdd20aSAndroid Build Coastguard Workerengine. 116*6dbdd20aSAndroid Build Coastguard WorkerThe trace data model becomes a set of 117*6dbdd20aSAndroid Build Coastguard Worker[SQL tables](/docs/analysis/sql-tables.autogen) which can be queried and joined 118*6dbdd20aSAndroid Build Coastguard Workerin extremely powerful and flexible ways to analyze the trace data. 119*6dbdd20aSAndroid Build Coastguard Worker 120*6dbdd20aSAndroid Build Coastguard WorkerOn top of this, Trace Processor includes also a 121*6dbdd20aSAndroid Build Coastguard Worker[trace-based metrics subsystem](/docs/analysis/metrics.md) consisting of 122*6dbdd20aSAndroid Build Coastguard Workerpre-baked and extensible queries that can output strongly-typed summaries 123*6dbdd20aSAndroid Build Coastguard Workerabout a trace in the form of JSON or protobuf messages (e.g., the CPU usage 124*6dbdd20aSAndroid Build Coastguard Workerat different frequency states, breakdown by process and thread). 125*6dbdd20aSAndroid Build Coastguard Worker 126*6dbdd20aSAndroid Build Coastguard WorkerTrace-based metrics allow an easy integration of traces in performance testing 127*6dbdd20aSAndroid Build Coastguard Workerscenarios or batch analysis or large corpuses of traces. 128*6dbdd20aSAndroid Build Coastguard Worker 129*6dbdd20aSAndroid Build Coastguard WorkerTrace Processor is also designed for low-latency queries and for building 130*6dbdd20aSAndroid Build Coastguard Workertrace visualizers. Today Trace Processor is used by the 131*6dbdd20aSAndroid Build Coastguard Worker[Perfetto UI](https://ui.perfetto.dev) as a Web Assembly module, 132*6dbdd20aSAndroid Build Coastguard Worker[Android Studio](https://developer.android.com/studio) and 133*6dbdd20aSAndroid Build Coastguard Worker[Android GPU Inspector](https://gpuinspector.dev/) as native C++ library. 134*6dbdd20aSAndroid Build Coastguard Worker 135*6dbdd20aSAndroid Build Coastguard Worker## Trace visualization 136*6dbdd20aSAndroid Build Coastguard Worker 137*6dbdd20aSAndroid Build Coastguard WorkerPerfetto provides also a brand new trace visualizer for opening and querying 138*6dbdd20aSAndroid Build Coastguard Workerhours-long traces, available at [ui.perfetto.dev](https://ui.perfetto.dev). 139*6dbdd20aSAndroid Build Coastguard WorkerThe new visualizer takes advantage of modern web platform technologies. 140*6dbdd20aSAndroid Build Coastguard WorkerIts multi-threading design based WebWorkers keeps the UI always responsive; 141*6dbdd20aSAndroid Build Coastguard Workerthe analytical power of Trace Processor and SQLite is fully available in-browser 142*6dbdd20aSAndroid Build Coastguard Workerthrough WebAssembly. 143*6dbdd20aSAndroid Build Coastguard Worker 144*6dbdd20aSAndroid Build Coastguard WorkerThe Perfetto UI works fully offline after it has been opened once. Traces opened 145*6dbdd20aSAndroid Build Coastguard Workerwith the UI are processed locally by the browser and do not require any 146*6dbdd20aSAndroid Build Coastguard Workerserver-side interaction. 147*6dbdd20aSAndroid Build Coastguard Worker 148*6dbdd20aSAndroid Build Coastguard Worker 149*6dbdd20aSAndroid Build Coastguard Worker 150*6dbdd20aSAndroid Build Coastguard Worker## Contributing 151*6dbdd20aSAndroid Build Coastguard Worker 152*6dbdd20aSAndroid Build Coastguard WorkerSee the [Contributing -> Getting started page](/docs/contributing/getting-started.md). 153*6dbdd20aSAndroid Build Coastguard Worker 154*6dbdd20aSAndroid Build Coastguard Worker## Bugs 155*6dbdd20aSAndroid Build Coastguard Worker 156*6dbdd20aSAndroid Build Coastguard WorkerFor bugs affecting Android or the tracing internals: 157*6dbdd20aSAndroid Build Coastguard Worker 158*6dbdd20aSAndroid Build Coastguard Worker* **Googlers**: use the internal bug tracker [go/perfetto-bugs](http://goto.google.com/perfetto-bugs) 159*6dbdd20aSAndroid Build Coastguard Worker 160*6dbdd20aSAndroid Build Coastguard Worker* **Non-Googlers**: use [GitHub issues](https://github.com/google/perfetto/issues). 161*6dbdd20aSAndroid Build Coastguard Worker 162*6dbdd20aSAndroid Build Coastguard WorkerFor bugs affecting Chrome Tracing: 163*6dbdd20aSAndroid Build Coastguard Worker 164*6dbdd20aSAndroid Build Coastguard Worker* **Googlers**: use the internal bug tracker [go/chrometto-bugs](http://goto.google.com/chrometto-bugs) 165*6dbdd20aSAndroid Build Coastguard Worker 166*6dbdd20aSAndroid Build Coastguard Worker* **Non-Googlers**: use [crbug.com](https://bugs.chromium.org/p/chromium/issues/list?q=component%3ASpeed%3ETracing%20label%3APerfetto) 167*6dbdd20aSAndroid Build Coastguard Workerto [file new bugs](https://bugs.chromium.org/p/chromium/issues/entry?components=Speed%3ETracing&labels=Perfetto). 168*6dbdd20aSAndroid Build Coastguard Worker 169*6dbdd20aSAndroid Build Coastguard Worker[ftrace]: https://www.kernel.org/doc/Documentation/trace/ftrace.txt 170*6dbdd20aSAndroid Build Coastguard Worker[chrome-tracing]: https://www.chromium.org/developers/how-tos/trace-event-profiling-tool 171