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

Jok*_*ter 14 memory linux sysstat

我想运行一个消耗内存的程序并随着时间的推移跟踪它的内存使用情况。程序在调用后几秒钟内结束。

上一个问题建议使用sysstat包。虽然它的pidstat效用部分满足了我的需求,但它无法满足我的两个需求:

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

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

ter*_*don 11

这应该做你需要的。它从以下位置获取信息/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
Run Code Online (Sandbox Code Playgroud)

剧本:

#!/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
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

笔记:

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