Android 12以降で起動するデバイスは、 mm_events
を利用します。これは、システムでメモリ不足が発生しているときに定期的に取得されるメモリ関連の統計のセットです。 mm_events
はperfetto
トレースメカニズムと統合されており、メモリ不足が検出された場合にのみアクティブ化されるため、パフォーマンスのオーバーヘッドの増加は最小限に抑えられます。統計収集は、カーネルのkswapd
、 direct reclaim,
またはcompaction
メカニズムがアクティブ化されたときに開始され、一定の間隔で統計をキャプチャするために構成可能な期間アクティブのままになります。
mm_events
は、バグレポートが提出されたときにシステムメモリ状態の1回限りのスナップショットを提供する代わりに、メモリ不足の期間中のメモリ統計の簡単な履歴ビューを表示します。キャプチャされた統計は、次の表にリストされています。
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.
にzipレポートの形式で過去のmm_events
統計を提供します。 FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
vmstat
データとftrace
イベントの両方を表示して、 PerfettoUIを使用して分析することができます。
vmstatデータ
systrace.pftrace
ファイルをPerfettoUIにアップロードして、以下に示すようにタイムライン上にグラフ化されたvmstat
データを確認します。
図1.vmstatグラフィックデータのタイムライン
ftraceイベント
mm_events
されたftrace
は、タイムラインにグラフィカルに表示されません。それらを表示するには、図2に示すようにある[クエリSQL ]タブをクリックします。
図2. [クエリ(SQL)]をクリックしてアクセスします
mm_eventsを有効にする
mm_eventsを有効にするには、ベンダーinit.rc
からpersist.mm_events.enabled=true
を設定します。
mm_eventsのメモリとCPUフットプリントを軽減するために、以下が用意されています。
-
mm-events ftrace
インスタンスは、CPUごとに4KBのバッファーを使用します。 -
kmem_activity
トリガーは、1分に1回にレート制限されます。 - 常にアクティブにできるのは、
mm-events
トレースセッションのみです。
カスタマイズ
mm_events
は、 perfetto
trace configファイルを使用して、トレースセッション中にキャプチャする統計を指定します。
/vendor/etc/mm_events.cfg
でカスタムPerfettoトレース構成を提供できます。使用可能なトレース構成フィールドの説明については、 PerfettoDocsを参照してください。トレース構成のサンプルについては、この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
期間(36000ミリ秒(6分))が終了するまで、 vm_stats
およびftrace
メモリイベントのキャプチャを開始します。トリガータイムアウトは大きな値(この場合は1時間)に設定され、 mm_events config
は定期的に再調整され、 mm_events
が常に有効になるようにします。その結果、図1と図2に示すタイプのデータを含むバグレポートが生成されます。