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 ,則在設備開始遇到高內存壓力後不久捕獲的事件的錯誤報告會以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數據,如下所示。

vmstat data graphed on a timeline

圖 1. vmstat 圖形數據的時間線

ftrace 事件

捕獲的ftrace mm_events不會以圖形方式顯示在時間線上。要查看它們,請單擊Query SQL選項卡,如圖 2 所示。

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

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