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。
您可以/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
...
Run Code Online (Sandbox Code Playgroud)
(这些文件中有很多东西,包括可能在许多进程之间共享的共享库的映射,因此每个进程在其 PSS 条目中只占一小部分。)
这是一篇关于此的好文章:ELC:应用程序真正使用了多少内存?
我不知道有什么通用的类似 top 的工具来显示这些信息,而且我认为ps
不幸的是也没有选项可以显示这一点。这篇文章指向一个包含pagemap
由 Matt Mackall调用的Python 脚本的存储库,您可以使用或改编它。
无耻的插件:如果您对此感兴趣,您会在Unix 和 Linux上找到一些关于 PSS 和smaps
文件的帖子。
归档时间: |
|
查看次数: |
2640 次 |
最近记录: |