Статистика истории памяти событий MM

На устройствах с Android 12 и более поздних версий используется mm_events – набор статистики, связанной с памятью, которая периодически собирается, когда система испытывает нехватку памяти. mm_events интегрирован с механизмами трассировки perfetto и активируется только при обнаружении нехватки памяти, поэтому его влияние на производительность минимально. Сбор статистики начинается, когда активируются механизмы ядра kswapd, direct reclaim, или compaction, и продолжается в течение настраиваемого периода времени, чтобы фиксировать статистику через регулярные интервалы.

Вместо того чтобы предоставлять однократный снимок состояния системной памяти при отправке отчета об ошибке, mm_events показывает краткую историю статистики памяти в периоды нехватки памяти. Собранная статистика приведена в таблицах ниже.

Поля vmstat

nr_free_pagesnr_slab_reclaimable
nr_slab_unreclaimablenr_active_file
nr_inactive_filenr_active_anon
nr_inactive_anonworkingset_refault
workingset_activatenr_file_pages
pgpginpgpgout
pswpinpswpout
pgsteal_kswapd_dmapgsteal_kswapd_normal
pgsteal_kswapd_movablepgsteal_direct_dma
pgsteal_direct_normalpgsteal_direct_movable
pgscan_kswapd_dmapgscan_kswapd_normal
pgscan_kswapd_movablepgscan_direct_dma
pgscan_direct_normalpgscan_direct_movable
compact_migrate_scannedcompact_free_scanned

События трассировки, связанные с mm

vmscan/mm_vmscan_kswapd_wakevmscan/mm_vmscan_kswapd_sleep
vmscan/mm_vmscan_direct_reclaim_beginvmscan/mm_vmscan_direct_reclaim_end
compaction/mm_compaction_begincompaction/mm_compaction_end

Анализ данных mm_events

Если параметр mm_events включен, отчеты об ошибках для событий, которые были зарегистрированы вскоре после того, как устройство начало испытывать нехватку памяти, содержат статистику mm_events в виде заархивированного отчета в FS/data/misc/perfetto-traces/bugreport/systrace.pftrace..

Данные vmstat и события ftrace можно просматривать и анализировать в Perfetto UI.

Данные vmstat

Загрузите файл systrace.pftrace в Perfetto UI, чтобы посмотреть данные vmstat в виде графика на временной шкале, как показано на рисунке 1:

Данные vmstat, представленные в виде графика на временной шкале

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

события ftrace;

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

Найдите вкладку Query SQL (Запрос SQL) и нажмите на нее, чтобы посмотреть собранные и представленные в виде графика данные ftrace и mm_events.

Рисунок 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 инициирует триггер kmem_activity perfetto, и сеанс трассировки Perfetto начинает захватывать события памяти vm_stats и ftrace до конца настроенного периода stop_delay_ms, 36 000 мс (6 минут). Время ожидания триггера устанавливается на большое значение (в данном случае 1 час), а mm_events config периодически перезапускается, чтобы mm_events всегда был включен. В результате будет создан отчет об ошибке, содержащий тип данных, показанный на рисунке 1 и рисунке 2.