マルチプロセスなウェブブラウザのメモリ使用量の測り方を調べている。
Chromium については、過去 about:memory という URL でメモリ使用量を取得出来たらしいが、最近この機能は削除された https://bugs.chromium.org/p/chromium/issues/detail?id=588790 。代わりのツールを探し中だがまだ見つからないので、必要な情報を調べている。https://www.chromium.org/developers/memory-usage-backgrounder によれば、一言でメモリ使用量と言っても大まかに二つの部分に分かれている。
- Private memory: あるプロセスだけで使われるメモリ。
- Shared memory: 他のプロセスと共有しているメモリ。共有ライブラリ等。
という事で、あるウェブブラウザが使用中のメモリを求めるには次のようにする。
- ブラウザに関連する全てのプロセスの Private memory を足す。
- ブラウザに関連する全ての Shared memory を重複しないように適切に足す。
ここで、Shared memory をどのように足せば良いかというのが問題になる。共有メモリはブラウザだけでなく、他のアプリも使っているので、それぞれのプロセスが使っている Shared memory を単純に足し合わせただけでは重複が多すぎて、本当に使っているメモリを示している事にならない。そこで、Linux では Proportional set size という考え方が生まれたらしい。
https://lwn.net/Articles/230975/ によれば、あるプロセスの Proportional set size とは、割り当てたメモリのそれぞれのページごとに、他に使ってるプロセスの数を調べて割って求めた値らしい。例えばあるプロセスが 1000 ページを専有していて、1000 ページを二つのプロセスで共有していた場合、その PSS は 1000 + 1000 / 2 = 1500 となる。このような統計情報を計算するのは比較的重い作業なので、カーネルは必要な情報だけを提供し、実際の計算は http://manpages.ubuntu.com/manpages/precise/en/man8/smem.8.html などユーザランドで行う。
例えば chromium-browser という名前のプロセスを計測すると
$ smem -k -P [c]hromium-browser -t
PID User Command Swap USS PSS RSS
15352 tyamamiya /usr/lib/chromium-browser/c 0 148.0K 3.8M 12.8M
15350 tyamamiya /usr/lib/chromium-browser/c 0 328.0K 27.2M 71.8M
15342 tyamamiya /usr/lib/chromium-browser/c 0 103.3M 137.4M 192.0M
15437 tyamamiya /usr/lib/chromium-browser/c 0 138.0M 153.9M 183.0M
-------------------------------------------------------------------------------
4 1 0 241.7M 322.4M 459.6M
ということで、カーネルが報告した RSS 459.6M に対して、もっともらしい結果である PSS は 322.4M という事になった。ここで項目の意味は
- USS: Unique Set Size: あるプロセスだけで使われるメモリ (Private memory)
- PSS: Proportional set size: USS + Shared memory を共有しているプロセスの数で割ったもの。
- RSS: Resident set size: 物理メモリ
となる。
参考情報
- proportional set size とは何か? https://lwn.net/Articles/230975/
- Proportional set size: https://en.wikipedia.org/wiki/Proportional_set_size
- USS, PSS, RSS: https://stackoverflow.com/questions/131303/how-to-measure-actual-memory-usage-of-an-application-or-process/13754307#13754307
- Get chrome's total memory usage: https://unix.stackexchange.com/questions/288589/get-chromes-total-memory-usage
- cgroup で制限する: https://gist.github.com/juanje/9861623
- --single-process で単一プロセスで動かす
- chrome://system/ にも mem_usage がある (詳細不明)