MM 이벤트 - 기록 메모리 통계

Android 12 이상에서 실행되는 기기는 mm_events 를 활용합니다. mm_events는 시스템이 메모리 부족을 경험하는 동안 주기적으로 캡처되는 메모리 관련 통계 세트입니다. mm_eventsperfetto 추적 메커니즘과 통합되며 메모리 압력이 감지될 때만 활성화되기 때문에 추가되는 성능 오버헤드가 최소화됩니다. 통계 수집은 커널의 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 통계를 제공합니다. FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.

vmstat 데이터와 ftrace 이벤트는 모두 Perfetto UI 를 사용하여 분석을 위해 볼 수 있습니다.

vmstat 데이터

systrace.pftrace 파일을 Perfetto UI에 업로드하면 아래와 같이 타임라인에 그래프로 표시된 vmstat 데이터를 볼 수 있습니다.

vmstat data graphed on a timeline

그림 1. vmstat 그래픽 데이터의 타임라인

ftrace 이벤트

캡처된 ftrace mm_events 는 타임라인에 그래픽으로 표시되지 않습니다. 이를 보려면 그림 2에 표시된 것처럼 Query SQL 탭을 클릭합니다.

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

그림 2. 쿼리(SQL)를 클릭하여 액세스

mm_events 활성화

mm_events를 활성화하려면 공급업체 init.rc 에서 sysprop 지속.mm_events.enabled persist.mm_events.enabled=true 를 설정하십시오.

다음은 mm_events의 메모리 및 CPU 사용 공간을 완화하기 위한 것입니다.

  • mm-events ftrace 인스턴스는 CPU당 4KB 버퍼를 사용합니다.
  • kmem_activity 트리거는 분당 한 번으로 속도가 제한됩니다.
  • 언제든지 mm-events 추적 세션만 활성화될 수 있습니다.

커스터마이징

mm_eventsperfetto 추적 구성 파일을 사용하여 추적 세션 중에 캡처할 통계를 지정합니다.

/vendor/etc/mm_events.cfg 에서 사용자 지정 /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 추적 세션은 구성된 stop_delay_ms 기간인 36000ms(6분)가 끝날 때까지 vm_statsftrace 메모리 이벤트 캡처를 시작합니다. 트리거 시간 초과는 큰 값(이 경우 1시간)으로 설정되고 mm_events configmm_events 가 항상 활성화되도록 주기적으로 재설정됩니다. 결과적으로 그림 1그림 2 에 표시된 데이터 유형을 포함하는 버그 보고서가 생성됩니다.