在 Android 12 及更高版本上启动的设备使用 mm_events
,这是一组与内存相关的统计信息,会在系统遇到内存压力时定期捕获。mm_events
与 perfetto
跟踪机制集成,并且由于它仅在检测到内存压力时才激活,因此其增加的性能开销极小。统计信息收集在内核的 kswapd
、direct 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
统计信息。
可以使用 Perfetto UI 查看 vmstat
数据和 ftrace
事件以进行分析。
vmstat 数据
将 systrace.pftrace
文件上传到 Perfetto UI 以查看 vmstat
数据在时间轴上以图形方式显示,如图 1 所示
图 1. vmstat 图形数据时间轴。
ftrace 事件
捕获的 ftrace
mm_events
不会在时间轴上以图形方式显示。要查看它们,请点击Query SQL 选项卡,位置如图 2 所示
图 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_stats
和 ftrace
内存事件,直到配置的 stop_delay_ms
周期结束,即 36000 毫秒(6 分钟)。触发器超时设置为较大的值(在本例中为 1 小时),并且 mm_events config
会定期重新激活,以确保 mm_events
始终处于启用状态。结果会生成错误报告,其中包含 图 1 和 图 2 中显示的数据类型。