您如何衡量一组分叉进程的内存占用量?

Dus*_*ell 8 linux memory top virtual-memory

假设我有一个使用 200MB 内存的进程,它 fork()s:

python -c "import os; data='x'*200000000; os.fork(); raw_input()"
Run Code Online (Sandbox Code Playgroud)

像“top”这样的程序将显示每个进程使用 200MB,而 SHRd 内存很少,因此看起来好像这些进程总共使用了 400MB。但是,因为 fork() 为进程的内存页实现了写时复制 (COW),所以实际情况是进程总共只使用了 200MB。

为什么 top 不显示 COW 的内存比例?有没有办法让它这样做?或者我可以使用另一个命令吗?

注意:OSX 上的“top”似乎有一个 RSHRD 列,可以满足我的期望。我的问题是针对 Linux。

Mat*_*Mat 5

您可以/proc/<pid>/smapsPss条目的形式(“比例共享大小”的缩写)从每个进程的文件中获取此类信息。

在上面的示例中,两个进程之间“共享”了 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
...
Run Code Online (Sandbox Code Playgroud)

(这些文件中有很多东西,包括可能在许多进程之间共享的共享库的映射,因此每个进程在其 PSS 条目中只占一小部分。)

这是一篇关于此的好文章:ELC:应用程序真正使用了多少内存?

我不知道有什么通用的类似 top 的工具来显示这些信息,而且我认为ps不幸的是也没有选项可以显示这一点。这篇文章指向一个包含pagemap由 Matt Mackall调用的Python 脚本的存储库,您可以使用或改编它。

无耻的插件:如果您对此感兴趣,您会在Unix 和 Linux上找到一些关于 PSS 和smaps文件的帖子。