web-dev-qa-db-ja.com

フォークされた一連のプロセスのメモリフットプリントをどのように測定しますか?

200MBのメモリを使用するプロセスがあり、fork()s:

python -c "import os; data='x'*200000000; os.fork(); raw_input()"

'top'のようなプログラムは、SHRdメモリがほとんどない200MBを使用する各プロセスを表示するため、プロセスが合計400MBを使用しているように見えます。ただし、fork()はプロセスのメモリページにコピーオンライト(COW)を実装しているため、実際には、プロセスは合計で200MBしか使用していません。

なぜメモリのどの部分がCOWであるかを上に表示しないのですか?そうする方法はありますか?または、代わりに使用できる別のコマンドはありますか?

注:OSXの「top」には、私が期待することを実行するRSHRD列があるようです。私の質問はLinuxです。

8
Dustin Boswell

この種の情報は、各プロセスの/proc/<pid>/smapsファイルから、Pssエントリ(「比例共有サイズ」の略)の形式で取得できます。

2つのプロセス間で200MBが「共有」されている上記の例では、各プロセスはそのマッピングのPSSエントリに100MBを表示します。つまり、メモリは共有するプロセス間で均等に分散されます(いずれかのプロセスによってコピーおよび共有解除されるまで)。

これはあなたが投稿したもののようなものを実行することからの抜粋です:

$ top
...
30986 me        20   0  790m 769m 2200 S    0  4.8   0:00.48 python3.2
30987 me        20   0  790m 767m  224 S    0  4.8   0:00.00 python3.2
$ cat /proc/30986/smaps
...
0119a000-015b7000 rw-p 00000000 00:00 0                                  [heap]
Size:               4212 kB
Rss:                3924 kB
Pss:                1992 kB
...
7fa06b020000-7fa09ab11000 rw-p 00000000 00:00 0 
Size:             781252 kB
Rss:              781252 kB
Pss:              390626 kB
...
7fff8e45a000-7fff8e489000 rw-p 00000000 00:00 0                          [stack]
Size:                192 kB
Rss:                 160 kB
Pss:                  82 kB
...

(これらのファイルには、多くのプロセス間で共有される可能性のある共有ライブラリのマッピングを含む、lotのものがたくさんあるため、各プロセスはごく一部しか取得しません。それらのPSSエントリで説明されています。)

これに関する素晴らしい記事は次のとおりです。ELC: アプリケーションが実際に使用しているメモリの量は?

この情報を表示するための一般的なトップのようなツールを私は知りません。また、残念ながらpsにそれを表示するオプションがあるとは思いません。この記事では、MattMackallによってpythonスクリプトが pagemap と呼ばれ、使用または適応できるスクリプトが含まれているリポジトリを示しています。

恥知らずなプラグイン:PSSとsmapsファイルに関するいくつかの投稿が nix&Linux にあります。

5
Mat