https://docs.google.com/document/d/1_WmgE1F5WUrhwkPqJis3dWyOiUmQKvpXp5cd4w86TvA/edit#
目的
目標:
- Chromeのメモリ使用に関して、改善や改悪が識別できるような一貫したメモリ計測法をつくる。
目的じゃない:
- Chromeメモリ使用のユーザー経験への影響
背景
以前の計測法ではメモリ使用の改悪を発見できなかった。たとえば問題713854、ChromeのGPUプロセスは64GBリークしてたかもしれない、そんなんになったらシステムは使用不能になる。Chromeのメモリ計測法では把握できなかった。
Chromeの以前の計測法はOSによってずいぶん違っていたのでそれが開発者を混乱させた。たとえばChromeはChromeOSのレンダープロセスがWindowsのそれに比べて2倍の使用量を報告していた。これによりChromeOS開発者はこれらを機能的な違いと誤認していた。
デザイン
定義
プロセスごとのプライベートメモリ足跡(footpring)を以下のように定義する:
- プライベート
- 破棄不可能
- 破棄可能はメモリは(OSから見れば)開放されたメモリと同じ。いつでも再利用できる。
- 匿名(ファイルにより提供されない)
- 常駐、圧縮、スワップ
- 圧縮メモリについては、圧縮前のサイズを計測。計算と圧縮効率とは独立。
プロセスグループについては、供給メモリフットプリントを非プライベート、非ディスカーダブル、現存する匿名メモリと定義する。圧縮されててもスワップされてても同様に扱う。さらに、共有メモリの各ピースのインスタンスのみのカウントする。共有メモリのマルチマッチングは無視する。
これらの定義の詳細は付属Bを参照。
実装
共有メモリフットプリントはChromeによって確保されたすべての共有メモリを追跡することで計算する。プロセス間で2重に計算されているものは除外する。実装の詳細は、デザインドキュメントを参照。これはライブラリによって確保された共有メモリは追跡しない(欠陥の1つ)。
プライベートメモリフットプリントは同様に計算される場合もあるがオーバーヘッドが大きくなる。なので適切なOSのsyscallを読んでそれを見積もる。
GetPrivateMemoryFootprint(): if OS == macOS || iOS: return task_info(TASK_VM_INFO).phys_footprint if OS == Windows: return PROCESS_MEMORY_COUNTERS_EX::PrivateUsage if OS == Linux || OS == ChromeOS || OS == Android: return (RssAnon + VmSwap) from /proc/pid/status
See Appendix C for alternatives considered. For a full analysis for each of these calculations, see this doc for macOS and iOS, this doc for Windows, and this doc for Linux/ChromeOS/Android. For an extended discussion on noise in these estimates, see Appendix E.