搭載 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
已啟用,裝置開始出現高記憶體壓力後不久擷取的事件錯誤報告,會以 FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
中的壓縮報表形式,提供歷來 mm_events
統計資料。
您可以使用 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,請從供應商設定 sysprop persist.mm_events.enabled=true
。init.rc
為減少 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 所示的資料類型。