我想测量程序执行期间使用的总内存(如 RAM)。理想情况下,类似这样time
的程序会运行程序并在程序退出时打印统计信息。
在 unix / linux / bsd 世界中是否存在这样的标准工具?谢谢。
编辑:
我试图分析的程序需要几分之一秒的时间来执行,所以任何暗示“运行时检查这个”的东西都不会起作用。这就是为什么我需要一个像“时间”这样的工具。
答案1
这个strace
命令可能有用。它会告诉你哪些系统调用占用了时间:
$ strace -cTv zip /tmp/test.zip /usr/share/dict/words
adding: usr/share/dict/words (deflated 73%)
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00 0.000055 2 34 read
0.00 0.000000 0 21 write
0.00 0.000000 0 12 3 open
0.00 0.000000 0 9 close
0.00 0.000000 0 3 3 access
0.00 0.000000 0 1 rename
0.00 0.000000 0 3 brk
0.00 0.000000 0 1 gettimeofday
0.00 0.000000 0 4 munmap
0.00 0.000000 0 3 mprotect
0.00 0.000000 0 6 _llseek
0.00 0.000000 0 6 rt_sigaction
0.00 0.000000 0 12 mmap2
0.00 0.000000 0 8 1 stat64
0.00 0.000000 0 1 1 lstat64
0.00 0.000000 0 9 fstat64
0.00 0.000000 0 1 fcntl64
0.00 0.000000 0 1 set_thread_area
------ ----------- ----------- --------- --------- ----------------
100.00 0.000055 141 8 total
答案2
在 Linux 上,您可以读取 /proc/[pid]/status;VmPeak 字段是最大虚拟内存大小,VmHWM 是最大驻留集大小。
getrusage() 系统调用可能会有所帮助,也可能不会。struct rusage 包含例如 maxrss 字段,但至少在 Linux 上从未填写过该字段。
答案3
如果您不介意重复执行几次,您可以使用 ulimit -Hv 来设置 shell 的内存限制(在 Bash 中),然后在应用程序成功退出时对最小值进行二进制搜索。
答案4
ps
除了(选项/输出方面也不太标准)没有其他标准工具。这不会给您带来time
类似的可用性。
您可以使用它nmon
来收集系统范围的统计数据,它可以捕获进程的内存使用情况(对于短暂的进程可能没用)。它支持许多平台。