MM 事件歷來記憶體統計資料

在 Android 12 以上版本啟動的裝置會使用 mm_events,這是一組記憶體相關統計資料,可在系統遇到記憶體壓力時定期擷取。mm_events 已與 perfetto 追蹤機制整合,且只會在偵測到記憶體壓力時啟用,因此所增加的效能負擔極小。當核心的 kswapddirect reclaim,compaction 機制啟用時,統計資料收集作業就會開始,並在可設定的時間長度內保持啟用狀態,以便定期擷取統計資料。

mm_events 不會在提交錯誤報告時提供系統記憶體狀態的一次性快照,而是會顯示記憶體壓力期間記憶體統計資料的簡短歷來資料檢視畫面。擷取的統計資料會列在下表中。

vmstat 欄位

nr_free_pagesnr_slab_reclaimable
nr_slab_unreclaimablenr_active_file
nr_inactive_filenr_active_anon
nr_inactive_anonworkingset_refault
workingset_activatenr_file_pages
pgpginpgpgout
pswpinpswpout
pgsteal_kswapd_dmapgsteal_kswapd_normal
pgsteal_kswapd_movablepgsteal_direct_dma
pgsteal_direct_normalpgsteal_direct_movable
pgscan_kswapd_dmapgscan_kswapd_normal
pgscan_kswapd_movablepgscan_direct_dma
pgscan_direct_normalpgscan_direct_movable
compact_migrate_scannedcompact_free_scanned

mm 相關追蹤記錄事件

vmscan/mm_vmscan_kswapd_wakevmscan/mm_vmscan_kswapd_sleep
vmscan/mm_vmscan_direct_reclaim_beginvmscan/mm_vmscan_direct_reclaim_end
compaction/mm_compaction_begincompaction/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 資料

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

ftrace 事件

擷取的 ftrace mm_events 不會以圖形顯示在時間軸上。如要查看這些說明,請按一下「Query SQL」分頁標籤 (如圖 2 所示):

找到「查詢 SQL」分頁並按一下,即可查看已擷取和繪製的 ftrace 和 mm_events

圖 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 顯示的資料類型,