*nix 测量内存使用情况

*nix 测量内存使用情况

我想测量程序执行期间使用的总内存(如 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来收集系统范围的统计数据,它可以捕获进程的内存使用情况(对于短暂的进程可能没用)。它支持许多平台。

相关内容