2011-07-12 178 views
1

我需要在linux进程中有可靠的分配内存测量。我一直在寻找mallinfo,但我读过it is deprecated。这种统计数据的最新状态是什么?进程从内核分配内存块

基本上我很感兴趣,至少有两个数字:任何malloc

  • 号(和大小)从内核分配的内存块/页或任何实现使用选择

  • 的C库
  • (可选的,但仍然是重要的)数量的所分配的存储器的由用户空间代码(通过mallocnew等)减去由它的解除分配的存储器(经由freedelete等)

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

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

需要明确的是,这是NOT用于调试目的,存储器使用率(即在块级显示的存储器使用量,只有更精确类似于数学或Matlab)的应用程序的固有特征

回答

3

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

VmPeak是进程的虚拟内存空间在执行过程中变得最大。这包括映射到流程中的所有页面,包括可执行页面,mmap文件,堆栈和堆。

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

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

VmHWM是的高水位标记;即在该过程的整个生命周期中该数字的最高值。

VmData是进程“数据”段的大小;即,大概是它的堆使用率。请注意,从内核的角度来看,您已完成malloc,然后free的小块仍将被使用;释放大块实际上会返回到内核。 (如果内存有效,“大”意味着当前glibc的大于128k)。这可能与您正在查找的内容最接近。

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

+0

+1:很好的答案,很好的解释个人价值! –

4

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

要从内核的角度来看应用程序映射了多少内存,您可以阅读并整理/proc/self/smaps伪文件中的信息。这也可以让你了解每个分配的多少是居民,交换,共享/私营,清洁/肮脏等