تحليل التتبُّع المجمّع

بعد جمع عدة عمليات تتبُّع باستخدام ProfilingManager، يصبح من غير العملي استكشافها بشكل فردي للعثور على مشاكل الأداء. يتيح لك تحليل التتبُّع المجمّع الاستعلام عن مجموعة بيانات من عمليات التتبُّع في الوقت نفسه من أجل:

  • تحديد حالات تراجع الأداء الشائعة
  • احتساب التوزيعات الإحصائية (مثل وقت الاستجابة P50 وP90 وP99)
  • العثور على أنماط في عدة عمليات تتبُّع
  • العثور على عمليات تتبُّع القيم المتطرفة لفهم مشاكل الأداء وتصحيح الأخطاء

يوضّح هذا القسم كيفية استخدام أداة معالجة عمليات التتبُّع المجمّعة في Perfetto Python لتحليل مقاييس بدء التشغيل في مجموعة من عمليات التتبُّع المخزَّنة محليًا وتحديد عمليات التتبُّع الشاذة لإجراء تحليل أكثر تفصيلاً.

تصميم طلب البحث

تتمثّل الخطوة الأولى لإجراء تحليل مجمّع في إنشاء طلب بحث PerfettoSQL.

في هذا القسم، نعرض مثالاً على طلب بحث يقيس وقت استجابة بدء تشغيل التطبيق. على وجه التحديد، يمكنك قياس المدة من activityStart إلى أول إطار تم إنشاؤه (أول ظهور لشريحة Choreographer#doFrame) لقياس وقت استجابة بدء تشغيل التطبيق الذي يقع ضمن نطاق تحكّم تطبيقك. يعرض الشكل 1 القسم الذي سيتم البحث فيه.

عرض مخطط زمني لتتبُّع، مع إبراز المدة من حدث activityStart إلى حدث Choreographer#doFrame الأول
الشكل 1. تتبُّع القسم من `activityStart` إلى الإطار الأول الذي تم إنشاؤه
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)

يمكنك تنفيذ طلب البحث داخل واجهة مستخدم Perfetto، ثم استخدام نتائج طلب البحث لإنشاء مسار تصحيح الأخطاء (الشكل 2) وعرضه في المخطط الزمني (الشكل 3).

لقطة شاشة لواجهة مستخدم Perfetto توضّح كيفية إنشاء مسار تصحيح أخطاء لطلب بحث عند بدء التشغيل
الشكل 2. أنشِئ مسار تصحيح أخطاء لطلب بدء التشغيل.
عرض المخطط الزمني في واجهة مستخدم Perfetto يوضّح مسار تصحيح الأخطاء الذي تم إنشاؤه لطلب بحث عن بدء التشغيل.
الشكل 3. تم إنشاء مسار تصحيح أخطاء لطلب بدء التشغيل.

إعداد بيئة Python

ثبِّت Python على جهازك والمكتبات المطلوبة:

pip install perfetto pandas plotly

إنشاء نص برمجي لتحليل التتبُّع المجمّع

ينفّذ نموذج النص البرمجي التالي طلب البحث في عمليات تتبُّع متعدّدة باستخدام Python BatchTraceProcessor في Perfetto.

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

فهم النص البرمجي

عند تشغيل نص Python البرمجي، يتم تنفيذ الإجراءات التالية:

  1. يبحث النص البرمجي في الدليل المحلي عن جميع عمليات تتبُّع Perfetto التي تنتهي باللاحقة .perfetto-trace ويستخدمها كعمليات تتبُّع مصدرية للتحليل.
  2. ينفِّذ هذا الأمر طلب بحث مجمّعًا عن التتبُّع يحسب مجموعة فرعية من وقت بدء التشغيل الموافق للوقت من شريحة التتبُّع activityStart إلى اللقطة الأولى التي أنشأها تطبيقك.
  3. ويتم رسم وقت الاستجابة بالمللي ثانية باستخدام رسم بياني على شكل كمان لتصوّر توزيع أوقات بدء التشغيل.

تفسير النتائج

مخطط كمان يعرض توزيع أوقات الاستجابة عند بدء التشغيل التي تم الاستعلام عنها
الشكل 4. مخطّط بياني على شكل كمان لمدد الاستجابة عند بدء التشغيل التي تمّت الاستعلام عنها

بعد تنفيذ النص البرمجي، ينشئ النص البرمجي رسمًا بيانيًا. في هذه الحالة، يعرض الرسم البياني توزيعًا ثنائي المنوال مع قمتَين مختلفتَين (الشكل 4).

بعد ذلك، ابحث عن الفرق بين المجموعتين. يساعدك ذلك في فحص عمليات التتبُّع الفردية بتفصيل أكبر. في هذا المثال، تم إعداد الرسم البياني بحيث يمكنك تحديد أسماء ملفات التتبُّع عند تمرير مؤشر الماوس فوق نقاط البيانات (أوقات الاستجابة). يمكنك بعد ذلك فتح أحد عمليات التتبُّع التي تشكّل جزءًا من مجموعة عمليات التتبُّع ذات وقت الاستجابة الطويل.

عند فتح عملية تتبُّع من المجموعة ذات وقت الاستجابة الطويل (الشكل 5)، ستجد شريحة إضافية باسم MyFlaggedFeature تعمل أثناء بدء التشغيل (الشكل 6). في المقابل، يؤكّد اختيار تتبُّع من مجموعة البيانات ذات وقت الاستجابة الأقل (القمة الموجودة في أقصى اليمين) عدم توفّر شريحة البيانات نفسها (الشكل 7). تشير هذه المقارنة إلى أنّ علامة ميزة معيّنة، تم تفعيلها لمجموعة فرعية من المستخدمين، تؤدي إلى حدوث تراجع.

رسم بياني يوضّح عملية تتبُّع ذات وقت استجابة طويل
الشكل 5. نقطة بيانات ذات وقت استجابة مرتفع في رسم بياني على شكل كمان
تتبُّع يوضّح وقت بدء التشغيل الطويل بسبب شريحة MyFlaggedFeature
الشكل 6. بدء تتبُّع وقت الاستجابة الطويل باستخدام شريحة إضافية باسم MyFlaggedFeature
تتبُّع يوضّح بدء التشغيل بوقت استجابة منخفض بدون شريحة MyFlaggedFeature
الشكل 7. بدء تتبُّع وقت الاستجابة المنخفض

يوضّح هذا المثال إحدى الطرق العديدة التي يمكنك استخدامها في تحليل عمليات التتبُّع المجمّعة. تشمل حالات الاستخدام الأخرى استخراج الإحصاءات من الحقل لقياس التأثير، ورصد حالات التراجع، وغير ذلك.