| # Perfetto - System profiling, app tracing and trace analysis |
| |
| Perfetto is a production-grade open-source stack for performance |
| instrumentation and trace analysis. It offers services and libraries for |
| recording system-level and app-level traces, native + java heap profiling, a |
| library for analyzing traces using SQL and a web-based UI to visualize and |
| explore multi-GB traces. |
| |
| ![Perfetto stack](/docs/images/perfetto-stack.svg) |
| |
| ## Recording traces |
| |
| At its core, Perfetto introduces a novel userspace-to-userspace |
| [tracing protocol](/docs/design-docs/api-and-abi.md#tracing-protocol-abi) based |
| on direct protobuf serialization onto a shared memory buffer. The tracing |
| protocol is used both internally for the built-in data sources and exposed to |
| C++ apps through the [Tracing SDK](/docs/instrumentation/tracing-sdk.md) and the |
| [Track Event Library](/docs/instrumentation/track-events.md). |
| |
| This new tracing protocol allows dynamic configuration of all aspects of tracing |
| through an extensible protobuf-based capability advertisement and data source |
| configuration mechanism (see |
| [Trace configuration docs](/docs/concepts/config.md)). |
| Different data sources can be multiplexed onto different subsets of |
| user-defined buffers, allowing also streaming of |
| [arbitrarily long traces](/docs/concepts/config.md#long-traces) into the |
| filesystem. |
| |
| ### System-wide tracing on Android and Linux |
| |
| On Linux and Android, Perfetto bundles a number of data sources that are able to |
| gather detailed performance data from different system interfaces. For the full |
| sets and details see the _Data Sources_ section of the documentation. Some |
| examples: |
| |
| * [Kernel tracing](/docs/data-sources/cpu-scheduling.md): Perfetto integrates |
| with [Linux's ftrace][ftrace] and allows to record kernel events (e.g |
| scheduling events, syscalls) into the trace. |
| |
| * [/proc and /sys pollers](/docs/data-sources/memory-counters.md), which allow |
| to sample the state of process-wide or system-wide cpu and memory counters |
| over time. |
| |
| * Integration with Android HALs modules for recording [battery and energy-usage |
| counters](/docs/data-sources/battery-counters.md). |
| |
| * [Native heap profiling](/docs/data-sources/native-heap-profiler.md): a |
| low-overhead heap profiler for hooking malloc/free/new/delete and associating |
| memory to call-stacks, based on out-of-process unwinding, configurable |
| sampling, attachable to already running processes. |
| |
| * Capturing [Java heap dumps](/docs/data-sources/java-heap-profiler.md) with an |
| out-of-process profiler tightly integrated with the Android RunTime that |
| allows to get full snapshots of the managed heap retention graph (types, |
| field names, retained size and references to other objects) without, however, |
| dumping the full heap contents (strings and bitmaps) and hence reducing the |
| serialization time and output file size. |
| |
| On Android, Perfetto is the next-generation system tracing system and replaces |
| the chromium-based systrace. |
| [ATrace-based instrumentation](/docs/data-sources/atrace.md) remains fully |
| supported. |
| See [Android developer docs](https://developer.android.com/topic/performance/tracing) |
| for more details. |
| |
| ### Tracing SDK and user-space instrumentation |
| |
| The [Perfetto Tracing SDK](/docs/instrumentation/tracing-sdk.md) enables C++ |
| developers to enrich traces with app-specific trace points. You can choose |
| between the flexibility of defining your own strongly-typed events and creating |
| custom data sources or using the easier-to-use |
| [Track Event Library](/docs/instrumentation/track-events.md) which allows to |
| easily create time-bounded slices, counters and time markers using annotations |
| of the form `TRACE_EVENT("category", "event_name", "x", "str", "y", 42)`. |
| |
| The SDK is designed for tracing of multi-process systems and multi-threaded |
| processes. It is based on [ProtoZero](/docs/design-docs/protozero.md), a library |
| for direct writing of protobuf events on thread-local shared memory buffers. |
| |
| The same code can work both in fully-in-process mode, hosting an instance of the |
| Perfetto tracing service on a dedicated thread, or in _system mode_, connecting |
| to the Linux/Android tracing daemon through a UNIX socket, allowing to combine |
| app-specific instrumentation points with system-wide tracing events. |
| |
| The SDK is based on portable C++17 code [tested](/docs/contributing/testing.md) |
| with the major C++ sanitizers (ASan, TSan, MSan, LSan). It doesn't rely on |
| run-time code modifications or compiler plugins. |
| |
| ### Tracing in Chromium |
| |
| Perfetto has been designed from the grounds to replace the internals of the |
| [chrome://tracing infrastructure][chrome-tracing]. Tracing in Chromium and its |
| internals are based on Perfetto's codebase on all major platforms (Android, |
| CrOS, Linux, MacOS, Windows). |
| The same [service-based architecture](/docs/concepts/service-model.md) of |
| system-wide tracing applies, but internally the Chromium Mojo IPC system is |
| used instead of Perfetto's own UNIX socket. |
| |
| By default tracing works in in-process mode in Chromium, recording only data |
| emitted by Chromium processes. On Android (and on Linux, if disabling the |
| Chromium sandbox) tracing can work in hybrid in-process+system mode, combining |
| chrome-specific trace events with Perfetto system events. |
| |
| _(Googlers: see [go/chrometto](https://goto.google.com/chrometto) for more)_ |
| |
| ## Trace analysis |
| |
| Beyond the trace recording capabilities, the Perfetto codebase includes a |
| dedicated project for importing, parsing and querying new and legacy trace |
| formats, [Trace Processor](/docs/analysis/trace-processor.md). |
| |
| Trace Processor is a portable C++17 library that provides column-oriented |
| table storage, designed ad-hoc for efficiently holding hours of trace data |
| into memory and exposes a SQL query interface based on the popular SQLite query |
| engine. |
| The trace data model becomes a set of |
| [SQL tables](/docs/analysis/sql-tables.autogen) which can be queried and joined |
| in extremely powerful and flexible ways to analyze the trace data. |
| |
| On top of this, Trace Processor includes also a |
| [trace-based metrics subsystem](/docs/analysis/metrics.md) consisting of |
| pre-baked and extensible queries that can output strongly-typed summaries |
| about a trace in the form of JSON or protobuf messages (e.g., the CPU usage |
| at different frequency states, breakdown by process and thread). |
| |
| Trace-based metrics allow an easy integration of traces in performance testing |
| scenarios or batch analysis or large corpuses of traces. |
| |
| Trace Processor is also designed for low-latency queries and for building |
| trace visualizers. Today Trace Processor is used by the |
| [Perfetto UI](https://ui.perfetto.dev) as a Web Assembly module, |
| [Android Studio](https://developer.android.com/studio) and |
| [Android GPU Inspector](https://gpuinspector.dev/) as native C++ library. |
| |
| ## Trace visualization |
| |
| Perfetto provides also a brand new trace visualizer for opening and querying |
| hours-long traces, available at [ui.perfetto.dev](https://ui.perfetto.dev). |
| The new visualizer takes advantage of modern web platform technologies. |
| Its multi-threading design based WebWorkers keeps the UI always responsive; |
| the analytical power of Trace Processor and SQLite is fully available in-browser |
| through WebAssembly. |
| |
| The Perfetto UI works fully offline after it has been opened once. Traces opened |
| with the UI are processed locally by the browser and do not require any |
| server-side interaction. |
| |
| ![Perfetto UI screenshot](/docs/images/perfetto-ui-screenshot.png) |
| |
| ## Contributing |
| |
| See the [Contributing -> Getting started page](/docs/contributing/getting-started.md). |
| |
| ## Bugs |
| |
| For bugs affecting Android or the tracing internals: |
| |
| * **Googlers**: use the internal bug tracker [go/perfetto-bugs](http://goto.google.com/perfetto-bugs) |
| |
| * **Non-Googlers**: use [GitHub issues](https://github.com/google/perfetto/issues). |
| |
| For bugs affecting Chrome Tracing: |
| |
| * **Googlers**: use the internal bug tracker [go/chrometto-bugs](http://goto.google.com/chrometto-bugs) |
| |
| * **Non-Googlers**: use [crbug.com](https://bugs.chromium.org/p/chromium/issues/list?q=component%3ASpeed%3ETracing%20label%3APerfetto) |
| to [file new bugs](https://bugs.chromium.org/p/chromium/issues/entry?components=Speed%3ETracing&labels=Perfetto). |
| |
| [ftrace]: https://www.kernel.org/doc/Documentation/trace/ftrace.txt |
| [chrome-tracing]: https://www.chromium.org/developers/how-tos/trace-event-profiling-tool |