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
통계를 제공합니다.
vmstat
데이터와 ftrace
이벤트는 모두 Perfetto UI를 사용하여 분석을 위해 확인할 수 있습니다.
vmstat 데이터
systrace.pftrace
파일을 Perfetto UI에 업로드하여 아래와 같이 타임라인에 그래프로 표시된 vmstat
데이터를 확인합니다.
그림 1. vmstat 그래픽 데이터 타임라인
ftrace 이벤트
캡처된 ftrace
mm_events
는 타임라인에 그래픽으로 표시되지 않습니다. 이를 확인하려면 그림 2와 같이 Qeury SQL 탭을 클릭합니다.
그림 2. Query(SQL)를 클릭하여 액세스
mm_events 사용 설정
mm_events를 사용 설정하려면 공급업체 init.rc
에서 sysprop persist.mm_events.enabled=true
를 설정합니다.
다음은 mm_events의 메모리와 CPU 공간을 줄이기 위한 것입니다.
mm-events ftrace
인스턴스는 CPU당 4KB 버퍼를 사용합니다.kmem_activity
트리거는 분당 1회로 속도가 제한됩니다.- 언제든지
mm-events
트레이스 세션 1개만 활성화될 수 있습니다.
맞춤설정
mm_events
는 perfetto
트레이스 구성 파일을 사용하여 추적 세션 중에 캡처할 통계를 지정합니다.
/vendor/etc/mm_events.cfg
에서 맞춤 Perfetto 트레이스 구성을 제공할 수 있습니다.
사용 가능한 트레이스 구성 필드에 관한 설명은 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 트레이스 세션은 구성된 stop_delay_ms
기간 36,000ms(6분)가 종료될 때까지 vm_stats
및 ftrace
메모리 이벤트를 캡처합니다.
트리거 제한 시간은 큰 값(이 경우 1시간)으로 설정되며 mm_events config
는 mm_events
가 항상 사용 설정되도록 주기적으로 다시 설정됩니다. 그 결과 그림 1과 그림 2에 표시된 데이터 유형을 포함하는 버그 신고가 생성됩니다.