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

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

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

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

像“top”这样的程序将显示每个进程使用 200MB,其中 SHRd 内存非常少,因此看起来好像进程总共使用了 400MB。但是,由于 fork() 为进程的内存页面实现了写时复制 (COW),因此实际上进程总共只使用了 200MB。

为什么 top 没有显示内存中 COW 的部分?有没有办法让它显示?或者我可以使用其他命令来代替?

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

答案1

您可以从每个流程的文件中以条目(“比例份额大小”的缩写)/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:应用程序实际使用了多少内存?

我不知道有什么常见的类似 top 的工具可以显示这些信息,而且ps不幸的是,我认为也没有选项可以显示这些信息。本文指向一个包含 python 脚本的存储库,名为pagemap您可以使用或改编 Matt Mackall 的作品。

无耻的宣传:你会发现一些帖子Unix 和 Linux关于PSS和smaps如果您对此感兴趣的话,请参阅

相关内容