Analisis rekaman aktivitas 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

Langkah pertama untuk melakukan analisis massal adalah membuat kueri PerfettoSQL.

Di bagian ini, kami menyajikan contoh kueri yang mengukur latensi startup aplikasi. Secara khusus, Anda dapat mengukur durasi dari activityStart hingga frame pertama yang dihasilkan (kemunculan pertama slice Choreographer#doFrame) untuk mengukur latensi startup aplikasi yang berada dalam kontrol aplikasi Anda. Gambar 1 menunjukkan bagian yang akan dikueri.

Tampilan linimasa rekaman aktivitas, yang menyoroti 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).

Screenshot 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 dari latensi startup yang dikueri.

Setelah Anda menjalankan skrip, skrip akan menghasilkan plot. Dalam hal ini, plot menunjukkan distribusi bimodal dengan dua puncak yang berbeda (Gambar 4).

Selanjutnya, cari perbedaan antara kedua populasi tersebut. Hal ini membantu Anda memeriksa trace individual secara lebih mendetail. Dalam contoh ini, plot disiapkan sehingga saat mengarahkan kursor ke titik data (latensi), Anda dapat mengidentifikasi nama file rekaman aktivitas. Kemudian, Anda dapat membuka salah satu trace yang merupakan bagian dari grup latensi tinggi.

Saat membuka rekaman aktivitas dari grup latensi tinggi (Gambar 5), Anda akan menemukan slice tambahan bernama MyFlaggedFeature yang berjalan selama startup (Gambar 6). Sebaliknya, memilih trace dari populasi latensi yang lebih rendah (puncak paling kiri) mengonfirmasi tidak adanya slice yang sama (Gambar 7). Perbandingan ini menunjukkan bahwa tombol fitur tertentu, yang diaktifkan untuk sebagian pengguna, memicu regresi.

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 pelacakan 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.