Perfetto - تتبع وتحليل النظام على مستوى النظام (Cheatsheet)
Perfetto هي مكدس التتبع والتنميط الموثوق من Google مفتوح المصدر لـ Linux و Android و Chrome. تحتسب المسارات على مستوى النظام — جدولة CPU، syscalls، تغييرات التردد، أحداث الذاكرة، وأحداث التطبيق المخصصة — في تنسيق protobuf مضغوط، ثم دع استكشافها في واجهة ويب متطورة أو، بشكل فريد، استعلم عنها مع SQL. حيث تقوم perf بأخذ عينات من المكدسات، يسجل Perfetto جدول زمني لما كان كل خيط و CPU يفعله، وهذا ما تحتاجه لمشاكل الكمون والتزامن.
التثبيت
| المكون | كيف |
|---|
| واجهة المستخدم (بدون تثبيت) | افتح ui.perfetto.dev في متصفح |
| أدوات CLI | تحميل tracebox/perfetto من GitHub Releases |
| Android | مدمج (adb shell perfetto ...) |
| trace_processor | تحميل للتحليل المحلي SQL |
| التحقق | ./tracebox --help |
احسب مسار (Linux)
# تتبع بسيط لـ 10 ثواني على مستوى النظام مع بيانات جدولة ftrace
./tracebox -o trace.pftrace --txt -c - <<EOF
buffers: { size_kb: 65536 }
data_sources: {
config {
name: "linux.ftrace"
ftrace_config {
ftrace_events: "sched/sched_switch"
ftrace_events: "sched/sched_wakeup"
ftrace_events: "power/cpu_frequency"
}
}
}
duration_ms: 10000
EOF
| العنصر | الغرض |
|---|
buffers | حجم مخزن الحلقة لبيانات المسار |
data_sources | ما الذي يجب تسجيله (ftrace، procstats، heapprofd، …) |
ftrace_events | نقاط توقف kernel محددة |
duration_ms | طول الالتقاط |
-o | ملف المسار الناتج |
مصادر البيانات الشائعة
| المصدر | السجلات |
|---|
linux.ftrace | الجدولة، syscalls، IRQs، نقاط توقف مخصصة |
linux.process_stats | CPU/memory لكل عملية على مدى الوقت |
linux.sys_stats | عدادات على مستوى النظام (meminfo، vmstat) |
android.heapprofd | تنميط heap الأصلي |
android.java_hprof | حفرة heap Java |
track_event | أحداث مصدرة من قبل التطبيق/العدادات |
مسار سير العمل في الواجهة
| الخطوة | الإجراء |
|---|
| 1 | افتح ui.perfetto.dev و drag في المسار |
| 2 | الجدول الزمني يعرض CPUs، خيوط، ومسارات |
| 3 | W/S zoom, A/D pan |
| 4 | انقر على شريحة لترى مدتها و args |
| 5 | حدد نطاق → ملخص ما بدأ |
| 6 | استخدم صندوق الاستعلام لتحليل SQL |
تحليل SQL (القوة الخارقة)
يكشف معالج المسار للمسار عن المسار كجداول قابلة للاستعلام.
-- أطول تشغيل الشرائح
SELECT name, dur/1e6 AS ms
FROM slice
ORDER BY dur DESC
LIMIT 20;
-- وقت CPU لكل عملية
SELECT p.name, SUM(s.dur)/1e6 AS cpu_ms
FROM sched s JOIN thread t USING(utid) JOIN process p USING(upid)
GROUP BY p.name ORDER BY cpu_ms DESC;
-- لماذا تم حجب الخيط؟
SELECT ts, dur, state
FROM thread_state
WHERE utid = 42 AND state != 'Running'
ORDER BY dur DESC;
| الجدول | يحتوي على |
|---|
slice | أحداث المدة المسماة والمتداخلة |
sched | شرائح الجدولة لكل CPU |
thread_state | فترات التشغيل/النوم/الحجب |
counter | سلاسل زمنية رقمية (freq، memory) |
process, thread | البيانات الوصفية للعملية/الخيط |
التحليل المحلي
# قذيفة SQL تفاعلية على المسار
./trace_processor trace.pftrace
# شغّل استعلاماً وانبعث JSON للبرمجة النصية
./trace_processor -q query.sql --query-output json trace.pftrace
ما Perfetto الأفضل في
| مشكلة | لماذا يساعد Perfetto |
|---|
| نقاط زمن الانتظار | انظر بالضبط ما الذي جرى/حجب في تلك اللحظة |
| تنافس الأقفال | thread_state يعرض الفترات الموجودة والأسباب |
| الهجرة/الجدولة | جدول زمني لكل CPU من كل خيط |
| التأثيرات الترددية/الحرارية | الارتباط بين عدادات cpufreq والتباطؤ |
| ارتباط التطبيق + kernel | امتدادات التطبيق على نفس الجدول الزمني مثل أحداث kernel |
Perfetto مقابل الأدوات ذات الصلة
| الجانب | Perfetto | perf | bpftrace |
|---|
| النموذج | جدول زمني كامل | محلل أخذ عينات | فحوصات eBPF خاصة |
| التحليل | واجهة المستخدم + SQL | التقارير/flame graphs | السكريبتات المخصصة |
| الأفضل لـ | الكمون/التزامن/الجدول الزمني | نقاط CPU الساخنة | أسئلة kernel الموجهة |
| الحمل الزائد | معتدل (قابل للتكوين) | منخفض | منخفض |
يكمل perf (نقاط CPU الساخنة) و bpftrace (فحوصات موجهة)؛ Perfetto يجيب “ماذا حدث متى.”
الموارد