是否有一个工具可以运行命令行并报告总共使用了多少RAM?
我在想象类似于/ usr/bin/time的东西
[ 编辑:适用于Ubuntu 14.04:/usr/bin/time -v command
确保使用完整路径.]
看起来/usr/bin/time
确实给你这个信息,如果你通过-v
(这是在Ubuntu 8.10).参见,例如,Maximum resident set size
下面:
$ /usr/bin/time -v ls / .... Command being timed: "ls /" User time (seconds): 0.00 System time (seconds): 0.01 Percent of CPU this job got: 250% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 0 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 315 Voluntary context switches: 2 Involuntary context switches: 0 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
(这是一个已经回答的老问题..但仅仅是为了记录:)
我受到杨的剧本的启发,并提出了这个名为memusg的小工具.我只是将采样率提高到0.1来处理很短的生活过程.我没有监控单个进程,而是测量进程组的rss总和.(是的,我写了很多单独的程序一起工作)它目前适用于Mac OS X和Linux.用法必须类似于time
:
memusg ls -alR / >/dev/null
它只显示当前的峰值,但我对记录其他(粗略)统计数据的轻微扩展感兴趣.
在我们开始任何严肃的分析之前,有这么简单的工具来看看它是很好的.
Valgrind单线:
valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1
注意使用--pages-as-heap来测量进程中的所有内存.更多信息:http://valgrind.org/docs/manual/ms-manual.html
也许(gnu)时间(1)已经做了你想要的.例如:
$ /usr/bin/time -f "%P %M" command 43% 821248
但是其他分析工具可能会根据您的需求提供更准确的结果.
在Linux上:
使用/usr/bin/time -v
并查找" 最大驻留集大小 ".
(不要与Bash time
内置命令混淆!所以使用完整路径,/usr/bin/time
)
例如:
> /usr/bin/time -v ./myapp User time (seconds): 0.00 . . . Maximum resident set size (kbytes): 2792 . . .
在BSD上,MacOS:
使用/usr/bin/time -l
,寻找" 最大居民集大小 ":
>/usr/bin/time -l ./myapp 0.01 real 0.00 user 0.00 sys 1440 maximum resident set size . . .
实际上/ usr/bin/time可能会做你想要的.就像是.
/usr/bin/time --format='(%Xtext+%Ddata %Mmax)'
详情请见时间(1)
这是一种单行代码,不需要任何外部脚本或实用程序,也不需要您通过Valgrind或time之类的另一个程序来启动该过程,因此您可以将其用于已运行的任何过程:
grep VmPeak /proc/$PID/status
(用$PID
您感兴趣的过程的PID 代替)
如果进程运行至少几秒钟,那么您可以使用以下bash脚本,它将运行给定的命令行,然后打印到stderr峰值RSS(替换rss
您感兴趣的任何其他属性).它有点轻量级,它适用于我使用ps
Ubuntu 9.04(我不能说time
).
#!/usr/bin/env bash "$@" & # Run the given command line in the background. pid=$! peak=0 while true; do sleep 1 sample="$(ps -o rss= $pid 2> /dev/null)" || break let peak='sample > peak ? sample : peak' done echo "Peak: $peak" 1>&2
在MacOS Sierra上使用:
/usr/bin/time -l commandToMeasure
您可以使用grep
您想要的东西.
好吧,如果你真的想要显示内存峰值和一些更深入的统计数据,我建议使用诸如valgrind之类的分析器.一个漂亮的valgrind前端是alleyoop.
time -f '%M'
您可以使用Valgrind之类的工具来执行此操作。
(根据其他答案)这是一个非常简单的脚本,用于监视已经运行的进程。您只需使用要监视的进程的pid作为参数来运行它:
#!/usr/bin/env bash pid=$1 while ps $pid >/dev/null do ps -o vsz= ${pid} sleep 1 done | sort -n | tail -n1
用法示例:
max_mem_usage.sh 23423