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


8

200MBのメモリを使用するプロセスがあり、fork()sを実行するとします。

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

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

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

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

回答:


5

そのような情報/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
...

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

ELC:アプリケーションが実際にどれだけのメモリを使用しているのですか?

私はこの情報を表示する一般的なトップライクなツールを知りませんpsし、残念ながらそれを表示するオプションもないと思います。この記事はpagemap、Matt Mackallが呼び出したPythonスクリプトを使用したリポジトリを示していますが、これを使用したり、変更したりすることができます。

恥知らずなプラグイン:興味がある場合は、PSSおよびファイルに関するUnixおよびLinuxの投稿をいくつか見つけますsmaps

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.