linux / unix进程的最高内存使用率
是否有一个工具可以运行命令行并报告总共使用了多less内存?
我正在想象类似于/ usr / bin / time的东西
(这是一个已经回答,老问题..但只是为了logging:)
我被杨的脚本所启发,想出了这个名为memusg的小工具。 我只是把采样率提高到0.1来处理很短的生活过程。 我没有监视单个进程,而是测量进程组的rss总和。 (是的,我写了许多单独的程序,一起工作)它目前适用于Mac OS X和Linux。 使用必须与时间相似:
memusg ls -alR /> / dev / null
它只显示目前的高峰,但我有兴趣稍微扩展录制其他(粗略)统计。
在我们开始任何严肃的分析之前,有这么简单的工具来看看是很好的。
[ 编辑 :在Ubuntu 14.04上运行: /usr/bin/time -v command
确保使用完整path。]
看起来像/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 平均共享文本大小(千字节):0 平均非共享数据大小(千字节):0 平均堆栈大小(千字节):0 平均总大小(千字节):0 最大驻留集大小(千字节):0 平均居民套装尺寸(千字节):0 主要(需要I / O)页面错误:0 轻微(回收一帧)页面错误:315 自愿的上下文切换:2 非自愿的上下文切换:0 掉期:0 文件系统input:0 文件系统输出:0 套接字消息发送:0 套接字消息收到:0 信号交付:0 页面大小(字节):4096 退出状态:0
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
但其他分析工具可能会提供更准确的结果,具体取决于您正在查找的内容。
/ usr / bin /时间也许做你想要的,实际上。 就像是。
/ usr / bin / time --format ='(%Xtext +%Ddata%Mmax)'
详情请看时间(1)…
如果进程运行至less几秒钟,那么您可以使用以下bash脚本,它将运行给定的命令行,然后打印到峰值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
在MacOS Sierra上使用:
/usr/bin/time -l commandToMeasure
你可以使用grep
来取得你想要的。
那么,如果你真的想显示记忆峰值和一些更深入的统计数据,我build议使用如valgrind的分析器。 一个不错的valgrind前端是胡同 。
你可以使用像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
使用地块: http : //valgrind.org/docs/manual/ms-manual.html
'htop'是查看哪个进程正在使用多less内存的最佳命令…..
欲了解更多详情http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html
Heaptrack是具有GUI和文本界面的KDE工具。 我发现它比valgrind更适合了解进程的内存使用情况,因为它提供了更多的细节和火焰图。 它也更快,因为它没有检查valgrind。 它给你最高的内存使用量。
无论如何,跟踪rss和vss是误导,因为可以共享页面,这就是为什么memusg
。 你应该做的是跟踪/proc/[pid]/smaps
的Pss
的总和,或者使用pmap
。 GNOME系统监视器曾经这样做,但是它太昂贵了。
重新发明轮子,用手工制作脚本。 快速,干净。
我的用例:我想监视一个内存较less的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%
你的自定义命令输出
在Linux上:
使用/usr/bin/time -v <program> <args>
并查找“ 最大驻留集大小 ”。
(不要与Bash time
内置的命令混淆!所以使用完整path /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 . . .