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


Answers:


28

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

grep VmPeak /proc/$PID/status

(用$PID您感兴趣的过程的PID 代替)


4
如果我不知道PID怎么办?例如,当程序运行少量时间(<1s)时
diralik

4
“ VmHWM:峰值居民集大小”可能更适用于测量RAM使用情况(而不是VmPeak也包括很多其他内容)。
jfs

@jfs确实取决于您要查找的内容。IIRC VmPeak是包括虚拟内存在内的最大总内存使用量,而VmHWM是最大RAM使用量。因此,如果您想知道程序要求的内存总量,请使用VmPeak;如果您想知道在给定时间已使用了多少实际RAM,请使用VmHWM。
erobertc '19

1
@diralik如果正在检查自己编写的程序,则可以嵌入一行代码以查看“ / proc / self / status”文件。
Fileland

404

[ 编辑:在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

4
可能总是返回0,因为ls没有做太多事情。尝试使用更多占用CPU的命令。
乔恩·埃里克森

17
从手册页:时间显示的大多数信息均来自wait3(2)系统调用。这些数字仅与wait3(2)返回的数字一样好。在不具有返回状态信息的wait3(2)调用的系统上,将使用times(2)系统调用。但是,它提供的信息少于wait3(2),因此在那些系统上,时间将大多数资源报告为零。
lothar

79
“ bash:-v:找不到命令”表示bash截取了使用它自己的时间。/bin/time -v解决它。
gcb

3
快速检查以确保输出有意义是值得的。Gnu time有一个错误,它将报告实际内存使用量的4倍:stackoverflow.com/questions/10035232/…–
Ian

24
@skalee time -l在MacOS上尝试,给出类似的输出。
Volker Stolz 2013年

96

(这是一个已经回答的老问题。。,仅作记录:)

我受到了Yang的脚本的启发,并想到了这个名为memusg的小工具。我只是将采样率提高到0.1,以处理很多短暂的工作。我没有监视单个进程,而是使它度量了进程组的总和。(是的,我编写了许多单独的程序,这些程序可以一起工作)目前它可以在Mac OS X和Linux上运行。用法必须类似于time

memusg ls -alR /> / dev / null

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

拥有一个如此简单的工具,以便在开始进行任何认真的分析之前先看一下,是很好的。


1
所有仍然使用PS的方法仅有助于确定观察到的顶部内存。不是真正的顶级内存。您总是会错过一个间隔和另一个间隔之间的东西。
gcb

6
memusg脚本的输出单位是什么?字节?千字节?
Daniel Standage

1
@DanielStandage:可能以千字节为单位。它只是从BSD手册页ps -o rss=监视rss是进程的实际内存(驻留集)大小(以1024字节为单位)显示的值。
netj 2011年

3
@gcb那么,这就是测量样品时得到的。
Volker Stolz

2
答案中与memusg的链接似乎已断开。无论如何,/ usr / bin / time可以很好地做到这一点。
Tom Cornebize

65

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


14
time, 我要离开你。
jbeard4 2012年

1
方便的脚本,但是我在Slackware系统上需要sort -g(我想您正在寻找最高的价值)。
尼克·科尔曼

3
为+1 valgrind --massif。您也可以使用ms_print随附工具进行便捷的输出(包括一段时间内的ascii使用情况图表)
Eli Bendersky 2013年

7
Massif的开销比以前高得多time,在诸如这样的命令上花费至少10倍的时间ls
蒂莫西·古

8
确实太庞大了。这个答案应该提慢下来。我要测量的命令通常需要35秒才能完成。半个多小时前,我已经运行过此valgrind命令以对其进行测量,但它仍未完成…
unagi

35

在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
罗夫(Rolf)'18

2
两年前增加的答案是否已经覆盖这个理由?
查尔斯·达菲

34

也许(gnu)time(1)已经完成了您想要的。例如:

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

但是其他配置文件工具可能会根据您要查找的内容提供更准确的结果。


我似乎总是对此使用零,即使对于大型命令也是如此
jes5199

我得到了可变的结果,例如在同一程序上为400%0和0%0。
Liran Orevi

我不知道建议什么。上面的代码正是我运行的乳胶命令的历史记录。正如我所说,使用其他工具可以获得更准确的结果。
乔恩·埃里克森

2
至少可以在CentOS(因此,我敢打赌,RHEL)系统上运行。%P给出不相关的统计信息(%CPU),该统计信息取决于调度程序,因此变化很大。
Blaisorblade 2011年

2
@Deleteman:使用时time是内置命令csh。如果使用正确的路径,它将允许您运行外部命令。据我所知,只有GNU版本支持format选项。
乔恩·埃里克森

18

实际上,/ usr / bin / time可能会执行您想要的操作。就像是。

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

有关详细信息,请参见time(1)。


1
我似乎总是对此使用零,即使对于大型命令也是如此
jes5199

jes5199,Liran,看着上面的评论,似乎在某些linux上报告内存的时间(1)可能坏了
simon

在Ubuntu 16.04上,文本和数据为零,但max为非零并产生有意义的值。我很高兴
斯特凡·古里康

我希望那里的Mmax意味着我们想要的意思....手册页对此有点简洁
Matanster

17

在MacOS Sierra上使用:

/usr/bin/time -l commandToMeasure

您可以使用grep可能想要的东西。


5
这个!我实际上花了一个小时来尝试获取Instruments.app和dtrace,以便为我提供一个打开了系统完整性的内存配置文件(无法将其关闭),而我所需要的只是这个简单的命令。请注意,您可以使用command time -l代替它,/usr/bin/time -l这将导致您的shell实际调用一个被调用的二进制文件,time而不是内置函数。(是的,command不是占位符,command time不是time
唯一的

16

如果该过程至少运行了几秒钟,则可以使用以下bash脚本,该脚本将运行给定的命令行,然后打印以峰值strs替代RSS(用rss您感兴趣的任何其他属性替代)。它有些轻巧,并且可以与psUbuntu 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

1
此方法的主要缺点是,如果进程在短时间内(例如,即将结束)分配了很多内存,则可能无法检测到。减少睡眠时间可能会有所帮助。
vinc17


8

好吧,如果您真的想显示内存峰值和一些更深入的统计信息,我建议您使用探查器,例如valgrind。一个不错的valgrind前端是alleyoop



5

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


1

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

无论如何,跟踪rss和vss会产生误导,因为可以共享页面,这就是为什么memusg。您真正应该做的是跟踪Pssin /proc/[pid]/smaps或use 的总和pmapGNOME系统监视器曾经这样做,但是它太昂贵了。


1

用手工制作的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%

您的自定义命令输出


1

在macOS上,您可以改用DTrace。“ Instruments”应用程序是一个不错的GUI,它带有XCode afaik。



-2

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

抱歉,我是第一次来这里,只能问问题...

二手建议:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.