是否有一种工具可以运行命令行并报告最高 RAM 使用总量?
我想象着类似于 /usr/bin/time 的东西。
是否有一种工具可以运行命令行并报告最高 RAM 使用总量?
我想象着类似于 /usr/bin/time 的东西。
[编辑:适用于Ubuntu 14.04:/usr/bin/time -v command
,请确保使用完整的路径。]
如果你在Ubuntu 8.10上使用/usr/bin/time
并传递-v
参数,似乎可以得到所需信息。例如,下面的输出中包含了最大常驻集大小
:
$ /usr/bin/time -v ls / .... 正在计时的命令:"ls /" 用户时间(秒):0.00 系统时间(秒):0.01 CPU使用率(百分比):250% 经过的时间(墙钟)(h:mm:ss 或 m:ss):0:00.00 平均共享文本大小(千字节):0 平均未共享数据大小(千字节):0 平均堆栈大小(千字节):0 平均总大小(千字节):0 最大常驻集大小(千字节):0 平均常驻集大小(千字节):0 主要(需要I/O)页面错误:0 次要(回收帧)页面错误:315 自愿上下文切换:2 非自愿上下文切换:0 页面交换:0 文件系统输入:0 文件系统输出:0 发送的Socket消息:0 接收的Socket消息:0 已传递的信号:0 页面大小(字节):4096 退出状态:0
(这是一个已经回答过的、古老的问题...但只是为了记录一下 :))
我受到Yang脚本的启发,设计了这个小工具,名为memusg。我将采样率增加到0.1以处理生命周期较短的进程。我不再监控单个进程,而是测量进程组的rss总和。(是的,我写了很多独立的程序来一起工作。)它目前支持Mac OS X和Linux。使用方法类似于time
:
memusg ls -alR / >/dev/null
目前它只显示峰值,但我对添加其他(粗略的)统计数据感兴趣。
有这样一个简单的工具,在开始任何严肃的性能分析之前,只需一瞥就能了解情况,非常好。
ps -o rss=
显示的值,其中rss是进程的实际内存(常驻集)大小(以1024字节为单位),这是从我的BSD手册中得到的信息。 - netjValgrind一行代码:
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
这会大大减慢命令的执行速度。
valgrind --massif
。你也可以使用附带的 ms_print
工具获取方便的输出(包括随时间变化的 ASCII 图表)。 - Eli Bendersky在 Linux 上:
使用/usr/bin/time -v <program> <args>
,并查找“最大常驻内存集大小”。
(不要与 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 <program> <args>
,查找"最大驻留集大小":
>/usr/bin/time -l ./myapp
0.01 real 0.00 user 0.00 sys
1440 maximum resident set size
. . .
sudo apt-get install time
安装 time
工具。 - Rolf这是一行代码,不需要任何外部脚本或工具,也不需要您通过Valgrind或时间之类的其他程序启动进程,因此您可以将其用于任何已经运行的进程:
grep ^VmPeak /proc/$PID/status
(用您感兴趣的进程的PID替换$PID
)
VmPeak
不应该有太大影响。导致系统内存耗尽的是VmHWM
。在实际RAM用尽之前,在64位操作系统上用尽虚拟内存是闻所未闻的。 - Mikko Rantalainen也许(gnu) time(1) 已经满足你的需求了。例如:
$ /usr/bin/time -f "%P %M" command
43% 821248
但是其他性能分析工具可能会根据您的需求提供更准确的结果。
在MacOS Sierra上使用:
/usr/bin/time -l commandToMeasure
您可以使用grep
来获取您想要的内容。
command time -l
而不是 /usr/bin/time -l
,这将导致您的shell实际调用名为 time
的二进制文件而不是内置函数。(是的, command
不是一个占位符, command time
不同于 time
.) - Jakub Arnold/usr/bin/time也许是你想要的,实际上就像这样。
/usr/bin/time --format='(%Xtext+%Ddata %Mmax)'
有关详细信息,请参见time(1)...
time -f '%M' <run_program>
/usr/bin/time
,以避免使用不支持 -f
的内置 time
关键字。 - pcworld如果该进程至少运行了几秒钟,您可以使用以下bash脚本,它将运行给定的命令行,然后向stderr输出峰值RSS(用其他您感兴趣的属性替换rss
)。 它相对轻量级,并且在Ubuntu 9.04中包含的ps
上适用于我(我不能这样说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
/bin/time -v
可以解决这个问题。 - gcbtime -l
命令,可以得到类似的输出结果。 - Volker Stolz