סטטיסטיקות היסטוריות של זיכרון באירועי 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

אירועי מעקב שקשורים ל-mm

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 לא מוצגות בגרף בציר הזמן. כדי לראות אותן, לוחצים על הכרטיסייה Query SQL, שמוצגת באיור 2:

מאתרים את הכרטיסייה Query SQL (שאילתת SQL) ולוחצים עליה כדי לראות את הנתונים של ftrace ו-mm_events שצולמו ומוצגים בתרשים.

איור 2. לוחצים על Query (SQL) כדי לגשת.

הפעלת mm_events

כדי להפעיל את mm_events, מגדירים את sysprop‏ persist.mm_events.enabled=true מ-vendor init.rc.

כדי לצמצם את השימוש בזיכרון ובמעבד (CPU) של mm_events, אנחנו משתמשים באמצעים הבאים:

  • מופע mm-events ftrace משתמש בשטח אחסון זמני של 4KB לכל CPU.
  • הטריגר kmem_activity מוגבל לשימוש פעם בדקה.
  • אפשר להפעיל רק סשן אחד של מעקב אחר mm-events בכל זמן נתון.

התאמה אישית

mm_events משתמש בקובץ הגדרות מעקב perfetto כדי לציין אילו נתונים סטטיסטיים לתעד במהלך סשן המעקב.

אפשר לספק הגדרת מעקב מותאמת אישית של Perfetto ב-/vendor/etc/mm_events.cfg. תיאור של השדות הזמינים בהגדרת ה-trace מופיע במסמכי Perfetto. 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 מפעיל את הטריגר של Perfetto kmem_activity וסשן המעקב של Perfetto מתחיל לתעד אירועי זיכרון של vm_stats ו-ftrace עד לסיום התקופה שהוגדרה stop_delay_ms, שהיא 36,000 מילי-שניות (6 דקות). הזמן הקצוב לתפוגה של הטריגר מוגדר לערך גבוה (במקרה הזה, שעה אחת) וmm_events config מופעל מחדש באופן מחזורי כדי לוודא ש-mm_events תמיד מופעל. כתוצאה מכך, נוצר דוח באגים שמכיל את סוג הנתונים שמוצג באיור 1 ובאיור 2.