繁体   English   中英

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

[英]How to measure the memory usage of a process without calling an external program

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

$ ps -C processname -o size
 SIZE
 3808

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

在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 ()返回页面的大小(以字节为单位)。

您有几个选项可以找到程序的内存使用情况:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM