تستخدم الأجهزة التي يتم طرحها على Android 12 والإصدارات الأحدث mm_events، وهي مجموعة من الإحصاءات المتعلقة بالذاكرة والتي يتم تسجيلها بشكل دوري عندما يواجه النظام ضغطًا على الذاكرة. تم دمج mm_events مع آليات تتبُّع perfetto، ولا يتم تفعيلها إلا عند رصد ضغط على الذاكرة، لذا يكون تأثيرها على الأداء ضئيلاً. يبدأ
جمع الإحصاءات عند تفعيل آليات kswapd أو direct reclaim, أو
compaction في النواة، وتظل مفعّلة لفترة زمنية قابلة للضبط
لتسجيل الإحصاءات على فترات منتظمة.
بدلاً من تقديم لقطة لمرة واحدة لحالة ذاكرة النظام عند إرسال تقرير عن الخطأ، يعرض mm_events عرضًا موجزًا للبيانات السابقة لإحصاءات الذاكرة خلال فترات الضغط على الذاكرة. الإحصاءات التي تم تسجيلها مُدرَجة في الجداول التالية.
حقول vmstat
nr_free_pages | nr_slab_reclaimable |
nr_slab_unreclaimable | nr_active_file |
nr_inactive_file | nr_active_anon |
nr_inactive_anon | workingset_refault |
workingset_activate | nr_file_pages |
pgpgin | pgpgout |
pswpin | pswpout |
pgsteal_kswapd_dma | pgsteal_kswapd_normal |
pgsteal_kswapd_movable | pgsteal_direct_dma |
pgsteal_direct_normal | pgsteal_direct_movable |
pgscan_kswapd_dma | pgscan_kswapd_normal |
pgscan_kswapd_movable | pgscan_direct_dma |
pgscan_direct_normal | pgscan_direct_movable |
compact_migrate_scanned | compact_free_scanned |
أحداث التتبُّع ذات الصلة بإدارة الذاكرة
vmscan/mm_vmscan_kswapd_wake | vmscan/mm_vmscan_kswapd_sleep |
vmscan/mm_vmscan_direct_reclaim_begin | vmscan/mm_vmscan_direct_reclaim_end |
compaction/mm_compaction_begin | compaction/mm_compaction_end |
تحليل بيانات mm_events
إذا كانت ميزة mm_events مفعّلة، تقدّم تقارير الأخطاء للأحداث التي يتم تسجيلها بعد فترة قصيرة من بدء تعرّض الجهاز لضغط كبير على الذاكرة الإحصاءات السابقة لـ mm_events، وذلك في شكل تقرير مضغوط في
FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
يمكن عرض بيانات vmstat وأحداث ftrace لتحليلها باستخدام
واجهة مستخدم Perfetto.
بيانات vmstat
حمِّل ملف systrace.pftrace إلى واجهة مستخدم Perfetto للاطّلاع على بيانات vmstat مرسومة على مخطّط زمني كما هو موضّح في الشكل 1:
الشكل 1: المخطّط الزمني للبيانات الرسومية في vmstat
أحداث ftrace
لا يتم عرض أحداث ftrace mm_events التي تم تسجيلها بشكل رسومي على المخطّط الزمني. للاطّلاع عليها، انقر على علامة التبويب طلب بحث SQL، كما هو موضّح في الشكل 2:
الشكل 2: انقر على "طلب بحث (SQL)" للوصول.
تفعيل mm_events
لتفعيل mm_events، اضبط sysprop persist.mm_events.enabled=true من init.rc الخاص بمورّد الجهاز.
تم اتخاذ الإجراءات التالية للتخفيف من تأثير mm_events على الذاكرة ووحدة المعالجة المركزية:
- يستخدم مثيل
mm-events ftraceمخزنًا مؤقتًا بحجم 4 كيلوبايت لكل وحدة معالجة مركزية. - يتم تحديد معدّل تكرار مشغّل
kmem_activityمرة واحدة في الدقيقة. - يمكن أن تكون جلسة تتبُّع
mm-eventsواحدة فقط نشطة في أي وقت.
التخصيص
يستخدم mm_events ملف إعداد تتبُّع perfetto لتحديد الإحصاءات التي يجب تسجيلها أثناء جلسة التتبُّع.
يمكنك تقديم إعداد تتبُّع Perfetto مخصّص في /vendor/etc/mm_events.cfg.
للحصول على وصف لحقول إعدادات التتبُّع المتاحة، يُرجى الاطّلاع على مستندات Perfetto
Docs.
للاطّلاع على نموذج لإعدادات التتبُّع، يُرجى مراجعة مثال
mm_events.cfg
هذا.
الحقول المهمة التي يجب تضمينها في إعدادات التتبُّع لضمان تفعيلها عند حدوث ضغط على الذاكرة موضّحة في المقتطف التالي:
# Ensures only 1 tracing session with this key can be active
unique_session_name: "perfetto_mm_events_session"
# If a trace with bugreport_score > 0 is running,
# the captured data is made available in the zipped bugreport
# at FS/data/misc/perfetto-traces/bugreport/systrace.pftrace
bugreport_score: 100
trigger_config {
trigger_mode: START_TRACING
trigger_timeout_ms: 3600000 # 1 hour
triggers {
# kmem_activity trigger gets activated when memory pressure
# is detected
name: "kmem_activity"
stop_delay_ms: 360000 # 6 mins
}
}
في هذا الإعداد، يبدأ mm_events مشغّل kmem_activity في perfetto وتبدأ جلسة تتبُّع Perfetto في تسجيل أحداث الذاكرة vm_stats وftrace حتى نهاية فترة stop_delay_ms التي تم ضبطها، وهي 36000 ملي ثانية (6 دقائق).
تم ضبط مهلة المشغّل على قيمة كبيرة (ساعة واحدة في هذه الحالة)، ويتم إعادة تفعيل
mm_events config
بشكل دوري لضمان تفعيل mm_events دائمًا. نتيجةً لذلك، يتم إنشاء تقرير عن الخطأ
يحتوي على نوع البيانات الموضّح في الشكل 1
والشكل 2.