我需要一个 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_PRELOAD
mmap
一个重载和其他内存分配系统调用的小型库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列出流程树的选项页面。