linux 进程运行太久,在Linux中长时间运行的进程的峰值内存测量

只需使用top -n迭代指定的次数,使用-d延迟更新。 您也可以通过刷新其pid来获取与您的进程相关的输出,例如:

top -n 30 -d 60 | grep

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

man top

当然,你也可以通过使用awk来获取你需要的列。

其实我之前说过

“””

尝试

/usr/bin/time -v yourcommand

这应该有所帮助。 如果你只使用“time”,bash会执行内建的(没有“-v”)

“””

不起作用(返回0)。

我做了下面的Perl脚本(我称之为smaps):

#!/usr/bin/perl use 5.010; use strict; use warnings; my $max = 0; while( open my $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

Valgrind与地块不应该太重,但是,我建议使用/ 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"

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

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

一个很好的选择是,如果你运行在2.6.28.7以后的Linux内核上,就是使用Pagemap功能。 在www.eqware.net/Articles/CapturingProcessMemoryUsageUnderLinux中有一些关于这个和一些工具的来源的讨论。

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

EQvan

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

通过对所有进程的编号(不是全部线程)进行排序来监视以下Mapd将允许您监视每个进程使用的malloc物理内存。

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

马匿名映射内存

私人

.d脏== malloc / mmapped堆栈和堆栈分配和写入的内存

.c clean == malloc / mmapped堆和内存一旦分配,写入,然后释放,但还没有回收

.s共享

.d脏==应该没有

.c干净==应该没有

Mn命名映射的内存

私人

.d脏==文件mmapped写入内存私人

.c干净==映射的程序/库文本私有映射

.s共享

.d脏==文件共享的mmapped写入内存

.c干净==映射库文本共享映射

我宁愿得到的数字如下,以最小的开销获得实数。

你必须总结这些以便将RSS节目分为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//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//smaps

Mnpd:…等等

精确的内存度量可以由页面映射内核接口给出 – 在libpagemap库https://fedorahosted.org/libpagemap/中使用 。 库也提供了用户空间使用情况,所以你可以立即开始监视内存。

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

使用和/ usr / bin / time一样简单,并且没有Valgrind的地块的减速。 此外,它基于名为cgroups的内核特性,因此比其他轮询方法更加准确。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值