【问题标题】:process allocated memory blocks from kernel处理从内核分配的内存块
【发布时间】:2011-07-12 14:36:52
【问题描述】:

我需要对 linux 进程中分配的内存进行可靠的测量。我一直在研究mallinfo,但我读过it is deprecated。这种统计数据的最新替代方案是什么?

基本上我对至少两个数字感兴趣:

  • 任何 malloc 或任何使用所选 C 库的实现从内核分配的内存块/页面的数量(和大小)

  • (可选但仍然很重要)用户空间代码分配的内存数量(通过mallocnew 等)减去释放的内存(通过freedelete 等) )

我有一种可能性是override malloc calls with LD_PRELOAD,但它可能会在运行时引入不必要的开销,而且它可能无法与我正在使用的其他库正确交互,这些库也依赖于 LD_PRELOAD aop-ness。

我读到的另一种可能性是rusage

需要明确的是,这不是出于调试目的,内存使用是应用程序的固有特征(类似于显示已使用内存量的 Mathematica 或 Matlab,只是在块级)

【问题讨论】:

    标签: c linux memory-management


    【解决方案1】:

    为此 - 应用程序中的“内存使用”自检功能 - 最合适的接口是 malloc_hook(3)。这些是 GNU 扩展,允许您挂钩每个 malloc()realloc()free() 调用,从而维护您的统计信息。

    要从内核的角度查看应用程序映射了多少内存,您可以阅读并整理/proc/self/smaps 伪文件中的信息。这还可以让您查看每个分配中有多少是常驻的、交换的、共享的/私有的、干净的/脏的等。

    【讨论】:

      【解决方案2】:

      /proc/PID/status 包含一些有用的信息(例如,尝试运行 cat /proc/$$/status)。

      VmPeak 是您的进程在执行期间的最大虚拟内存空间。这包括映射到您的进程的所有页面,包括可执行页面、mmap'ed 文件、堆栈和堆。

      VmSize 是您的进程的虚拟内存空间的当前大小。

      VmRSS 是进程的驻留集大小;即,现在有多少占用了物理 RAM。 (一个典型的进程会有很多它从不使用的映射的东西,就像大多数 C 库一样。如果没有进程需要页面,最终它将被驱逐并变得非常驻。RSS 测​​量保持常驻并被映射的页面进入您的流程。)

      VmHWMVmRSS 的高水位线;即进程生命周期内的最高数字。

      VmData 是您的进程的“数据”段的大小;即,大致它的堆使用情况。请注意,从内核的角度来看,您已经完成 mallocfree 的小块仍将被使用;大块在释放时实际上会返回给内核。 (如果有记忆,“大”表示当前 glibc 大于 128k。)这可能最接近您正在寻找的内容。

      这些测量结果可能比尝试跟踪 malloc 和 free 更好,因为它们从系统范围的角度表明“真正发生了什么”。仅仅因为您在某些内存上调用了free(),并不意味着它已返回系统供其他进程使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-24
        • 2021-07-20
        • 2019-02-17
        • 2013-02-21
        • 2011-11-29
        • 2011-11-29
        • 2012-04-06
        • 1970-01-01
        相关资源
        最近更新 更多