MM 이벤트 - 이전 메모리 통계

Android 12 이상에서 실행되는 기기는 시스템이 메모리 압력을 받는 동안 주기적으로 캡처되는 메모리 관련 통계 집합인 mm_events를 활용합니다. mm_eventsperfetto 추적 메커니즘과 통합되며 메모리 압력이 감지될 때만 활성화되므로 추가된 성능 오버헤드가 최소화됩니다. 통계 수집은 커널의 kswapddirect 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가 사용 설정된 경우 기기에서 높은 메모리 압력을 받기 시작한 직후 캡처된 이벤트의 버그 신고는 FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.에서 압축된 신고 형식으로 이전 mm_events 통계를 제공합니다.

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

vmstat 데이터

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

타임라인에 그래프로 표시된 vmstat 데이터

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

ftrace 이벤트

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

Query SQL 탭을 찾아 클릭하여 캡처되고 그래프로 표시된 ftrace와 mm_events 확인

그림 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_eventsperfetto 트레이스 구성 파일을 사용하여 추적 세션 중에 캡처할 통계를 지정합니다.

/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_statsftrace 메모리 이벤트를 캡처합니다. 트리거 제한 시간은 큰 값(이 경우 1시간)으로 설정되며 mm_events configmm_events가 항상 사용 설정되도록 주기적으로 다시 설정됩니다. 그 결과 그림 1그림 2에 표시된 데이터 유형을 포함하는 버그 신고가 생성됩니다.