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