C 处理从内核分配的内存块

C 处理从内核分配的内存块,c,linux,memory-management,C,Linux,Memory Management,我需要对linux进程中分配的内存进行可靠测量。我一直在调查,但我已经读过了。这类统计的最新替代方案是什么 基本上,我对至少两个数字感兴趣: 任何malloc或任何使用所选C库的实现从内核分配的内存块/页的数量和大小 通过malloc、new等用户空间代码分配的可选但仍然重要的内存数减去通过free、delete等释放的内存数 我有一种可能性,但它可能会在运行时引入不必要的开销,也可能无法与我正在使用的其他库正确交互,这些库也依赖于LD_预加载aop 我读到的另一个可能性是 明确地说,这不是为了

我需要对linux进程中分配的内存进行可靠测量。我一直在调查,但我已经读过了。这类统计的最新替代方案是什么

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

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

通过malloc、new等用户空间代码分配的可选但仍然重要的内存数减去通过free、delete等释放的内存数

我有一种可能性,但它可能会在运行时引入不必要的开销,也可能无法与我正在使用的其他库正确交互,这些库也依赖于LD_预加载aop

我读到的另一个可能性是


明确地说,这不是为了调试,内存使用是应用程序的固有特性,类似于Mathematica或Matlab,显示使用的内存量,只有在块级别更精确的接口(应用程序中的内存使用自省功能)才是最合适的接口malloc_hook3。这些是GNU扩展,允许您钩住每一个malloc、realloc和free调用,维护您的统计数据


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

为此,应用程序中的内存使用自省功能—最合适的接口是malloc_hook3。这些是GNU扩展,允许您钩住每一个malloc、realloc和free调用,维护您的统计数据

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

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

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

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

VmRSS是进程的常驻集大小;i、 例如,现在有多少内存占用了物理内存。一个典型的进程将有许多它从未使用过的映射内容,就像大多数C库一样。如果没有进程需要一个页面,最终它将被逐出并成为非常驻页面。RSS测量仍然驻留并映射到流程中的页面

VmHWM是VmRSS的高水位线;i、 e.在工艺生命周期内,该数值最高

VmData是流程数据段的大小;i、 例如,它的堆使用情况。请注意,从内核的角度来看,您在其上完成malloc然后释放的小块仍将被使用;释放时,大的块实际上会返回到内核。如果内存可用,大表示当前glibc大于128k。这可能是最接近你正在寻找的

这些度量可能比试图跟踪malloc和free要好,因为它们从系统范围的角度指示了真正发生的事情。仅仅因为您调用了一些内存上的free,这并不意味着它已返回到系统供其他进程使用。

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

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

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

VmRSS是进程的常驻集大小;i、 例如,现在有多少内存占用了物理内存。一个典型的进程将有许多它从未使用过的映射内容,就像大多数C库一样。如果没有进程需要一个页面,最终它将被逐出并成为非常驻页面。RSS测量仍然驻留并映射到流程中的页面

VmHWM是VmRSS的高水位线;i、 e.在工艺生命周期内,该数值最高

VmData是流程数据段的大小;i、 例如,它的堆使用情况。请注意,从内核的角度来看,您在其上完成malloc然后释放的小块仍将被使用;释放时,大的块实际上会返回到内核。如果内存可用,大表示当前glibc大于128k。这可能是最接近你所看到的 g代表

这些度量可能比试图跟踪malloc和free要好,因为它们从系统范围的角度指示了真正发生的事情。仅仅因为您调用了一些内存上的free,这并不意味着它已返回到系统供其他进程使用