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