Menganalisis rekaman aktivitas secara massal

Setelah Anda mengumpulkan beberapa rekaman aktivitas menggunakan ProfilingManager, menjelajahinya satu per satu untuk menemukan masalah performa menjadi tidak praktis. Analisis trace massal memungkinkan Anda mengkueri set data trace secara bersamaan untuk:

  • Mengidentifikasi regresi performa umum.
  • Menghitung distribusi statistik (misalnya, latensi P50, P90, P99).
  • Menemukan pola di beberapa trace.
  • Menemukan trace pencilan untuk memahami dan men-debug masalah performa.

Bagian ini menunjukkan cara menggunakan Perfetto Python Batch Trace Processor untuk menganalisis metrik startup di seluruh kumpulan rekaman aktivitas yang disimpan secara lokal dan menemukan rekaman aktivitas pencilan untuk analisis yang lebih mendalam.

Mendesain kueri

Pertama, buat kueri PerfettoSQL yang mengekstrak metrik yang ingin Anda bandingkan. Contoh berikut mengukur latensi startup yang dikontrol aplikasi dari activityStart hingga frame pertama yang dirender (Choreographer#doFrame), seperti yang ditunjukkan pada Gambar 1.

Tampilan linimasa rekaman aktivitas, yang menandai durasi dari peristiwa activityStart hingga peristiwa Choreographer#doFrame pertama.
Gambar 1. Bagian rekaman aktivitas dari activityStart hingga frame pertama yang dihasilkan.
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)

Anda dapat menjalankan kueri dalam UI Perfetto, lalu menggunakan hasil kueri untuk membuat jalur debug (Gambar 2) dan memvisualisasikannya dalam linimasa (Gambar 3).

Panel hasil kueri UI Perfetto yang menunjukkan cara membuat jalur debug untuk kueri startup.
Gambar 2. Membuat jalur debug untuk kueri startup.
Tampilan linimasa di UI Perfetto yang menampilkan trek debug yang dihasilkan untuk kueri startup.
Gambar 3. Rekaman aktivitas debug yang dihasilkan untuk kueri startup.

Menyiapkan lingkungan Python

Instal Python di komputer lokal Anda dan library yang diperlukan:

pip install perfetto pandas plotly

Membuat skrip analisis rekaman aktivitas massal

Contoh skrip berikut menjalankan kueri dalam beberapa rekaman aktivitas menggunakan BatchTraceProcessor Python 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()

Memahami skrip

Saat Anda menjalankan skrip Python, skrip tersebut akan melakukan tindakan berikut:

  1. Skrip ini menelusuri semua rekaman aktivitas Perfetto yang diakhiri dengan .perfetto-trace di direktori lokal Anda dan menggunakannya sebagai rekaman aktivitas sumber untuk analisis.
  2. Alat ini menjalankan kueri rekaman aktivitas massal yang menghitung subset waktu startup yang sesuai dengan waktu dari slice rekaman aktivitas activityStart hingga frame pertama yang dihasilkan oleh aplikasi Anda.
  3. Fungsi ini memetakan latensi dalam milidetik menggunakan plot violin untuk memvisualisasikan distribusi waktu startup.

Menafsirkan hasilnya

Plot violin yang menunjukkan distribusi latensi startup yang dikueri.
Gambar 4. Plot violin latensi startup yang dikueri.

Menjalankan skrip akan menghasilkan plot violin yang menunjukkan distribusi bimodal dengan dua puncak latensi yang berbeda (Gambar 4). Arahkan kursor ke setiap titik data dalam plot untuk memeriksa nama file _path dan membandingkan rekaman aktivitas dari setiap puncak (Gambar 5):

  • Rekaman aktivitas latensi tinggi (puncak kanan): Membuka rekaman aktivitas dari grup ini di UI Perfetto akan menampilkan slice MyFlaggedFeature tambahan yang berjalan selama startup (Gambar 6).
  • Trace latensi rendah (puncak kiri): Membuka trace dari grup yang lebih cepat mengonfirmasi bahwa MyFlaggedFeature tidak ada (Gambar 7), yang menunjukkan bahwa tombol fitur yang diaktifkan untuk sebagian pengguna menyebabkan regresi startup.
Plot yang menandai trace latensi tinggi.
Gambar 5. Titik data latensi tinggi dalam plot violin.
Trace yang menyoroti startup latensi tinggi karena slice MyFlaggedFeature.
Gambar 6. Startup trace latensi tinggi dengan slice MyFlaggedFeature tambahan.
Trace yang menyoroti startup latensi rendah tanpa slice MyFlaggedFeature.
Gambar 7. Startup pelacakan latensi rendah.

Contoh ini menunjukkan salah satu dari banyak cara menggunakan analisis trace massal. Kasus penggunaan lainnya mencakup mengekstrak statistik dari lapangan untuk mengukur dampak, mendeteksi regresi, dan lainnya.