Una volta raccolte più tracce utilizzando ProfilingManager, esplorarle singolarmente per trovare problemi di prestazioni diventa poco pratico. L'analisi delle tracce collettive consente di eseguire query su un set di dati di tracce contemporaneamente per:
- Identificare le regressioni delle prestazioni comuni.
- Calcolare le distribuzioni statistiche (ad esempio, latenza P50, P90, P99).
- Trova pattern in più tracce.
- Trova tracce anomale per comprendere ed eseguire il debug dei problemi di prestazioni.
Questa sezione mostra come utilizzare il processore di tracce batch Python di Perfetto per analizzare le metriche di avvio in un insieme di tracce archiviate localmente e individuare le tracce anomale per un'analisi più approfondita.
Progetta la query
Il primo passaggio per eseguire un'analisi collettiva è creare una query PerfettoSQL.
In questa sezione presentiamo una query di esempio che misura la latenza di avvio dell'app.
In particolare, puoi misurare la durata da activityStart al primo frame generato (la prima occorrenza della sezione Choreographer#doFrame) per misurare la latenza di avvio dell'app che rientra nel controllo della tua app. La Figura 1 mostra la sezione su cui eseguire la query.
CREATE OR REPLACE PERFETTO FUNCTION find_slices(pattern STRING) RETURNS
TABLE (name STRING, ts LONG, dur LONG) AS
SELECT name,ts,dur FROM slice WHERE name GLOB $pattern;
CREATE OR REPLACE PERFETTO FUNCTION generate_start_to_end_slices(startSlicePattern STRING, endSlicePattern STRING, inclusive BOOL) RETURNS
TABLE(name STRING, ts LONG, dur LONG) AS
SELECT name, ts, MIN(startToEndDur) as dur
FROM
(SELECT S.name as name, S.ts as ts, E.ts + IIF($inclusive, E.dur, 0) - S.ts as startToEndDur
FROM find_slices($startSlicePattern) as S CROSS JOIN find_slices($endSlicePattern) as E
WHERE startToEndDur > 0)
GROUP BY name, ts;
SELECT ts,name,dur from generate_start_to_end_slices('activityStart','*Choreographer#doFrame [0-9]*', true)
Puoi eseguire la query all'interno della UI di Perfetto e poi utilizzare i risultati della query per generare una traccia di debug (Figura 2) e visualizzarla all'interno della cronologia (Figura 3).
Configura l'ambiente Python
Installa Python sulla tua macchina locale e le librerie richieste:
pip install perfetto pandas plotly
Crea lo script di analisi delle tracce collettive
Il seguente script di esempio esegue la query in più tracce utilizzando l'API Python di Perfetto BatchTraceProcessor.
from perfetto.batch_trace_processor import BatchTraceProcessor
import glob
import plotly.express as px
# Collect all trace files in the local directory
traces = glob.glob('*.perfetto-trace')
if not traces:
print("No .perfetto-trace files found in the current directory.")
exit(1)
if __name__ == '__main__':
# Process all traces in parallel to aggregate metrics across runs
with BatchTraceProcessor(traces) as btp:
query = """
CREATE OR REPLACE PERFETTO FUNCTION find_slices(pattern STRING) RETURNS
TABLE (name STRING, ts LONG, dur LONG) AS
SELECT name,ts,dur FROM slice WHERE name GLOB $pattern;
CREATE OR REPLACE PERFETTO FUNCTION generate_start_to_end_slices(startSlicePattern STRING, endSlicePattern STRING, inclusive BOOL) RETURNS
TABLE(name STRING, ts LONG, dur LONG) AS
SELECT name, ts, MIN(startToEndDur) as dur
FROM
(SELECT S.name as name, S.ts as ts, E.ts + IIF($inclusive, E.dur, 0) - S.ts as startToEndDur
FROM find_slices($startSlicePattern) as S CROSS JOIN find_slices($endSlicePattern) as E
WHERE startToEndDur > 0)
GROUP BY name, ts;
SELECT ts,name,dur / 1000000 as dur_ms from generate_start_to_end_slices('activityStart','*Choreographer#doFrame [0-9]*', true)
"""
df = btp.query_and_flatten(query)
# Plot the distribution of startup times, tracking trace file paths on
# hover
violin = px.violin(df, x='dur_ms', hover_data='_path', title='startup time', points='all')
violin.show()
Comprendi lo script
Quando esegui lo script Python, vengono eseguite le seguenti azioni:
- Lo script cerca nella directory locale tutte le tracce Perfetto con il suffisso
.perfetto-tracee le utilizza come tracce di origine per l'analisi. - Esegue una query di traccia collettiva che calcola il sottoinsieme del tempo di avvio corrispondente al tempo che intercorre tra la sezione di traccia
activityStarte il primo frame generato dalla tua app. - Traccia la latenza in millisecondi utilizzando un grafico a violino per visualizzare la distribuzione dei tempi di avvio.
Interpretazione dei risultati
Dopo aver eseguito lo script, questo genera un grafico. In questo caso, il grafico mostra una distribuzione bimodale con due picchi distinti (Figura 4).
Poi, trova la differenza tra le due popolazioni. In questo modo puoi esaminare le singole tracce in modo più dettagliato. In questo esempio, il grafico è configurato in modo che, quando passi il mouse sopra i punti dati (latenze), puoi identificare i nomi file delle tracce. Puoi quindi aprire una delle tracce che fanno parte del gruppo con latenza elevata.
Quando apri una traccia dal gruppo con latenza elevata (Figura 5), troverai una sezione aggiuntiva denominata MyFlaggedFeature in esecuzione durante l'avvio (Figura 6).
Al contrario, la selezione di una traccia dalla popolazione con latenza inferiore (il picco più a sinistra) conferma l'assenza della stessa sezione (Figura 7). Questo confronto indica che un flag di funzionalità specifico, attivato per un sottoinsieme di utenti, attiva la regressione.
Questo esempio mostra uno dei tanti modi in cui puoi utilizzare l'analisi collettiva delle tracce. Altri casi d'uso includono l'estrazione di statistiche dal campo per valutare l'impatto, il rilevamento di regressioni e altro ancora.
Tuttavia, la sua scalabilità dipende dalla memoria del computer. Per analizzare migliaia di tracce, consulta la documentazione di Perfetto Bigtrace per eseguire il deployment di un cluster scalabile.