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


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上的“顶部”似乎有一个RSHRD列,可以满足我的期望。我的问题是针对Linux。

Answers:


5

您可以从/proc/<pid>/smaps文件中以Pss条目的形式(“比例共享大小”的缩写)形式获得有关此类信息。

在上面的示例中,两个进程之间“共享”了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脚本的存储库,您可以使用或改编它。

无耻的插件:如果您对此感兴趣,可以在Unix&Linux上找到一些有关PSS和smaps文件的文章。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.