调用并跟踪一个进程的内存使用情况

调用并跟踪一个进程的内存使用情况

我想运行一个消耗内存的程序并跟踪其内存使用情况随时间的变化。该程序在调用后几秒内结束。

先前的这个问题建议系统状态包。虽然它的pidstat实用性部分满足了我的需求,但它无法满足我的两个需求:

  • 它接受的最小间隔是1s,但我想以更短的粒度进行测量。(0.1s应该没问题)
  • 它只跟踪现有进程,而我无法一直复制和粘贴 pid。

是否有一些替代脚本/实用程序可以更好地完成调用和测量工作?

答案1

这应该可以满足您的需要。它从中获取信息/proc/$PID/statm并打印(来自man procfs):

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              data       data + stack

剧本:

#!/usr/bin/env bash 

## Print header
 echo -e "Size\tResid.\tShared\tData\t%"
 while [ 1 ]; do
    ## Get the PID of the process name given as argument 1
     pidno=`pgrep $1`
    ## If the process is running, print the memory usage
     if [ -e /proc/$pidno/statm ]; then
     ## Get the memory info
      m=`awk '{OFS="\t";print $1,$2,$3,$6}' /proc/$pidno/statm`
     ## Get the memory percentage
      perc=`top -bd .10 -p $pidno -n 1  | grep $pidno | gawk '{print \$10}'`
     ## print the results
      echo -e "$m\t$perc";
    ## If the process is not running
     else
      echo "$1 is not running";
     fi
 done

然后,您可以调用该脚本,并为其指定一个进程名称作为输入。例如:

$ memusage.sh firefox
Size    Resid.  Shared  Data    %
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517209  261899  9546    400731  12.8
517209  261899  9546    400731  12.8

笔记:

  • 这假设只有一个单身的正在运行具有指定名称的进程。

答案2

多年后,我发现 valgrind 也有一个用于此的工具:

# record memory usage

$ valgrind --tool=massif bash -c "sleep 5; echo hey";
==5281== Massif, a heap profiler
==5281== Copyright (C) 2003-2015, and GNU GPL'd, by Nicholas Nethercote
==5281== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==5281== Command: bash -c sleep\ 5;\ echo\ hey
==5281==
hey
==5281==

# print the usage (5281 was the pid of bash, your filename will be different)
$ ms_print massif.out.4682

注意:valgrind 的作用不只是观察:它需要注入一些代码并拍摄内存快照。这可能会损害统计的准确性。

相关内容