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

我正在想象类似于/usr/bin/time的东西


当前回答

如果进程运行了至少几秒钟,那么您可以使用以下bash脚本,它将运行给定的命令行,然后将峰值RSS打印到stderr(替代RSS您感兴趣的任何其他属性)。它有点轻量,它适用于Ubuntu 9.04中包含的ps(我不能说时间)。

#!/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

其他回答

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

看起来/usr/bin/time确实给了你这个信息,如果你输入-v(这是在Ubuntu 8.10上)。例如,参见下面的最大常驻集大小:

$ /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

这里有一个单行程序,不需要任何外部脚本或实用程序,也不需要你通过Valgrind或time等其他程序启动进程,所以你可以将它用于任何已经运行的进程:

grep ^VmPeak /proc/$PID/status

(将$PID替换为您感兴趣的进程的PID)

使用Massif: http://valgrind.org/docs/manual/ms-manual.html

重新发明轮子,用手工制作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% 您的定制命令输出

在MacOS Sierra上使用:

/usr/bin/time -l commandToMeasure

你可以用grep获取你想要的。