[英]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 ()
返回页面的大小(以字节为单位)。
您有几个选项可以找到程序的内存使用情况:
ps
, top
或pmap
就像从命令行那样 ps
捆绑到您的应用程序中并直接使用它(当然是开源的!) /proc
系统(这就是ps
所做的,无论如何...) /proc
文件系统只是内核数据结构的一个视图,所以这已经为你完成了。 从系统管理的角度来看,前者都是教育性的,并且是现实生活中最好的选择,但最后一个要点可能是最有趣的。 您可能想要阅读Valgrind或memprof的源代码以了解它是如何工作的,但实际上您需要做的是在应用程序和内核之间插入机制,并拦截任何内存分配请求。 此外,当进程启动时,您需要使用预设值(如0xDEADBEEF)初始化其内存空间。 然后,在完成该过程后,您可以读取内存空间并计算除预设值之外的单词的出现次数,从而估计内存使用情况。
当然,事情总是比看起来更复杂。 共享库使用的内存怎么样? 管? 您的进程与另一个进程之间共享内存 系统调用? 分配但未使用的虚拟内存? 数据缓冲到磁盘? 除了你的问题“过程记忆”之外,还有很多电话要求,请参阅这篇文章以了解其他一些问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.