Une fois que vous avez collecté plusieurs traces à l'aide de ProfilingManager, il devient difficile de les explorer individuellement pour identifier les problèmes de performances. L'analyse groupée des traces vous permet d'interroger simultanément un ensemble de données de traces pour :
- Identifier les régressions de performances courantes
- Calculer les distributions statistiques (par exemple, la latence P50, P90, P99)
- Rechercher des modèles dans plusieurs traces.
- Recherchez les traces aberrantes pour comprendre et déboguer les problèmes de performances.
Cette section explique comment utiliser le processeur de traces par lot Perfetto Python pour analyser les métriques de démarrage sur un ensemble de traces stockées localement et localiser les traces aberrantes pour une analyse plus approfondie.
Concevoir la requête
La première étape pour effectuer une analyse groupée consiste à créer une requête PerfettoSQL.
Dans cette section, nous présentons un exemple de requête qui mesure la latence de démarrage de l'application.
Plus précisément, vous pouvez mesurer la durée entre activityStart et la première frame générée (la première occurrence de la section Choreographer#doFrame) pour mesurer la latence de démarrage de l'application qui est sous le contrôle de votre application. La figure 1 montre la section à interroger.
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)
Vous pouvez exécuter la requête dans l'interface utilisateur de Perfetto, puis utiliser les résultats de la requête pour générer une trace de débogage (figure 2) et la visualiser dans la chronologie (figure 3).
Configurer l'environnement Python
Installez Python sur votre ordinateur local, ainsi que les bibliothèques requises :
pip install perfetto pandas plotly
Créer le script d'analyse groupée des traces
L'exemple de script suivant exécute la requête dans plusieurs traces à l'aide de BatchTraceProcessor de Python de Perfetto.
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()
Comprendre le script
Lorsque vous exécutez le script Python, celui-ci effectue les actions suivantes :
- Le script recherche dans votre répertoire local toutes les traces Perfetto avec le suffixe
.perfetto-traceet les utilise comme traces sources pour l'analyse. - Il exécute une requête de trace groupée qui calcule le sous-ensemble du temps de démarrage correspondant au temps écoulé entre la section de trace
activityStartet la première image générée par votre application. - Il trace la latence en millisecondes à l'aide d'un diagramme en violon pour visualiser la distribution des temps de démarrage.
Interprétation des résultats
Une fois le script exécuté, il génère un graphique. Dans ce cas, le graphique montre une distribution bimodale avec deux pics distincts (figure 4).
Ensuite, trouvez la différence entre les deux populations. Cela vous permet d'examiner plus en détail des traces individuelles. Dans cet exemple, le tracé est configuré de sorte que lorsque vous pointez sur les points de données (latences), vous pouvez identifier les noms de fichiers de trace. Vous pouvez ensuite ouvrir l'une des traces faisant partie du groupe à latence élevée.
Lorsque vous ouvrez une trace du groupe à latence élevée (figure 5), vous trouverez une section supplémentaire nommée MyFlaggedFeature qui s'exécute au démarrage (figure 6).
À l'inverse, la sélection d'une trace de la population à faible latence (le pic le plus à gauche) confirme l'absence de cette même tranche (figure 7). Cette comparaison indique qu'un flag de fonctionnalité spécifique, activé pour un sous-ensemble d'utilisateurs, déclenche la régression.
Cet exemple illustre l'une des nombreuses façons d'utiliser l'analyse de traces groupées. D'autres cas d'utilisation incluent l'extraction de statistiques sur le terrain pour évaluer l'impact, la détection des régressions, etc.