perf-analyze)perf-analyze is a host-side tool designed to perform standalone, automated, and human-interactive performance analysis on Fuchsia traces. The tool acts as a CLI orchestrator that delegates trace processing to specialized analysis plugins.
query: Executes SQL queries to inspect and extract structured data from traces. Backed by Perfetto's Trace Processor.analyze: Executes specialized analysis plugins to identify performance anomalies (e.g., binder delays, jank, CPU starvation).visualize (Planned): Generates HTML reports, flamegraphs, SVGs, or deep-link trampoline URLs for the Perfetto UI.--format <json|markdown|text>: Specifies the output format (default: text).text: Unformatted tab-separated values (TSV), ideal for shell scripting.markdown: Formatted Markdown tables, ideal for doc insertion.json: Structured JSON, ideal for automated tool ingestion.query SubcommandThe query subcommand executes SQL queries against a trace file using Perfetto's Trace Processor.
--trace <path_or_url> (Required): File path to a local .fxt trace file or a URL to a remote trace.--sql <query_string>: Executes a single raw SQL query. Mutually exclusive with --batch.--batch <json_string_or_@filepath>: Executes a JSON array of queries in the format [{"name": "query_name", "sql": "select ..."}, ...]. Use @filepath to read the array from a local file. Mutually exclusive with --sql.fx perf-analyze query --help
Output:
usage: perf-analyze query [-h] --trace TRACE (--sql SQL | --batch BATCH) options: -h, --help show this help message and exit --trace TRACE Trace file path or URL --sql SQL SQL query to run --batch BATCH Batch JSON or @file
fx perf-analyze query \ --trace src/performance/perf-analyze/test-data/sample_fxt.fxt \ --sql "select count(*) as cnt from slice"
Output:
cnt 520
fx perf-analyze --format markdown query \ --trace src/performance/perf-analyze/test-data/sample_fxt.fxt \ --sql "select count(*) as cnt from slice"
Output:
| cnt | | --- | | 520 |
fx perf-analyze --format json query \ --trace src/performance/perf-analyze/test-data/sample_fxt.fxt \ --batch @src/performance/perf-analyze/test-data/sample_queries.json
Output:
[ { "name": "slice_count", "results": [ { "cnt": 520 } ] }, { "name": "process_count", "results": [ { "cnt": 2 } ] } ]
analyze SubcommandThe analyze subcommand runs specialized analysis plugins against a trace file to identify specific performance anomalies.
--trace <path_or_url> (Required): File path to a local .fxt trace file or a URL to a remote trace.--plugin <plugin_name> (Required): Name of the analysis plugin to execute (e.g., binder).--list-plugins: Lists all available analysis plugins.binder (Starnix Binder Analysis)Analyzes Starnix binder delays, missed wakeups (scheduling delays), and late-spawned wakers.
--threshold-ms <float>: Threshold for scheduling delay and queue latency in milliseconds (default: 10.0).--complete-only: Only return complete transactions (default: False, includes incomplete transactions).fx perf-analyze --format markdown analyze \ --trace "https://ui.perfetto.dev/#!/?s=b3615b084da54e9a0742dd8f6280de355df4f513" \ --plugin binder \ --threshold-ms 15.0
cpu (CPU Utilization & Idle Power Diagnostics)Provides a multi-dimensional diagnostic view of system activity during an idle trace, identifying timer thrashing, excessive wakeups, per-core utilization and frequency scaling, async executor overhead, binder IPC chatter, and suspend/wake lease blockers.
The plugin executes 6 diagnostic queries in prioritized order:
Processing Rate:CPU:N counters.--limit <int>: Maximum number of rows returned for ranked queries (default: 15).fx perf-analyze --format markdown analyze \ --trace src/performance/perf-analyze/test-data/sample_fxt.fxt \ --plugin cpu \ --limit 10
Unit tests are written using standard Python unittest. To build and run all unit tests, execute:
fx test perf_analyze_test binder_test result_formatter_test cpu_test