MM イベント - 過去のメモリ統計情報

Android 12 以降を搭載したデバイスでは、メモリ負荷の発生中に定期的に取得されるメモリ関連の統計情報セット mm_events を利用します。mm_eventsperfetto トレース メカニズムと統合されており、メモリ負荷が検出された場合にのみアクティブになるため、パフォーマンスのオーバーヘッドは最小限に抑えられます。カーネルの kswapddirect reclaim, または compaction メカニズムがアクティブになると、統計情報の収集が開始されます。指定した期間にわたってアクティブな状態が維持され、定期的に統計情報が収集されます。

mm_events は、バグレポートが提出された際にシステムメモリの状態の 1 回限りのスナップショットを提供する代わりに、メモリ負荷が発生していた期間のメモリ統計情報の簡単な履歴を表示します。次の表に、取得される統計情報の一覧を示します。

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 が有効になっている場合、デバイスのメモリ負荷が上昇し始めた直後に取得されるイベントのバグレポートでは、mm_events の過去の統計情報が圧縮されたレポートの形式で FS/data/misc/perfetto-traces/bugreport/systrace.pftrace. に提供されます。

Perfetto UI を使用して、vmstat データと ftrace イベントの両方を表示して分析できます。

vmstat データ

Perfetto UI に systrace.pftrace ファイルをアップロードすると、図 1 に示すように、vmstat データのグラフがタイムライン上に表示されます。

タイムライン上に表示された vmstat データのグラフ

図 1. vmstat のグラフィカル データのタイムライン

ftrace イベント

取得された ftrace mm_events のグラフはタイムライン上に表示されていません。これを表示するには、図 2 で示す場所にある [Query 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 あたり 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 に示されているタイプのデータが含まれるバグレポートが生成されます。