如何监控Linux中进程消耗的峰值内存? 这不是我可以在内部修改以测量峰值内存使用的程序。
我真的不想要详细的测量,我也不希望它们过度减慢我的程序..所以valgrind或任何重量级的东西都不是我想要的... 和之前的其他帖子[Peak memory usage of a linux/unix process一样,时间-v似乎没有为我的机器报告内存......
我可以运行top或ps并提取内存消耗的字符串 我的进程ID使用一个简单的脚本。但是,我的过程运行大约20-30分钟,所以我希望能够记录并获得最大值。 我可以忍受粗粒样品......每1分钟左右...具体如何 - >> 1.在zsh中分享这个简单的mem-measure脚本? 2.当测试过程结束时杀死它?
答案 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)
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)
如果您在2.6.28.7之后的Linux内核上运行,那么可以使用Pagemap功能。在www.eqware.net/Articles/CapturingProcessMemoryUsageUnderLinux讨论了一些工具的来源和来源。
页面收集工具旨在捕获所有进程的内存使用情况,因此可能会产生比您想要的更大的CPU负担。但是,您应该可以轻松地对其进行修改,以便仅捕获特定进程ID的数据。这样可以减少开销,以便您可以每隔几秒轻松运行一次。我还没有尝试过,但我认为页面分析工具应该不加改变地运行。
EQvan
答案 5 :(得分:1)
这取决于您要监控的内存类型。
通过对所有进程的数量(不是所有线程的)进行排序来监视以下M.a.p.d,可以监视每个进程使用的malloc物理内存。
你可以写一个c程序,使它更快,但我认为awk是这个目的的最低选择。
我更希望获得如下数字,以获得最少开销的实数 你必须总结这些以便将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 的内核功能,因此它比其他轮询方法更准确。