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中所示的数据类型。