在 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
统计信息FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
可以使用Perfetto UI查看vmstat
数据和ftrace
事件以进行分析。
vmstat 数据
将systrace.pftrace
文件上传到 Perfetto UI,以查看在时间线上绘制的vmstat
数据,如下所示。
图 1. vmstat 图形数据的时间线
ftrace 事件
捕获的ftrace
mm_events
不会以图形方式显示在时间线上。要查看它们,请单击Query SQL选项卡,如图 2 所示。
图 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_stats
和ftrace
内存事件,直到配置的stop_delay_ms
周期结束,即 36000 毫秒(6 分钟)。触发超时设置为一个较大的值(在本例中为 1 小时),并且mm_events config
会定期重新启动,以确保mm_events
始终处于启用状态。结果会生成一个错误报告,其中包含图 1和图 2中所示的数据类型。