MMイベント-履歴メモリ統計

Android 12以降で起動するデバイスは、 mm_eventsを利用します。これは、システムでメモリ不足が発生しているときに定期的に取得されるメモリ関連の統計のセットです。 mm_eventsperfettoトレースメカニズムと統合されており、メモリ不足が検出された場合にのみアクティブ化されるため、パフォーマンスのオーバーヘッドの増加は最小限に抑えられます。統計収集は、カーネルのkswapddirect 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データを確認します。

vmstat data graphed on a timeline

1.vmstatグラフィックデータのタイムライン

ftraceイベント

mm_eventsされたftraceは、タイムラインにグラフィカルに表示されません。それらを表示するには、図2に示すようにある[クエリ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から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に示すタイプのデータを含むバグレポートが生成されます。