إحصاءات الذاكرة السابقة للأحداث حسب الشهر (MM)

تستخدم الأجهزة التي تعمل بنظام التشغيل Android 12 والإصدارات الأحدث mm_events، وهي مجموعة من الإحصاءات المتعلّقة بالذاكرة يتم تسجيلها بصورة دورية عندما يواجه النظام ضغطًا في الذاكرة. يتم دمج mm_events مع آليات تتبُّع perfetto، ولأنّه لا يتم تفعيله إلا عند رصد الضغط على الذاكرة، فإنّ النفقات الإضافية للأداء تكون ضئيلة. يبدأ جمع الإحصاءات عند تفعيل آليات kswapd أو direct reclaim, أو compaction في النواة، ويظل نشطًا لمدّة زمنية قابلة للضبط لتسجيل الإحصاءات على فترات زمنية منتظمة.

بدلاً من تقديم نبذة لمرة واحدة عن حالة ذاكرة النظام عند تسجيل تقرير خطأ، يعرض mm_events عرضًا تاريخيًا موجزًا لإحصاءات الذاكرة خلال فترات ضغط الذاكرة. يتم إدراج الإحصاءات التي تم تسجيلها في الجداول التالية.

حقول vmstat

nr_free_pagesnr_slab_reclaimable
nr_slab_unreclaimablenr_active_file
nr_inactive_filenr_active_anon
nr_inactive_anonworkingset_refault
workingset_activatenr_file_pages
pgpginpgpgout
pswpinpswpout
pgsteal_kswapd_dmapgsteal_kswapd_normal
pgsteal_kswapd_movablepgsteal_direct_dma
pgsteal_direct_normalpgsteal_direct_movable
pgscan_kswapd_dmapgscan_kswapd_normal
pgscan_kswapd_movablepgscan_direct_dma
pgscan_direct_normalpgscan_direct_movable
compact_migrate_scannedcompact_free_scanned

أحداث التتبُّع ذات الصلة بوحدة التحكّم في الحدود

vmscan/mm_vmscan_kswapd_wakevmscan/mm_vmscan_kswapd_sleep
vmscan/mm_vmscan_direct_reclaim_beginvmscan/mm_vmscan_direct_reclaim_end
compaction/mm_compaction_begincompaction/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:

بيانات vmstat مرسومة بيانيًا على مخطط زمني

الشكل 1: مخطط زمني للبيانات الرسومية في vmstat

أحداث ftrace

لا يتم عرض mm_events ftrace التي تم التقاطها في رسم بياني على المخطط الزمني. لاطلاع على هذه الطلبات، انقر على علامة التبويب طلب SQL، كما هو موضّح في الشكل 2:

حدِّد موقع علامة التبويب Query SQL وانقر لعرض ftrace وmm_events التي تم التقاطها ورسمها بيانيًا.

الشكل 2: انقر على "طلب بحث (SQL)" للوصول إلى البيانات.

تفعيل mm_events

لتفعيل mm_events، اضبط sys المتعلقة على persist.mm_events.enabled=true من المورّد init.rc.

تم تنفيذ الإجراءات التالية للحدّ من مساحة الذاكرة ووحدة المعالجة المركزية التي يشغلها mm_events:

  • يستخدم المثيل mm-events ftrace مخزنًا مؤقتًا قدره 4 كيلوبايت لكل وحدة معالجة مركزية (CPU).
  • يتمّ الحدّ من معدّل تشغيل عامل التشغيل 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 في تسجيل أحداث الذاكرة التي تبلغ vm_stats وftrace حتى نهاية فترة stop_delay_ms التي تم ضبطها، أي 36, 000 ملي ثانية (6 دقائق). يتم ضبط مهلة التفعيل على قيمة كبيرة (ساعة واحدة في هذه الحالة) ويتم إعادة تنشيط mm_events config بشكل دوري لضمان تفعيل mm_events دائمًا. نتيجةً لذلك، يتم إنشاء تقرير أخطاء يحتوي على نوع البيانات المعروضة في الشكل 1 والشكل 2.