Una vez que recopilas varios registros con ProfilingManager, explorarlos de forma individual para encontrar problemas de rendimiento se vuelve poco práctico. El análisis de registros masivos te permite consultar un conjunto de datos de registros de forma simultánea para hacer lo siguiente:
- Identificar regresiones de rendimiento comunes
- Calcular distribuciones estadísticas (por ejemplo, latencia P50, P90 y P99)
- Encontrar patrones en varios registros
- Encontrar registros atípicos para comprender y depurar problemas de rendimiento
En esta sección, se muestra cómo usar el procesador de registros por lotes de Perfetto en Python para analizar las métricas de inicio en un conjunto de registros almacenados de forma local y ubicar los registros atípicos para un análisis más profundo.
Diseña la consulta
El primer paso para realizar un análisis masivo es crear una consulta de PerfettoSQL.
En esta sección, presentamos una consulta de ejemplo que mide la latencia de inicio de la app.
En particular, puedes medir la duración desde activityStart hasta el primer fotograma generado (la primera aparición del segmento Choreographer#doFrame) para medir la latencia de inicio de la app que está dentro del control de tu app. En la Figura 1, se muestra la sección para consultar.
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)
Puedes ejecutar la consulta en la IU de Perfetto y, luego, usar los resultados de la consulta para generar una pista de depuración (Figura 2) y visualizarla en la línea de tiempo (Figura 3).
Configura el entorno de Python
Instala Python en tu máquina local y sus bibliotecas requeridas:
pip install perfetto pandas plotly
Crea la secuencia de comandos de análisis de registros masivos
La siguiente secuencia de comandos de ejemplo ejecuta la consulta en varios registros con
Perfetto de Python 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()
Información sobre la secuencia de comandos
Cuando ejecutas la secuencia de comandos de Python, se realizan las siguientes acciones:
- La secuencia de comandos busca en tu directorio local todos los registros de Perfetto con el sufijo
.perfetto-tracey los usa como registros de origen para el análisis. - Ejecuta una consulta de registros masivos que calcula el subconjunto de tiempo de inicio correspondiente al tiempo desde el segmento de registro
activityStarthasta el primer fotograma generado por tu app. - Traza la latencia en milisegundos con un diagrama de violín para visualizar la distribución de los tiempos de inicio.
Interpretar los resultados
Después de ejecutar la secuencia de comandos, se genera un diagrama. En este caso, el diagrama muestra una distribución bimodal con dos picos distintos (Figura 4).
A continuación, busca la diferencia entre las dos poblaciones. Esto te ayuda a examinar los registros individuales con más detalle. En este ejemplo, el diagrama está configurado de modo que, cuando colocas el cursor sobre los puntos de datos (latencias), puedes identificar los nombres de los archivos de registro. Luego, puedes abrir uno de los registros que forman parte del grupo de latencia alta.
Cuando abras un registro del grupo de latencia alta (Figura 5), encontrarás un segmento adicional llamado MyFlaggedFeature que se ejecuta durante el inicio (Figura 6).
Por el contrario, seleccionar un registro de la población de latencia más baja (el pico más a la izquierda) confirma la ausencia de ese mismo segmento (Figura 7). Esta comparación indica que un indicador de función específico, habilitado para un subconjunto de usuarios, activa la regresión.
En este ejemplo, se muestra una de las muchas formas en que puedes usar el análisis de registros masivos. Otros casos de uso incluyen la extracción de estadísticas del campo para evaluar el impacto, la detección de regresiones y mucho más.