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

问题描述:

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

我真的不想要详细的测量,也不希望它们过分减慢我的程序..所以valgrind或任何重量级不是我正在寻找... 而像其他职位[Peak memory usage of a linux/unix process,时间-v似乎没有报告我的机器的内存...

我可以运行顶部或ps并使用一个简单的脚本提取内存消耗的字符串为 我的进程ID。但是,我的流程运行了大约20-30分钟,因此我希望能够记录并获取最大值。 我可以容忍粗粒度样本......每隔1分钟左右...具体如何我 - > 1.在zsh中分隔这个简单的mem-measure脚本? 2.当测试过程结束时将其终止?

+0

http://www.serverfault.com? – 2010-06-23 04:13:09

其实,我以前说过:

“””

尝试

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

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

HTH

+1

输出在2个...还没有有用:( \t用户时间(秒):16.50 \t系统时间(秒):0.47 \t%的CPU这项工作得到了100% \t经过的(挂钟)时间(h:mm:ss或m:ss):0:16。96 \t平均共享文本大小(千字节):0 – badkya 2009-07-03 19:18:24

+1

平均非共享数据大小(字节):0 \t平均堆栈大小(千字节):0 \t平均总大小(千字节):0 \t最大驻留集大小(千字节):0 \t平均驻留集大小(千字节):0 \t主要(需要I/O)的页面错误:0 \t次要(回收一帧)的页面错误:255315 \t自愿上下文切换:1211 \t自愿上下文开关:1232 \t S WAPS:0 \t文件系统输入:0 \t文件系统输出:68472个 \t插座消息发送:接收0 \t插座消息:0 \t页大小(字节):4096 – badkya 2009-07-03 19:18:59

你可以使用穆宁节点的插件来做到这一点,但它是一个有点重量级。 http://munin.projects.linpro.no/

只需使用top -n迭代指定的次数,使用-d延迟更新。您也可以通过grepping其PID,像抓只与您的过程输出:

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

阅读上面的手册页了解更多信息当然

man top 

,你也可以抢列你需要通过使用awk。

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

一个不错的选择,如果你是一个Linux内核比2.6.28.7运行后,是使用页映射功能。在www.eqware.net/Articles/CapturingProcessMemoryUsageUnderLinux有一些关于这个和一些工具的来源的讨论。

页,收集工具旨在捕获所有进程的内存使用情况等可能强加不是你想要更大的CPU的负担。但是,您应该很容易修改它,以便它仅捕获特定进程ID的数据。这会减少足够的开销,以便您可以每隔几秒轻松运行一次。我还没有尝试过,但我认为页面分析工具应该运行而不用更改。

EQvan

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

#!/bin/bash 

ppid=$$ 
maxmem=0 

[email protected] & 
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 [email protected] 
echo -e "Memory usage for [email protected] is: ${maxmem} KB. Exit status: ${exitstatus}\n" 

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

在排序过程的所有一方的个数(不是所有的线程)的监控下M.a.p.d会让你监控每一个进程使用malloc的物理内存。

你可以写一个C程序,使其更快,但我认为是AWK为此,最小的选择。

  • 马匿名映射内存
    • .P私人
      • .D脏==的malloc/mmapped堆和栈分配和写入内存
      • .C干净==的malloc/mmapped堆和堆栈内存一次分配,写入,然后释放,但不回收
    • .s共享
      • .D脏==应该没有
      • .C干净==应该没有
  • 锰命名映射内存
    • .P私人
      • .d脏==文件mmapped写入内存专用
      • .C干净==映射程序/库文本私有映射
    • .S共享
      • .D脏==文件mmapped写入内存共享
      • 。c清洁==映射库文本共享映射

我宁愿得到数目如下中至少开销,以获得实数。
你必须对这些进行总结,以便将ps节目分为RSS,并获得更精确的数字,以免混淆。

MAPD:

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 

MAPC:

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 

MNPD:...等

而不是投票的/ proc十亿倍第二,为什么不直接处理strace输出?

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

精确存储器度量可以由页映射内核接口给出 - 在libpagemap库https://fedorahosted.org/libpagemap/利用。库还提供了用户空间实用程序,因此您可以立即开始监视内存。

一个更好的选择来衡量峰/高水RSS内存使用是这里的cgmemtime工具可供选择:

https://github.com/gsauthof/cgmemtime

这是那么容易,因为的/ usr/bin中使用/时间和没有从Valgrind的地块放缓。 此外,它基于内核功能名为cgroups,所以它比其他轮询方法更加准确。