获得最大的Linux可执行文件内存使用率

我需要一个shell脚本来检索linux可执行文件的最大内存消耗。 可执行文件可能会使用大量的应该包含在总数中的RAM来产生subprocess。

我已经试过/usr/bin/time -f "%M" /path/to/executable ,但是这总是会产生0虽然使用ps我可以validation这个进程是否确实消耗大量的RAM。

为什么time总是给我0 ,我怎么能得到我要找的数字?

我认为time -f %M只适用于最近的Linux内核(实验中,2.6.26 / amd64不支持,2.6.32 / i386支持)。

Stack Overflow中的一个较早的线程没有太多的变化。

如果没有内核支持,监视内存的使用是相当困难的 有几种方法可以做到这一点:

  • LD_PRELOAD一个小型库,它重载mmapsbrk和其他内存分配系统调用(假设你不运行任何静态二进制文件)。
  • ptrace进程确实监视内存分配和分配。
  • 监视/proc/ (仅适用于单个进程,而且您不知道在度量之间会发生什么)。

这些方法都需要编程; 我不知道现有的工具。

pmap显示了分配给进程的所有内存,甚至给出了总数。 检测subprocess比较困难,你可以把它和strace结合起来,但是我不能简单地想到做到这一点。

ps命令可用于测量每个进程使用的内存量。

%MEM显示进程使用的物理内存的百分比。 尽pipe并不总是完整的画面,但它可以识别负责系统分页和交换的过程。

SZ显示进程的近似虚拟大小。

RSS是Resident Set的大小,是运行ps时进程正在使用的实际内存量。

检查你的man ps页面列出进程树的选项。

我build议使用https://github.com/gsauthof/cgmemtime

cgmemtime衡量进程及其后代进程的高水RSS + CACHE内存使用情况。

为了能够这样做,它把进程放到它自己的cgroup中。

例如,过程A分配10 MiB,并分配一个分配20 MiB的子B,并分配一个30 MiB的子C。 所有这三个进程共享一个时间窗口,在这个窗口的分配导致相应的RSS(驻留集大小)内存使用量。

现在的问题是:作为运行A的结果,实际使用了多less内存?

答案:60 MiB

cgmemtime是解决这些问题的工具。