Toplu izleme analizi

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

  • Yaygın performans gerilemelerini belirleyin.
  • İstatistiksel dağılımları (örneğin, P50, P90, P99 gecikmesi) hesaplayın.
  • Birkaç izleme arasında kalıplar bulma
  • Performans sorunlarını anlamak ve hatalarını 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

Toplu analiz yapmak için ilk adım, PerfettoSQL sorgusu oluşturmaktır.

Bu bölümde, uygulamanın başlatılma gecikmesini ölçen bir örnek sorgu sunuyoruz. Özellikle, uygulamanızın kontrolü dahilinde olan uygulama başlangıç gecikmesini ölçmek için activityStart ile oluşturulan ilk kare arasındaki süreyi (Choreographer#doFrame diliminin ilk oluşumu) ölçebilirsiniz. 1. şekilde, sorgulanacak bölüm gösterilmektedir.

Bir izlemenin zaman çizelgesi görünümü. Bu görünümde, activityStart etkinliğinden ilk Choreographer#doFrame etkinliğine kadar geçen süre vurgulanır.
Şekil 1. Bölümü, "activityStart"tan oluşturulan ilk kareye kadar izleyin.
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 bir 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şturun.
Perfetto kullanıcı arayüzünde, bir başlangıç sorgusu için oluşturulan hata ayıklama izinin gösterildiği 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'ı ve gerekli kitaplıklarını yükleyin:

pip install perfetto pandas plotly

Toplu izleme analizi komut dosyasını oluşturma

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

from perfetto.batch_trace_processor import BatchTraceProcessor
import glob
import plotly.express as px

traces = glob.glob('*.perfetto-trace')

if __name__ == '__main__':
    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)

        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 ile biten tüm Perfetto izlerini arar ve bunları analiz için kaynak izler olarak kullanır.
  2. Bu işlev, başlangıç süresinin alt kümesini hesaplayan toplu bir izleme sorgusu çalıştırır. Bu alt küme, activityStart izleme diliminden uygulamanız tarafından oluşturulan ilk kareye kadar geçen süreye karşılık gelir.
  3. Başlangıç sürelerinin dağılımını görselleştirmek için keman grafiği kullanarak gecikmeyi milisaniye cinsinden çizer.

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ı yürüttükten sonra bir grafik oluşturulur. Bu durumda, grafikte iki farklı zirveye sahip iki modlu bir dağılım gösterilir (Şekil 4).

Ardından, iki popülasyon arasındaki farkı bulun. Bu sayede tek tek izleri daha ayrıntılı bir şekilde inceleyebilirsiniz. Bu örnekte, imleçle veri noktalarının (gecikmeler) üzerine geldiğinizde izleme dosyalarını tanımlayabilmeniz için grafik ayarlanmıştır. Ardından, yüksek gecikme süresi grubunun parçası olan izlerden birini açabilirsiniz.

Yüksek gecikme süreli gruptan bir izleme açtığınızda (Şekil 5), başlatma sırasında çalışan MyFlaggedFeature adlı ek bir dilim görürsünüz (Şekil 6). Buna karşılık, daha düşük gecikmeli popülasyondan (en soldaki tepe) bir iz seçmek aynı dilimin olmadığını doğrular (Şekil 7). Bu karşılaştırma, bir kullanıcı alt kümesi için etkinleştirilen belirli bir özellik işaretinin regresyona 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 izleme.
Şekil 6. Ek bir "MyFlaggedFeature" dilimiyle yüksek gecikmeli izleme başlatma.
MyFlaggedFeature dilimi olmadan düşük gecikmeli başlatmayı vurgulayan bir izleme.
Şekil 7. Düşük gecikmeli izleme başlatma.

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