İzleri toplu olarak analiz etme

ProfilingManager kullanarak birden fazla izleme topladıktan sonra performans sorunlarını bulmak için bunları tek tek incelemek pratik olmaz. Toplu iz analizi, aşağıdaki işlemleri yapmak için bir iz veri kümesini aynı anda sorgulamanıza olanak tanır:

  • Yaygın performans gerilemelerini belirleme
  • İstatistiksel dağılımları (ör. P50, P90, P99 gecikmesi) hesaplama
  • Birden fazla izdeki kalıpları bulma
  • Performans sorunlarını anlamak ve hata ayıklamak için aykırı izleri bulun.

Bu bölümde, yerel olarak depolanan bir dizi izdeki başlangıç metriklerini analiz etmek ve daha ayrıntılı analiz için aykırı izleri bulmak üzere Perfetto Python Batch Trace Processor'ın nasıl kullanılacağı gösterilmektedir.

Sorguyu tasarlama

Öncelikle, karşılaştırmak istediğiniz metriği çıkaran bir PerfettoSQL sorgusu oluşturun. Aşağıdaki örnekte, Şekil 1'de gösterildiği gibi activityStart ile ilk oluşturulan kare (Choreographer#doFrame) arasındaki uygulama kontrollü başlatma gecikmesi ölçülmektedir.

activityStart etkinliğinden ilk Choreographer#doFrame etkinliğine kadar olan süreyi vurgulayan bir izin zaman çizelgesi görünümü.
Şekil 1. activityStart ile oluşturulan ilk kare arasındaki izleme bölümü.
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)

Sorguyu Perfetto kullanıcı arayüzünde çalıştırabilir, ardından sorgu sonuçlarını kullanarak bir hata ayıklama kanalı oluşturabilir (Şekil 2) ve bunu zaman çizelgesinde görselleştirebilirsiniz (Şekil 3).

Başlangıç sorgusu için hata ayıklama izinin nasıl oluşturulacağını gösteren Perfetto kullanıcı arayüzü sorgu sonuçları paneli.
Şekil 2. Başlangıç sorgusu için hata ayıklama kanalı oluşturma
Perfetto kullanıcı arayüzünde, başlangıç sorgusu için oluşturulan hata ayıklama izini gösteren zaman çizelgesi görünümü.
Şekil 3. Başlangıç sorgusu için hata ayıklama izi oluşturuldu.

Python ortamını ayarlama

Yerel makinenize Python'u ve gerekli kitaplıklarını yükleyin:

pip install perfetto pandas plotly

Toplu iz analizi komut dosyasını oluşturma

Aşağıdaki örnek komut dosyası, Perfetto'nun Python BatchTraceProcessor aracını kullanarak sorguyu birden fazla izlemede yürütür.

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()

Komut dosyasını anlama

Python komut dosyasını çalıştırdığınızda aşağıdaki işlemler gerçekleştirilir:

  1. Komut dosyası, yerel dizininizde .perfetto-trace son ekine sahip tüm Perfetto izlerini arar ve bunları analiz için kaynak izler olarak kullanır.
  2. activityStart izleme diliminden uygulamanız tarafından oluşturulan ilk kareye kadar geçen süreye karşılık gelen başlatma süresinin alt kümesini hesaplayan bir toplu izleme sorgusu çalıştırır.
  3. Başlatma sürelerinin dağılımını görselleştirmek için keman grafiği kullanarak gecikmeyi milisaniye cinsinden gösterir.

Sonuçları yorumlama

Sorgulanan başlangıç gecikmelerinin dağılımını gösteren bir keman grafiği.
Şekil 4. Sorgulanan başlatma gecikmelerinin keman grafiği.

Komut dosyası çalıştırıldığında, iki farklı gecikme zirvesi olan çift modlu bir dağılım gösteren bir keman grafiği oluşturulur (Şekil 4). _path dosya adını incelemek ve her bir zirvedeki izleri karşılaştırmak için grafikteki veri noktalarının üzerine gelin (Şekil 5):

  • Yüksek gecikmeli izler (sağ tepe): Perfetto kullanıcı arayüzünde bu gruptan bir iz açıldığında, başlatma sırasında çalışan fazladan bir MyFlaggedFeature dilimi gösterilir (Şekil 6).
  • Düşük gecikmeli izler (sol tepe): Daha hızlı gruptan bir iz açıldığında MyFlaggedFeature'nin olmadığı doğrulanır (Şekil 7). Bu durum, kullanıcıların bir alt kümesi için etkinleştirilen özellik bayrağının başlangıç gerilemesine neden olduğunu gösterir.
Yüksek gecikme izinin vurgulandığı bir grafik.
Şekil 5. Keman grafiğindeki yüksek gecikmeli veri noktası.
MyFlaggedFeature dilimi nedeniyle yüksek gecikmeli başlatmayı vurgulayan bir iz.
Şekil 6. Ek MyFlaggedFeature dilimiyle yüksek gecikmeli izleme başlatma.
MyFlaggedFeature dilimi olmadan düşük gecikmeli başlatmayı vurgulayan bir iz.
Şekil 7. Düşük gecikmeli izleme başlatma.

Bu örnek, toplu izleme analizini kullanabileceğiniz birçok yöntemden birini gösterir. Diğer kullanım alanları arasında, etkiyi ölçmek için sahadan istatistikleri ayıklama, gerilemeleri tespit etme ve daha fazlası yer alır.