Answers:
这是一种单行代码,不需要任何外部脚本或实用程序,也不需要您通过Valgrind或time之类的另一个程序来启动该过程,因此您可以将其用于已运行的任何过程:
grep VmPeak /proc/$PID/status
(用$PID
您感兴趣的过程的PID 代替)
[ 编辑:在Ubuntu 14.04上有效:/usr/bin/time -v command
确保使用完整路径。
像看起来/usr/bin/time
确实给你这些信息,如果传递-v
(这是在Ubuntu 8.10)。参见例如Maximum resident set size
下面:
$ / usr / bin / time -v ls / .... 命令被计时:“ ls /” 用户时间(秒):0.00 系统时间(秒):0.01 这项工作获得的CPU百分比:250% 经过(挂钟)时间(h:mm:ss或m:ss):0:00.00 平均共享文本大小(KB):0 平均未共享数据大小(千字节):0 平均堆栈大小(千字节):0 平均总大小(千字节):0 最大居民集大小(千字节):0 平均居民集大小(千字节):0 严重(需要I / O)页面错误:0 轻微(收回框架)页面错误:315 自愿上下文切换:2 非自愿上下文切换:0 掉期:0 文件系统输入:0 文件系统输出:0 发送的套接字消息:0 收到的套接字消息:0 传送信号:0 页面大小(字节):4096 退出状态:0
/bin/time -v
解决它。
time -l
在MacOS上尝试,给出类似的输出。
(这是一个已经回答的老问题。。,仅作记录:)
我受到了Yang的脚本的启发,并想到了这个名为memusg的小工具。我只是将采样率提高到0.1,以处理很多短暂的工作。我没有监视单个进程,而是使它度量了进程组的总和。(是的,我编写了许多单独的程序,这些程序可以一起工作)目前它可以在Mac OS X和Linux上运行。用法必须类似于time
:
memusg ls -alR /> / dev / null
它仅显示当前的峰值,但我对记录其他(粗糙)统计数据的细微扩展感兴趣。
拥有一个如此简单的工具,以便在开始进行任何认真的分析之前先看一下,是很好的。
ps -o rss=
监视rss是进程的实际内存(驻留集)大小(以1024字节为单位)显示的值。
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
time
, 我要离开你。
valgrind --massif
。您也可以使用ms_print
随附工具进行便捷的输出(包括一段时间内的ascii使用情况图表)
time
,在诸如这样的命令上花费至少10倍的时间ls
。
在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
也许(gnu)time(1)已经完成了您想要的。例如:
$ /usr/bin/time -f "%P %M" command
43% 821248
但是其他配置文件工具可能会根据您要查找的内容提供更准确的结果。
time
是内置命令csh
。如果使用正确的路径,它将允许您运行外部命令。据我所知,只有GNU版本支持format选项。
实际上,/ usr / bin / time可能会执行您想要的操作。就像是。
/ usr / bin / time --format ='(%Xtext +%Ddata%Mmax)'
有关详细信息,请参见time(1)。
如果该过程至少运行了几秒钟,则可以使用以下bash脚本,该脚本将运行给定的命令行,然后打印以峰值strs替代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
您可以使用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
Heaptrack是具有GUI和文本界面的KDE工具。我发现它比valgrind更适合理解进程的内存使用,因为它提供了更多的细节和火焰图。它也更快,因为它很少检查valgrind。它为您提供了峰值内存使用率。
无论如何,跟踪rss和vss会产生误导,因为可以共享页面,这就是为什么memusg
。您真正应该做的是跟踪Pss
in /proc/[pid]/smaps
或use 的总和pmap
。GNOME系统监视器曾经这样做,但是它太昂贵了。
用手工制作的bash脚本重新发明轮子。快速干净。
我的用例:我想监视一台具有更少RAM的linux机器,并希望在高负载情况下运行每个容器使用情况的快照。
#!/usr/bin/env bash
threshold=$1
echo "$(date '+%Y-%m-%d %H:%M:%S'): Running free memory monitor with threshold $threshold%.."
while(true)
freePercent=`free -m | grep Mem: | awk '{print ($7/$2)*100}'`
do
if (( $(awk 'BEGIN {print ("'$freePercent'" < "'$threshold'")}') ))
then
echo "$(date '+%Y-%m-%d %H:%M:%S'): Free memory $freePercent% is less than $threshold%"
free -m
docker stats --no-stream
sleep 60
echo ""
else
echo "$(date '+%Y-%m-%d %H:%M:%S'): Sufficient free memory available: $freePercent%"
fi
sleep 30
done
样本输出:
2017-10-12 13:29:33:正在运行阈值为30%的空闲内存监视器..
2017-10-12 13:29:33:足够的可用内存:69.4567%
2017-10-12 13:30:03:足够的可用内存:69.4567%
2017-10-12 16:47:02:可用内存18.9387%小于30%
您的自定义命令输出
“ htop”是最好的命令,用于查看哪个进程正在使用多少内存.....
有关更多详细信息,请访问 http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html
请务必回答问题。提供详细信息并分享您的研究!
抱歉,我是第一次来这里,只能问问题...
二手建议:
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
然后:
grep mem_heap_B massif.out
...
mem_heap_B=1150976
mem_heap_B=1150976
...
这与top
命令在相同时刻显示的内容有很大不同:
14673 gu27mox 20 0 3280404 468380 19176 R 100.0 2.9 6:08.84 pwanew_3pic_com
Valgrind的测量单位是什么?
在/usr/bin/time -v ./test.sh
根本没有回答-你必须直接喂可执行/usr/bin/time
,如:
/usr/bin/time -v pwanew_3pic_compass_2008florian3_dfunc.static card_0.100-0.141_31212_resubmit1.dat_1.140_1.180 1.140 1.180 31212
Command being timed: "pwanew_3pic_compass_2008florian3_dfunc.static card_0.100-0.141_31212_resubmit1.dat_1.140_1.180 1.140 1.180 31212"
User time (seconds): 1468.44
System time (seconds): 7.37
Percent of CPU this job got: 99%
Elapsed (wall clock) time (h:mm:ss or m:ss): 24:37.14
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): 574844
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 74
Minor (reclaiming a frame) page faults: 468880
Voluntary context switches: 1190
Involuntary context switches: 20534
Swaps: 0
File system inputs: 81128
File system outputs: 1264
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0