بعد جمع عمليات تتبُّع متعدّدة باستخدام ProfilingManager، يصبح من غير العملي استكشافها بشكل فردي للعثور على مشاكل الأداء. يتيح لك تحليل التتبُّع المجمّع الاستعلام عن مجموعة بيانات من عمليات التتبُّع في الوقت نفسه من أجل:
- تحديد حالات تراجع الأداء الشائعة
- احتساب التوزيعات الإحصائية (مثل وقت الاستجابة P50 وP90 وP99)
- العثور على أنماط في عدة عمليات تتبُّع
- ابحث عن عمليات التتبُّع الشاذة لفهم مشاكل الأداء وتصحيح الأخطاء.
يوضّح هذا القسم كيفية استخدام أداة معالجة عمليات التتبُّع المجمّعة في Perfetto Python لتحليل مقاييس بدء التشغيل في مجموعة من عمليات التتبُّع المخزَّنة محليًا وتحديد عمليات التتبُّع الشاذة لإجراء تحليل أكثر تفصيلاً.
تصميم طلب البحث
تتمثّل الخطوة الأولى لإجراء تحليل مجمّع في إنشاء طلب بحث PerfettoSQL.
في هذا القسم، نعرض مثالاً على طلب بحث يقيس وقت استجابة بدء تشغيل التطبيق.
على وجه التحديد، يمكنك قياس المدة من activityStart إلى أول إطار تم إنشاؤه (أول ظهور لشريحة Choreographer#doFrame) لقياس وقت استجابة بدء تشغيل التطبيق الذي يقع ضمن نطاق تحكّم تطبيقك. يوضّح الشكل 1 القسم الذي سيتم البحث فيه.
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).
إعداد بيئة Python
ثبِّت Python على جهازك والمكتبات المطلوبة:
pip install perfetto pandas plotly
إنشاء نص برمجي لتحليل التتبُّع المجمّع
ينفّذ النص البرمجي النموذجي التالي طلب البحث في عمليات تتبُّع متعددة باستخدام Python BatchTraceProcessor في 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()
فهم النص البرمجي
عند تشغيل نص Python البرمجي، يتم تنفيذ الإجراءات التالية:
- يبحث النص البرمجي في الدليل المحلي عن جميع عمليات تتبُّع Perfetto التي تنتهي باللاحقة
.perfetto-traceويستخدمها كعمليات تتبُّع مصدرية للتحليل. - ينفِّذ هذا الأمر طلب بحث مجمّعًا عن التتبُّع يحسب مجموعة فرعية من وقت بدء التشغيل
الموافق للوقت من شريحة التتبُّع
activityStartإلى اللقطة الأولى التي أنشأها تطبيقك. - ويعرض هذا المقياس وقت الاستجابة بالمللي ثانية باستخدام رسم بياني على شكل كمان لتصوّر توزيع أوقات بدء التشغيل.
تفسير النتائج
بعد تنفيذ النص البرمجي، ينشئ النص البرمجي رسمًا بيانيًا. في هذه الحالة، يعرض الرسم البياني توزيعًا ثنائي المنوال مع قمتَين مختلفتَين (الشكل 4).
بعد ذلك، ابحث عن الفرق بين المجموعتين. يساعدك ذلك في فحص عمليات التتبُّع الفردية بتفصيل أكبر. في هذا المثال، تم إعداد الرسم البياني بحيث يمكنك تحديد أسماء ملفات التتبُّع عند تمرير مؤشر الماوس فوق نقاط البيانات (المدد الزمنية). يمكنك بعد ذلك فتح أحد عمليات التتبُّع التي تشكّل جزءًا من مجموعة عمليات التتبُّع ذات وقت الاستجابة الطويل.
عند فتح عملية تتبُّع من المجموعة ذات وقت الاستجابة الطويل (الشكل 5)، ستجد شريحة إضافية باسم MyFlaggedFeature تعمل أثناء بدء التشغيل (الشكل 6).
في المقابل، يؤكّد اختيار تتبُّع من مجموعة البيانات ذات وقت الاستجابة الأقل (القمة الموجودة في أقصى اليمين) عدم توفّر شريحة البيانات نفسها (الشكل 7). تشير هذه المقارنة إلى أنّ علامة ميزة معيّنة، تم تفعيلها لمجموعة فرعية من المستخدمين، تؤدي إلى حدوث تراجع.
يوضّح هذا المثال إحدى الطرق العديدة التي يمكنك استخدامها لتحليل عمليات التتبُّع المجمّعة. تشمل حالات الاستخدام الأخرى استخراج الإحصاءات من الحقل لقياس التأثير، ورصد حالات التراجع، وغير ذلك.