Toplu izleme analizi

ProfilingManager kullanarak birden fazla izleme topladıktan sonra performans sorunlarını bulmak için bunları tek tek incelemek pratik olmaz. Toplu iz analizi, iz veri kümesini aynı anda sorgulayarak şunları yapmanı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 bulma

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 Toplu İzleme İşlemcisi'nin nasıl kullanılacağı gösterilmektedir.

Sorguyu tasarlama

Toplu analiz yapmanın ilk adımı, PerfettoSQL sorgusu oluşturmaktır.

Bu bölümde, uygulama başlatma gecikmesini ölçen örnek bir sorgu sunuyoruz. Özellikle, uygulamanızın kontrolündeki uygulama başlatma gecikmesini ölçmek için activityStart ile oluşturulan ilk kare (Choreographer#doFrame diliminin ilk örneği) arasındaki süreyi ölçebilirsiniz. Şekil 1'de sorgulanacak bölüm gösterilmektedir.

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 yürütebilir, ardından sorgu sonuçlarını kullanarak hata ayıklama izi 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ünün ekran görüntüsü.
Şekil 2. Başlangıç sorgusu için hata ayıklama kanalı oluşturma
Perfetto kullanıcı arayüzündeki zaman çizelgesi görünümünde, başlangıç sorgusu için oluşturulan hata ayıklama izi gösteriliyor.
Şekil 3. Başlangıç sorgusu için hata ayıklama izi oluşturuldu.

Python ortamını ayarlama

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

pip install perfetto pandas plotly

Toplu iz analizi komut dosyasını oluşturma

Aşağıdaki örnek komut dosyası, Perfetto'nun Python BatchTraceProcessor modülü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şlangıç gecikmelerinin keman grafiği.

Komut dosyasını çalıştırdıktan sonra komut dosyası bir grafik oluşturur. Bu durumda, grafikte iki farklı zirveye sahip çift modlu bir dağılım gösterilir (Şekil 4).

Ardından, iki popülasyon arasındaki farkı bulun. Bu sayede, her bir izi daha ayrıntılı bir şekilde inceleyebilirsiniz. Bu örnekte, grafik, veri noktalarının (gecikmeler) üzerine geldiğinizde izleme dosyası adlarını tanımlayabileceğiniz şekilde ayarlanmıştır. Ardından, yüksek gecikme grubunun parçası olan izlerden birini açabilirsiniz.

Yüksek gecikme grubundan bir iz açtığınızda (Şekil 5), başlangıç sırasında çalışan MyFlaggedFeature adlı ek bir dilim görürsünüz (Şekil 6). Buna karşılık, daha düşük gecikme süreli popülasyondan (en soldaki tepe noktası) bir iz seçildiğinde aynı dilimin olmadığı doğrulanır (Şekil 7). Bu karşılaştırma, kullanıcıların bir alt kümesi için etkinleştirilen belirli bir özellik bayrağının gerilemeyi tetiklediğini gösterir.

Yüksek gecikme izinin vurgulandığı bir grafik.
Şekil 5. Keman grafiğinde yüksek gecikmeli veri noktası.
MyFlaggedFeature dilimi nedeniyle yüksek gecikmeli başlatmayı vurgulayan bir iz.
Şekil 6. Yüksek gecikmeli izleme başlatma, ek bir `MyFlaggedFeature` dilimiyle gösterilir.
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.