【问题标题】:Calculating memory of a Process using Proc file system使用 Proc 文件系统计算进程的内存
【发布时间】:2014-04-29 23:48:51
【问题描述】:

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

【问题讨论】:

    标签: linux perl memory


    【解决方案1】:

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

    • size 总程序大小
      • 这是整个程序,包括从未交换过的东西
    • resident resident set 大小
      • 当前在 RAM 中的内容(这不包括换出的页面)

    【讨论】:

    • 感谢您的回复。坦率地说,我不回答。实际上我想计算进程的内存使用量。那么哪个更适合呢?
    【解决方案2】:

    很难知道进程的“内存使用量”是多少。 VM 大小和 RSS 是已知的、可测量的值。

    但你可能想要的是别的东西。在实践中,“VM 大小”似乎太高,而 RSS 往往又太低。

    主要问题有:

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

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

    在我看来,逻辑上是这样的:

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

    我不知道有什么实用程序可以做到这一点。不过,这似乎并不简单,并且涉及(至少)读取 /proc/pid/pagemap 和可能的其他一些 /proc 接口,其中一些是 root-only。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-05-04
        • 2015-06-20
        • 1970-01-01
        • 1970-01-01
        • 2018-12-09
        • 1970-01-01
        • 1970-01-01
        • 2019-04-07
        • 1970-01-01
        相关资源
        最近更新 更多