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
が有効になっている場合、デバイスのメモリ負荷が上昇し始めた直後に取得されるイベントのバグレポートでは、mm_events
の過去の統計情報が圧縮されたレポートの形式で FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
に提供されます。
Perfetto UI を使用して、vmstat
データと ftrace
イベントの両方を表示して分析できます。
vmstat データ
Perfetto UI に systrace.pftrace
ファイルをアップロードすると、図 1 に示すように、vmstat
データのグラフがタイムライン上に表示されます。
図 1. vmstat のグラフィカル データのタイムライン
ftrace イベント
取得された ftrace
mm_events
のグラフはタイムライン上に表示されていません。これを表示するには、図 2 で示す場所にある [Query SQL] タブをクリックします。
図 2. [Query (SQL)] をクリックしてグラフにアクセスする
mm_events を有効にする
mm_events を有効にするには、ベンダー init.rc
の sysprop persist.mm_events.enabled=true
を設定します。
mm_events のメモリと CPU のフットプリントを軽減するため、以下の制限がかけられています。
mm-events ftrace
インスタンスは、CPU あたり 4 KB のバッファを使用します。kmem_activity
トリガーは、1 分に 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 トレース セッションは、vm_stats
および ftrace
メモリイベントの取得を開始し、構成した stop_delay_ms
期間 36,000 ms(6 分)が終了するまで取得を続けます。トリガー タイムアウトは大きい値(この場合は 1 時間)に設定され、mm_events
が常に有効になるように mm_events config
が定期的に再監視されます。その結果、図 1 と図 2 に示されているタイプのデータが含まれるバグレポートが生成されます。