如何在不调用外部程序的情况下测量进程的内存使用情况

时间:2012-08-16 08:53:03

标签: c unix memory process linux-kernel

运行以下内容可以显示进程的内存使用情况:

$ ps -C processname -o size
 SIZE
 3808

有没有办法在不执行ps(或任何外部程序)或阅读/proc的情况下检索此信息?

2 个答案:

答案 0 :(得分:7)

在Linux系统上,可以通过阅读/proc/[pid]/statm来查询进程的内存使用情况。其中[pid]是进程的PID。如果进程想要查询自己的数据,则可以通过阅读/proc/self/statm来实现。 man 5 proc说:

  

的/ proc / [PID] / statm

          Provides information about memory usage, measured in pages.  The
          columns are:

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              text       text (code)
              lib        library (unused in Linux 2.6)
              data       data + stack
              dt         dirty pages (unused in Linux 2.6)

您只需打开文件:fopen("/proc/self/statm", "r")并阅读内容。

由于文件会在“页面”中返回结果,因此您还需要查找页面大小。 getpagesize ()返回页面大小,以字节为单位。

答案 1 :(得分:0)

您可以通过以下几种方法找到程序的内存使用情况:

  • 在Valgrind或memprof等分析器中运行它。
  • exec / proc_open / fork一个新进程,可以像使用命令行一样使用pstoppmap
  • ps捆绑到您的应用中并直接使用它(当然是open source!)
  • 使用/proc系统(无论如何都是ps所做的那样......)
  • 创建内核报告,监视进程内存操作。 /proc文件系统只是内核数据结构的一个视图,所以这已经为你完成了。
  • 开发自己的机制来计算内存使用情况,无需内核帮助。

前者从系统管理的角度来看都是教育性的,并且是现实生活中最好的选择,但最后一个要点可能是最有趣的。您可能想要阅读Valgrind或memprof的源代码以了解它是如何工作的,但实际上您需要做的是在应用程序和内核之间插入机制,并拦截任何内存分配请求。此外,当进程启动时,您需要使用预设值(如0xDEADBEEF)初始化其内存空间。然后,在完成该过程后,您可以读取内存空间并计算除预设值之外的单词的出现次数,从而估计内存使用情况。

当然,事情总是比看起来更复杂。共享库使用的内存怎么样?管?您的进程与另一个进程之间共享内存系统调用?分配但未使用的虚拟内存?数据缓冲到磁盘?除了“流程记忆”之外,还有很多电话要求,请参阅this post了解其他一些问题。