说我有一个使用200MB内存的进程,它fork()s:
python -c "import os; data='x'*200000000; os.fork(); raw_input()"
像“顶”这样的程序将显示每个使用200MB的进程,而SHRd内存很less,所以看起来好像进程总共使用了400MB。 但是,由于fork()为进程的内存页面实现了写入时拷贝(COW),实际上这些进程总共只用了200MB。
为什么不顶部显示内存的一部分是COW? 有没有办法让它这样做? 还是有另一个我可以使用的命令?
注意:在OSX上的“顶部”似乎有一个RSHRD列,做我所期望的。 我的问题是针对Linux。
您可以从每个进程的/proc/<pid>/smaps文件中以Pss条目(“比例共享大小”的缩写)forms获取这类信息。
在上面两个进程之间共享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: 应用程序真正使用了多less内存?
我不知道一个常见的顶级工具来显示这个信息,我不认为ps有select,不幸的是, 文章指向一个由Matt Mackall提供的名为pagemap的python脚本库,你可以使用或者修改它。
无耻的插件:如果你对此感兴趣的话,你可以在Unix和Linux上find关于PSS和smaps文件的文章。