使用Proc文件系统计算Process的内存

时间:2011-11-25 06:34:12

标签: linux perl memory

我正在通过从Proc文件系统读取值来编写Perl中的小进程监视器脚本。现在我可以使用 / proc / [pid] / status / proc / [pid] / io 来获取线程数,进程状态,读写字节数strong>文件。现在我想计算一个进程的内存使用情况。搜索后,我开始知道内存使用情况 / proc / [pid] / statm 。但我仍然无法弄清楚该文件需要哪些必要字段来计算内存使用量。谁可以帮我这个事?提前致谢。

3 个答案:

答案 0 :(得分:2)

您可能想要residentsize。来自kernel.org

  • 大小总计划大小
    • 这是整个程序,包括从未交换过的东西
  • 居民居民的规模
    • 当前时刻在RAM中的内容(这不包括换出的页面)

答案 1 :(得分:2)

很难知道某个进程的“内存使用情况”是什么。 VM大小和RSS是已知的,可测量的值。

但你可能想要的是别的东西。在实践中,“VM大小”似乎太高,RSS通常看起来太低。

主要问题是:

  • 多个进程可以共享相同的页面。您可以添加所有正在运行的进程的RSS,最终得到的不仅仅是计算机的物理内存(这是在计算内核数据结构之前)。
  • 可以换出属于该进程的私有页面。或者它们可能尚未初始化。他们算了吗?
  • 您如何统计内存映射文件页面?肮脏的?干净的? MAP_SHARED或MAP_PRIVATE的那些?

所以你真的需要考虑什么算作“内存使用”。

在我看来,逻辑上:

  • 不与任何其他进程共享的私有页面(注意:私有页面仍然可以写入!)即使换出也必须计数
  • 共享页面应该计算除以它们共享的进程数量,例如由两个进程共享的页面计数一半
  • 驻留的文件支持页面可以以相同的方式计数
  • 可以忽略文件支持的非驻留页面
  • 如果同一页面被多次映射到同一进程的地址空间,则可以在第二次和以后的时间忽略它。这意味着如果proc 1的页面X映射了两次,而proc 2的页面X映射了一次,则它们都被“收费”了半页。

我不知道有什么用处。它似乎很重要,并且涉及(至少)读取/ proc / pid / pagemap以及可能的一些其他/ proc接口,其中一些只是root用户。

答案 2 :(得分:1)

另一种(不太简单但更精确)的可能性是解析/proc/123/maps文件,可能使用pmap实用程序。它为您提供有关“虚拟内存”的信息(即进程的地址空间)。