在 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.
您可以使用 Perfetto UI 查看 vmstat
資料和 ftrace
事件,以便進行分析。
vmstat 資料
將 systrace.pftrace
檔案上傳至 Perfetto UI,即可查看 vmstat
資料在時間軸上顯示的圖表,如圖 1 所示:
圖 1. vmstat 圖形資料的時間軸。
ftrace 事件
擷取的 ftrace
mm_events
不會以圖形顯示在時間軸上。如要查看這些說明,請按一下「Query SQL」分頁標籤 (如圖 2 所示):
圖 2. 點選「查詢 (SQL)」即可存取。
啟用 mm_events
如要啟用 mm_events,請從供應商 init.rc
設定 sysprop persist.mm_events.enabled=true
。
以下措施可減少 mm_events 的記憶體和 CPU 用量:
mm-events ftrace
執行個體會為每個 CPU 使用 4 KB 緩衝區。kmem_activity
觸發條件有每分鐘一次的頻率限制。- 任何時間點都只能啟用 1 個
mm-events
追蹤工作階段。
自訂
mm_events
會使用 perfetto
追蹤設定檔,指定在追蹤工作階段中要擷取哪些統計資料。
您可以在 /vendor/etc/mm_events.cfg
中提供自訂 Perfetto 追蹤設定。如需可用追蹤記錄設定欄位的說明,請參閱 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
期間 (36000 毫秒,即 6 分鐘) 結束為止。觸發條件逾時時間設為較大的值 (在本例中為 1 小時),並定期重新設定 mm_events config
,確保 mm_events
一律處於啟用狀態。錯誤報告會根據圖 1 和圖 2 顯示的資料類型,