Устройства, запускаемые на 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 |
события трассировки, связанные с мм
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
включен, отчеты об ошибках для событий, которые фиксируются вскоре после того, как устройство начинает испытывать высокую нехватку памяти, предоставляют историческую статистику mm_events
в виде сжатого отчета в FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
И данные vmstat
, и события ftrace
можно просмотреть для анализа с помощью пользовательского интерфейса Perfetto .
данные vmstat
Загрузите файл systrace.pftrace
в пользовательский интерфейс Perfetto, чтобы просмотреть данные vmstat
на временной шкале, как показано на рисунке 1:
Рисунок 1. Временная шкала графических данных vmstat.
события трассировки
Захваченные ftrace
mm_events
не отображаются графически на временной шкале. Чтобы просмотреть их, перейдите на вкладку «Запрос SQL» , расположенную, как показано на рисунке 2:
Рисунок 2. Нажмите «Запрос (SQL)» для доступа.
Включить mm_events
Чтобы включить mm_events, установите sysprop persist.mm_events.enabled=true
из init.rc
поставщика.
Для уменьшения использования памяти и процессора mm_events предусмотрены следующие меры:
- Экземпляр
mm-events ftrace
использует буфер размером 4 КБ на каждый процессор. - Триггер
kmem_activity
ограничен частотой один раз в минуту. - В любой момент времени может быть активен только сеанс трассировки
mm-events
.
Кастомизация
mm_events
использует файл конфигурации трассировки perfetto
, чтобы указать, какую статистику следует собирать во время сеанса трассировки.
Вы можете предоставить собственную конфигурацию трассировки 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
, 36 000 мс (6 минут). Для тайм-аута триггера установлено большое значение (в данном случае 1 час), а mm_events config
периодически обновляется, чтобы гарантировать, что mm_events
всегда включена. В результате генерируется отчет об ошибке, содержащий тип данных, показанный на рисунках 1 и 2 .