处理从内核分配的内存块

时间:2011-07-12 04:08:45

标签: c linux memory-management

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

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

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

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

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

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

要清楚,这是 NOT 用于调试目的,内存使用是应用程序的固有功能(类似于Mathematica或Matlab,显示使用的内存量,只有更准确的块级)

2 个答案:

答案 0 :(得分:4)

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

要查看应用程序从内核的角度映射了多少内存,您可以在/proc/self/smaps伪文件中读取和整理信息。这也可以让你看到每个分配有多少是驻留,交换,共享/私有,清理/脏等等。

答案 1 :(得分:3)

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

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

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

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

VmHWMVmRSS的高水位线;即该过程有效期内最高的数字。

VmData是流程“数据”细分的大小;即大致其堆使用情况。请注意,从内核的角度来看,您已经使用malloc然后free的小块仍将被使用;释放时,实际上会将大块返回给内核。 (如果内存服务,“大”意味着当前glibc大于128k。)这可能是你最接近你想要的。

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