在 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
統計信息FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
可以使用Perfetto UI查看vmstat
數據和ftrace
事件以進行分析。
vmstat 數據
將systrace.pftrace
文件上傳到 Perfetto UI,以查看在時間線上繪製的vmstat
數據,如下所示。
圖 1. vmstat 圖形數據的時間線
ftrace 事件
捕獲的ftrace
mm_events
不會以圖形方式顯示在時間線上。要查看它們,請單擊Query SQL選項卡,如圖 2 所示。
圖 2.單擊 Query (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 文檔。有關示例跟踪配置,請參閱此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中所示的數據類型。