إحصاءات الذاكرة السابقة لأحداث "الحملات على شبكة البحث"

تستخدم الأجهزة التي تعمل بنظام التشغيل 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

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

ابحث عن علامة التبويب "طلب البحث بلغة الاستعلامات البنيوية (SQL)" وانقر لعرض ftrace وmm_events التي تم تسجيلها وعرضها في رسم بياني.

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

تفعيل mm_events

لتفعيل mm_events، اضبط sysprop persist.mm_events.enabled=true من vendor 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 التي تم ضبطها، وهي 36, 000 ملي ثانية (6 دقائق). يتم ضبط مهلة التفعيل على قيمة كبيرة (ساعة واحدة في هذه الحالة) ويتم إعادة تنشيط mm_events config بشكل دوري لضمان أن يكون mm_events مفعّلاً دائمًا. نتيجةً لذلك، يتم إنشاء تقرير أخطاء يحتوي على نوع البيانات الموضَّحة في الشكل 1 والشكل 2.