Sobald Sie mehrere Traces mit ProfilingManager erfasst haben, ist es nicht mehr praktikabel, sie einzeln zu untersuchen, um Leistungsprobleme zu finden. Mit der Bulk-Trace-Analyse können Sie gleichzeitig ein Dataset mit Traces abfragen, um Folgendes zu tun:
- Häufige Leistungsregressionen identifizieren.
- Statistische Verteilungen berechnen (z. B. P50-, P90- und P99-Latenz).
- Muster in mehreren Traces finden.
- Ausreißer-Traces finden, um Leistungsprobleme zu verstehen und zu beheben.
In diesem Abschnitt wird gezeigt, wie Sie mit dem Perfetto Python Batch Trace Processor Startmesswerte in einer Reihe von lokal gespeicherten Traces analysieren und Ausreißer-Traces für eine detailliertere Analyse finden.
Abfrage entwerfen
Der erste Schritt zur Durchführung einer Bulk-Analyse ist das Erstellen einer PerfettoSQL-Abfrage.
In diesem Abschnitt präsentieren wir eine Beispielabfrage, mit der die Startlatenz der App gemessen wird.
Insbesondere können Sie die Dauer von activityStart bis zum ersten generierten Frame (das erste Vorkommen des Choreographer#doFrame-Slice) messen, um die Startlatenz der App zu messen, die in Ihrer App liegt. Abbildung 1 zeigt den abzufragenden Abschnitt.
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)
Sie können die Abfrage in der Perfetto-UI ausführen und dann die Abfrageergebnisse verwenden, um einen Debug-Track zu generieren (Abbildung 2) und ihn in der Zeitachse zu visualisieren (Abbildung 3).
Python-Umgebung einrichten
Installieren Sie Python auf Ihrem lokalen Computer und die erforderlichen Bibliotheken:
pip install perfetto pandas plotly
Skript für die Bulk-Trace-Analyse erstellen
Das folgende Beispielskript führt die Abfrage in mehreren Traces mit dem Python BatchTraceProcessor von Perfetto aus.
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()
Skript verstehen
Wenn Sie das Python-Skript ausführen, werden die folgenden Aktionen ausgeführt:
- Das Skript sucht in Ihrem lokalen Verzeichnis nach allen Perfetto-Traces mit dem Suffix
.perfetto-traceund verwendet sie als Quell-Traces für die Analyse. - Es wird eine Bulk-Trace-Abfrage ausgeführt, die die Teilmenge der Startzeit berechnet, die der Zeit vom
activityStart-Trace-Slice bis zum ersten von Ihrer App generierten Frame entspricht. - Die Latenz wird in Millisekunden mit einem Violin-Plot dargestellt, um die Verteilung der Startzeiten zu visualisieren.
Ergebnisse interpretieren
Nachdem Sie das Skript ausgeführt haben, wird ein Plot generiert. In diesem Fall zeigt der Plot eine bimodale Verteilung mit zwei unterschiedlichen Peaks (Abbildung 4).
Als Nächstes ermitteln Sie den Unterschied zwischen den beiden Populationen. So können Sie einzelne Traces detaillierter untersuchen. In diesem Beispiel ist der Plot so eingerichtet, dass Sie die Trace-Dateinamen ermitteln können, wenn Sie den Mauszeiger auf die Datenpunkte (Latenzen) bewegen. Anschließend können Sie einen der Traces öffnen, der zur Gruppe mit hoher Latenz gehört.
Wenn Sie einen Trace aus der Gruppe mit hoher Latenz öffnen (Abbildung 5), sehen Sie ein zusätzliches Slice mit dem Namen MyFlaggedFeature, das während des Starts ausgeführt wird (Abbildung 6).
Wenn Sie einen Trace aus der Population mit niedrigerer Latenz (der linke Peak) auswählen, wird bestätigt, dass dieses Slice nicht vorhanden ist (Abbildung 7). Dieser Vergleich zeigt, dass ein bestimmtes Funktions-Flag, das für eine Teilmenge der Nutzer aktiviert ist, die Regression auslöst.
Dieses Beispiel zeigt eine der vielen Möglichkeiten, die Bulk-Trace-Analyse zu verwenden. Weitere Anwendungsfälle sind das Extrahieren von Statistiken aus dem Feld, um die Auswirkungen zu messen, Regressionen zu erkennen und vieles mehr.