MM事件歷史記憶體統計

在 Android 12 及更高版本上啟動的設備利用mm_events ,這是一組與內存相關的統計信息,當系統遇到內存壓力時會定期捕獲這些統計信息。 mm_eventsperfetto追蹤機制集成,由於它僅在檢測到記憶體壓力時才激活,因此其增加的效能開銷很小。當內核的kswapddirect 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 所示:

vmstat data graphed on a timeline

圖 1. vmstat 圖形資料的時間軸。

ftrace 事件

捕獲的ftrace mm_events不會在時間軸上以圖形方式顯示。若要查看它們,請按一下「查詢 SQL」選項卡,如圖 2 所示:

Locate the Query SQL tab and click to view ftrace and mm_events captured and graphed

圖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_statsftrace記憶體事件,直到配置的stop_delay_ms週期 36000 毫秒(6 分鐘)結束。觸發器逾時設定為較大的值(在本例中為 1 小時),並且定期重新配置mm_events config以確保mm_events始終啟用。結果會產生錯誤報告,其中包含圖 1圖 2中所示的資料類型。