במכשירים שמריצים Android 12 ואילך נעשה שימוש ב-mm_events
, קבוצה של נתונים סטטיסטיים שקשורים לזיכרון, שמתועדים מדי פעם כשהמערכת נמצאת בלחץ זיכרון. mm_events
משתלב במנגנוני המעקב של perfetto
, והוא מופעל רק כשמזוהה לחץ זיכרון, כך שהעלות הנוספת על הביצועים היא מינימלית. איסוף הנתונים הסטטיסטיים מתחיל כשהמנגנונים kswapd
, direct reclaim,
או compaction
של הליבה מופעלים, והוא נשאר פעיל למשך פרק זמן שניתן להגדרה כדי לתעד נתונים סטטיסטיים במרווחי זמן קבועים.
במקום לספק קובץ snapshot חד-פעמי של מצב הזיכרון במערכת כששולחים דיווח על באג, 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 |
אירועי מעקב (trace) שקשורים ל-mm
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
, בצורת דוח בפורמט zip ב-FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
אפשר להציג את הנתונים של vmstat
ואת האירועים של ftrace
לצורך ניתוח באמצעות ממשק המשתמש של Perfeto.
נתוני vmstat
מעלים את הקובץ systrace.pftrace
לממשק המשתמש של Perfetto כדי לראות את הנתונים של vmstat
בתרשים ציר זמן, כפי שמוצג באיור 1:
איור 1. ציר זמן של נתונים גרפיים של vmstat.
אירועי ftrace
הערכים של ftrace
mm_events
שצולמו לא מוצגים בצורה גרפית בציר הזמן. כדי להציג אותן, לוחצים על הכרטיסייה Query SQL, שממוקמת כפי שמוצג באיור 2:
איור 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.