Os dispositivos iniciados no Android 12 e superior utilizam mm_events
, um conjunto de estatísticas relacionadas à memória que são capturadas periodicamente enquanto um sistema sofre pressão de memória. mm_events
é integrado a mecanismos de rastreamento perfetto
e, como é ativado apenas quando a pressão da memória é detectada, sua sobrecarga de desempenho adicional é mínima. A coleta de estatísticas começa quando os kswapd
, direct reclaim,
ou compaction
do kernel são ativados e permanece ativo por um período de tempo configurável para capturar estatísticas em intervalos regulares.
Em vez de fornecer um instantâneo único do estado da memória do sistema quando um relatório de bug é arquivado, mm_events
mostra uma breve visão histórica das estatísticas da memória durante os períodos de pressão da memória. As estatísticas capturadas estão listadas nas tabelas a seguir.
campos 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 |
eventos de rastreamento relacionados a 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 |
Analisando dados mm_events
Se mm_events
estiver ativado, os relatórios de bugs para os eventos que são capturados logo após um dispositivo começar a experimentar alta pressão de memória fornecem as estatísticas históricas mm_events
, na forma de um relatório compactado em FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
Tanto os dados vmstat
quanto os eventos ftrace
podem ser visualizados para análise usando a interface do usuário do Perfetto .
dados vmstat
Carregue o arquivo systrace.pftrace
para a interface do usuário do Perfetto para ver os dados vmstat
representados graficamente em uma linha do tempo, conforme mostrado abaixo.
Figura 1. Linha do tempo dos dados gráficos do vmstat
eventos ftrace
Os ftrace
mm_events
capturados não são mostrados graficamente na linha do tempo. Para visualizá-los, clique na guia Query SQL , localizada conforme mostrado na Figura 2.
Figura 2. Clique em Consulta (SQL) para acessar
Ativando mm_events
Para habilitar mm_events, defina sysprop persist.mm_events.enabled=true
do fornecedor init.rc
.
O seguinte está em vigor para mitigar a memória e o espaço ocupado pela CPU de mm_events:
- Uma instância
mm-events ftrace
usa um buffer de 4 KB por CPU. - O gatilho
kmem_activity
é limitado a uma taxa por minuto. - Apenas a sessão de rastreamento
mm-events
pode estar ativa a qualquer momento.
Costumização
mm_events
usa um arquivo de configuração de rastreamento perfetto
para especificar quais estatísticas capturar durante a sessão de rastreamento.
Você pode fornecer uma configuração de rastreamento Perfetto personalizada em /vendor/etc/mm_events.cfg
. Para obter uma descrição dos campos de configuração de rastreamento disponíveis, consulte o Perfetto Docs . Para obter uma configuração de rastreamento de amostra, consulte este exemplo mm_events.cfg
.
Os campos importantes a serem incluídos em sua configuração de rastreamento para garantir que ela seja acionada pela pressão da memória são mostrados no snippet abaixo.
# 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
}
}
Nesta configuração mm_events
inicia o trigger perfetto kmem_activity
e a sessão Perfetto trace começa a capturar eventos de memória vm_stats
e ftrace
até o final do período stop_delay_ms
configurado, 36000 ms (6 minutos). O tempo limite do acionador é definido para um valor grande (neste caso, 1 hora) e mm_events config
é rearmada periodicamente para garantir que mm_events
esteja sempre ativado. Um relatório de bug é gerado como resultado, contendo o tipo de dados mostrado na Figura 1 e Figura 2 .