linux / unix进程的峰值内存使用情况

时间:2009-04-21 20:55:26

标签: linux command-line memory-management

是否有一个工具可以运行命令行并报告峰值RAM使用总量?

我在想象类似于/ usr / bin / time

的东西

20 个答案:

答案 0 :(得分:349)

[编辑:适用于Ubuntu 14.04:/usr/bin/time -v command确保使用完整路径。]

如果您传递/usr/bin/time(这是在Ubuntu 8.10上),-v看起来会为您提供该信息。例如,参见下面的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

答案 1 :(得分:91)

(这是一个已经回答的老问题..但仅供记录:)

我受到杨的剧本的启发,并提出了这个名为memusg的小工具。我只是将采样率提高到0.1来处理很短的生活过程。我没有监控单个进程,而是测量进程组的rss总和。 (是的,我写了很多单独的程序一起工作)它目前适用于Mac OS X和Linux。用法必须类似于time

memusg ls -alR / >/dev/null

它只显示当前的峰值,但我对记录其他(粗略)统计数据的轻微扩展感兴趣。

在我们开始任何严肃的分析之前,有一个这么简单的工具可以看看。

答案 2 :(得分:61)

Valgrind one-liner:

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

答案 3 :(得分:26)

也许(gnu)time(1)已经做了你想要的。例如:

$ /usr/bin/time -f "%P %M" command
43% 821248

但是其他分析工具可能会根据您的需求提供更准确的结果。

答案 4 :(得分:17)

实际上,

/ usr / bin / time可能会做你想要的。像。的东西。

 /usr/bin/time --format='(%Xtext+%Ddata %Mmax)'

详情见时间(1)......

答案 5 :(得分:15)

如果进程运行至少几秒钟,那么您可以使用以下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

答案 6 :(得分:15)

在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
      . . .

答案 7 :(得分:13)

在MacOS Sierra上使用:

/usr/bin/time -l commandToMeasure

您可以使用grep来获取您想要的内容。

答案 8 :(得分:7)

好吧,如果你真的想要显示内存峰值和一些更深入的统计数据,我建议使用valgrind等分析器。一个不错的valgrind前端是alleyoop

答案 9 :(得分:5)

这里是一种单行代码,不需要任何外部脚本或实用程序,也不需要您通过Valgrind或time之类的另一个程序来启动该过程,因此您可以将其用于已经运行的任何过程:

grep VmPeak /proc/$PID/status

(用您感兴趣的进程的PID替换$PID

答案 10 :(得分:4)

您可以使用Valgrind之类的工具来执行此操作。

答案 11 :(得分:4)

time -f '%M' <run_program>

答案 12 :(得分:4)

这是(基于其他答案)一个非常简单的脚本,它监视已经运行的进程。您只需使用要作为参数观察的进程的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

答案 13 :(得分:2)

由于许多现代发行版中都不存在/usr/bin/time(而是Bash内置时间),因此可以将Busybox时间实现与-v参数一起使用:

busybox time -v uname -r

其输出类似于GNU时间输出。 大多数Linux发行版(Debian,Ubuntu等)中都已预先安装Busybox。如果您使用Arch Linux,则可以使用以下命令进行安装:

sudo pacman -S busybox

答案 14 :(得分:1)

Heaptrack是具有GUI和文本界面的KDE工具。我发现它比valgrind更适合理解进程的内存使用情况,因为它提供了更多细节和火焰图。它也更快,因为它更少检查valgrind。它为您提供了最大的内存使用率。

无论如何,跟踪rss和vss是误导性的,因为页面可以共享,这就是memusg的原因。您应该做的是跟踪Pss/proc/[pid]/smaps的总和或使用pmapGNOME system-monitor曾经这样做过但是太贵了。

答案 15 :(得分:1)

答案 16 :(得分:0)

用手工制作的bash脚本重新发明轮子。快速而干净。

我的用例:我想监控一台内存较少的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%

     

您的自定义命令输出

答案 17 :(得分:0)

在macOS上,您可以使用DTrace。 “仪器”应用程序是一个很好的GUI,它带有XCode afaik。

答案 18 :(得分:-1)

'htop'是查看哪个进程正在使用多少RAM的最佳命令.....

了解更多细节 http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html

答案 19 :(得分:-3)

  
    

请务必回答问题。提供详细信息并分享您的研究!

  

对不起,我是第一次来这里,只能问问题...

使用建议:

valgrind --tool = massif --pages-as-heap =是--massif-out-file = massif.out ./test.sh; grep mem_heap_B massif.out | sed -e's / mem_heap_B =(。*)/ \ 1 /'|排序-g |尾-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的测量单位是什么?

The

/ 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