Une fois que vous avez collecté plusieurs traces à l'aide de ProfilingManager, il devient peu pratique de les explorer individuellement pour trouver 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 et P99).
- Trouvez des modèles dans plusieurs traces.
- Trouvez les traces aberrantes pour comprendre et déboguer les problèmes de performances.
Cette section explique comment utiliser le processeur de traces par lot Python Perfetto 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 au démarrage de l'application.
Plus précisément, vous pouvez mesurer la durée entre activityStart et le premier frame généré (la première occurrence de la tranche Choreographer#doFrame) pour mesurer la latence au 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 Perfetto, puis utiliser les résultats de la requête pour générer une piste de débogage (figure 2) et la visualiser dans la chronologie (figure 3).
Configurer l'environnement Python
Installez Python sur votre machine locale et les bibliothèques requises :
pip install perfetto pandas plotly
Créer le script d'analyse des traces groupées
L'exemple de script suivant exécute la requête dans plusieurs traces à l'aide de Python BatchTraceProcessor de Perfetto.
from perfetto.batch_trace_processor import BatchTraceProcessor
import glob
import plotly.express as px
traces = glob.glob('*.perfetto-trace')
if __name__ == '__main__':
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)
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, il effectue les actions suivantes :
- Le script recherche dans votre répertoire local toutes les traces Perfetto portant 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 le segment de trace
activityStartet le premier frame généré par votre application. - Il représente la latence en millisecondes à l'aide d'un graphique en violon pour visualiser la distribution des temps de démarrage.
Interpréter les 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, déterminez la différence entre les deux populations. Cela vous permet d'examiner les traces individuelles plus en détail. Dans cet exemple, le graphique 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 qui font partie du groupe à latence élevée.
Lorsque vous ouvrez une trace du groupe à latence élevée (figure 5), vous trouverez une tranche 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 à latence plus faible (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 trace groupée. D'autres cas d'utilisation incluent l'extraction de statistiques à partir du champ pour évaluer l'impact, détecter les régressions, etc.