Статистика исторической памяти событий ММ

Устройства, запускаемые на 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:

vmstat data graphed on a timeline

Рисунок 1. Временная шкала графических данных vmstat.

события трассировки

Захваченные ftrace mm_events не отображаются графически на временной шкале. Чтобы просмотреть их, перейдите на вкладку «Запрос SQL» , расположенную, как показано на рисунке 2:

Locate the Query SQL tab and click to view ftrace and mm_events captured and graphed

Рисунок 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 .