linux中长时间运行进程的峰值内存测量

时间:2009-07-03 18:49:50

标签: linux memory

如何监控Linux中进程消耗的峰值内存? 这不是我可以在内部修改以测量峰值内存使用的程序。

我真的不想要详细的测量,我也不希望它们过度减慢我的程序..所以valgrind或任何重量级的东西都不是我想要的... 和之前的其他帖子[Peak memory usage of a linux/unix process一样,时间-v似乎没有为我的机器报告内存......

我可以运行top或ps并提取内存消耗的字符串 我的进程ID使用一个简单的脚本。但是,我的过程运行大约20-30分钟,所以我希望能够记录并获得最大值。 我可以忍受粗粒样品......每1分钟左右...具体如何 - >> 1.在zsh中分享这个简单的mem-measure脚本? 2.当测试过程结束时杀死它?

9 个答案:

答案 0 :(得分:6)

只需使用top -n迭代指定的次数,然后使用-d在更新之间进行延迟。此外,您只需抓取其pid即可获取与您的流程相关的输出,例如:

top -n 30 -d 60 | grep <process-id>

阅读顶部手册页以获取更多信息

man top

当然,您也可以使用awk获取所需的列。

答案 1 :(得分:2)

实际上,我之前说的是:

“”“

/usr/bin/time -v yourcommand

应该有所帮助。如果你只使用“时间”,bash将执行内置(没有“-v”)

“”“

不起作用(返回0)。

我制作了以下perl脚本(我称之为smaps):

#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
my $max = 0;
while( open my $f, '<', "/proc/$ARGV[0]/smaps" ) {
  local $/; $_ = <$f>;
  $max = $1 if /Rss:\s*(\d+)/ and $1 > $max;
  open my $g, '>', '/tmp/max';
  say $g $max
}

然后我调用它(例如,观察qgit的内存使用情况):

bash -c './smaps $$ & exec qgit'

使用单引号,以便“daughter”shell解释$$(在exec之后将是qgit的相同PID)。 这个答案,我测试过:-D

HTH

答案 2 :(得分:2)

带有Valgrind

massif不应该太重,但是,我建议使用/ proc。您可以轻松编写自己的监视器脚本。这是我的,为了您的方便:

#!/bin/bash

ppid=$$
maxmem=0

$@ &
pid=`pgrep -P ${ppid} -n -f $1` # $! may work here but not later
while [[ ${pid} -ne "" ]]; do
    #mem=`ps v | grep "^[ ]*${pid}" | awk '{print $8}'`
        #the previous does not work with MPI
        mem=`cat /proc/${pid}/status | grep VmRSS | awk '{print $2}'`
    if [[ ${mem} -gt ${maxmem} ]]; then
        maxmem=${mem}
    fi
    sleep 1
    savedpid=${pid}
    pid=`pgrep -P ${ppid} -n -f $1`
done
wait ${savedpid} # don't wait, job is finished
exitstatus=$?   # catch the exit status of wait, the same of $@
echo -e "Memory usage for $@ is: ${maxmem} KB. Exit status: ${exitstatus}\n"

答案 3 :(得分:1)

您可以使用munin-node插件来执行此操作,但它有点重量级。 http://munin.projects.linpro.no/

答案 4 :(得分:1)

/ proc / pid / smaps,就像/ proc / pid / maps一样,只提供有关虚拟内存映射的信息,而不是实际的物理内存使用情况。 top和ps给出RSS,这取决于你想知道的内容,可能不是内存使用的一个很好的指标。

如果您在2.6.28.7之后的Linux内核上运行,那么可以使用Pagemap功能。在www.eqware.net/Articles/CapturingProcessMemoryUsageUnderLinux讨论了一些工具的来源和来源。

页面收集工具旨在捕获所有进程的内存使用情况,因此可能会产生比您想要的更大的CPU负担。但是,您应该可以轻松地对其进行修改,以便仅捕获特定进程ID的数据。这样可以减少开销,以便您可以每隔几秒轻松运行一次。我还没有尝试过,但我认为页面分析工具应该不加改变地运行。

EQvan

答案 5 :(得分:1)

这取决于您要监控的内存类型。

通过对所有进程的数量(不是所有线程的)进行排序来监视以下M.a.p.d,可以监视每个进程使用的malloc物理内存。

你可以写一个c程序,使它更快,但我认为awk是这个目的的最低选择。

  • M.a匿名映射内存
    • .p私有
      • .d dirty == malloc / mmapped堆和堆栈分配和写入内存
      • .c clean == malloc / mmapped堆和堆栈内存一旦分配,写入,然后释放,但尚未回收
    • .s分享
      • .d dirty ==应该没有
      • .c clean ==应该没有
  • M.n命名映射内存
    • .p私有
      • .d dirty == file mmapped write memory private
      • .c clean ==映射程序/库文本私有映射
    • .s分享
      • .d dirty ==文件mmapped书面内存共享
      • .c clean ==映射库文本共享映射

我更希望获得如下数字,以获得最少开销的实数 你必须总结这些以便将ps显示为RSS并且获得更准确的数字而不要混淆。

M.a.p.d:

 awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Dirty/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps

M.a.p.c:

 awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Clean/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps

M.n.p.d:......等等

答案 6 :(得分:1)

为什么不直接处理strace的输出,而不是每秒轮询/处理十亿次?

http://tstarling.com/blog/2010/06/measuring-memory-usage-with-strace/

答案 7 :(得分:1)

精确的内存指标可以通过页面映射内核接口给出 - 在libpagemap库https://fedorahosted.org/libpagemap/中使用。库还提供了用户空间工具,因此您可以立即启动监视器内存。

答案 8 :(得分:1)

测量峰值/高水位RSS内存使用量的更好方法是 cgmemtime 工具:

https://github.com/gsauthof/cgmemtime

它与 / usr / bin / time 一样容易使用,并且没有来自 Valgrind's massif 的减速。 此外,它基于名为 cgroups 内核功能,因此它比其他轮询方法更准确。