获取 Linux 可执行文件的最大内存使用量

获取 Linux 可执行文件的最大内存使用量

我需要一个 shell 脚本来获取 Linux 可执行文件的最大内存消耗。可执行文件可能会生成使用大量 RAM 的子进程,这些 RAM 应该包含在总内存消耗中。

我已经尝试过/usr/bin/time -f "%M" /path/to/executable,但是这总是会产生效果,0尽管使用ps我可以验证该过程确实消耗了大量 RAM。

为什么总是time给我0时间,我怎样才能获得我想要的号码?

答案1

我认为time -f %M它只在较新的 Linux 内核中有效(实验上,它在 2.6.26/amd64 中不受支持,但在 2.6.32/i386 中受支持)。

Stack Overflow 上的早期帖子没有出现太多情况。

如果没有内核支持,监控内存使用情况相当困难。有几种方法可以做到:

  • LD_PRELOADmmap一个重载和其他内存分配系统调用的小型库sbrk(假设您不运行任何静态二进制文件)。
  • ptrace进程确实监视内存的分配和分叉。
  • 观察/proc/(仅适用于单个过程,并且您不知道措施之间发生了什么)。

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

答案2

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

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

为了做到这一点,它将进程放入其自己的 cgroup 中。

例如,进程 A 分配 10 MiB,并派生出一个子进程 B,后者分配 20 MiB,后者派生出一个子进程 C,后者分配 30 MiB。这三个进程共享一个时间窗口,在此期间,它们的分配将产生相应的 RSS(驻留集大小)内存使用量。

现在的问题是:运行 A 实际使用了多少内存?

答案:60 MiB

cgmemtime 就是用来回答此类问题的工具。

答案3

pmap显示分配给进程的所有内存,甚至显示总数。检测子进程比较困难,也许可以结合使用,strace但我想不出简单的方法。

答案4

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

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

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

RSS 是驻留集大小,是运行 ps 时进程实际使用的内存量。

检查你的人 ps列出流程树的选项页面。

相关内容