MM 事件历史内存统计信息

在 Android 12 及更高版本上启动的设备使用 mm_events,这是一组与内存相关的统计信息,会在系统遇到内存压力时定期捕获。mm_eventsperfetto 跟踪机制集成,并且由于它仅在检测到内存压力时才激活,因此其增加的性能开销极小。统计信息收集在内核的 kswapddirect reclaimcompaction 机制激活时开始,并保持活动 可配置的时间段,以便定期捕获统计信息。

与在提交错误报告时提供系统内存状态的一次性快照不同,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,则在设备开始经历高内存压力后不久捕获的事件的错误报告会以压缩报告的形式在 FS/data/misc/perfetto-traces/bugreport/systrace.pftrace 中提供历史 mm_events 统计信息。

可以使用 Perfetto UI 查看 vmstat 数据和 ftrace 事件以进行分析。

vmstat 数据

systrace.pftrace 文件上传到 Perfetto UI 以查看 vmstat 数据在时间轴上以图形方式显示,如图 1 所示

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,请从 vendor init.rc 设置系统属性 persist.mm_events.enabled=true

以下措施旨在缓解 mm_events 的内存和 CPU 占用空间

  • 一个 mm-events ftrace 实例每个 CPU 使用 4 KB 缓冲区。
  • kmem_activity 触发器被限制为每分钟一次。
  • 任何时候只能有一个 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 中显示的数据类型。