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]/smapsPss的总和,或者使用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 . . .