נתונים סטטיסטיים היסטוריים של אירועי MM

במכשירים שמריצים Android 12 ואילך נעשה שימוש ב-mm_events, קבוצה של נתונים סטטיסטיים שקשורים לזיכרון, שמתועדים מדי פעם כשהמערכת נמצאת בלחץ זיכרון. mm_events משתלב במנגנוני המעקב של perfetto, והוא מופעל רק כשמזוהה לחץ זיכרון, כך שהעלות הנוספת על הביצועים היא מינימלית. איסוף הנתונים הסטטיסטיים מתחיל כשהמנגנונים kswapd, ‏ direct reclaim, או compaction של הליבה מופעלים, והוא נשאר פעיל למשך פרק זמן שניתן להגדרה כדי לתעד נתונים סטטיסטיים במרווחי זמן קבועים.

במקום לספק קובץ snapshot חד-פעמי של מצב הזיכרון במערכת כששולחים דיווח על באג, 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

אירועי מעקב (trace) שקשורים ל-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, בצורת דוח בפורמט zip ב-FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.

אפשר להציג את הנתונים של vmstat ואת האירועים של ftrace לצורך ניתוח באמצעות ממשק המשתמש של Perfeto.

נתוני vmstat

מעלים את הקובץ systrace.pftrace לממשק המשתמש של Perfetto כדי לראות את הנתונים של vmstat בתרשים ציר זמן, כפי שמוצג באיור 1:

נתוני vmstat בתרשים בציר זמן

איור 1. ציר זמן של נתונים גרפיים של vmstat.

אירועי ftrace

הערכים של ftrace mm_events שצולמו לא מוצגים בצורה גרפית בציר הזמן. כדי להציג אותן, לוחצים על הכרטיסייה Query SQL, שממוקמת כפי שמוצג באיור 2:

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

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

הפעלת mm_events

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

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

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

התאמה אישית

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

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