web-dev-qa-db-ja.com

1つのプロセスのメモリ使用量を呼び出して追跡する

メモリを消費するプログラムを実行し、そのメモリ使用量を経時的に追跡したいと考えています。プログラムは、呼び出されてから数秒で終了します。

この前の質問 提案 sysstat パッケージ。そのpidstatユーティリティは部分的に私が望むことを行いますが、私の2つのニーズを満たすことができません:

  • 最小間隔は1sですが、より細かい単位で測定したいと考えています。 (0.1sで結構です)
  • それは既存のプロセスを追跡するだけですが、pidをコピーして貼り付けるためにいつも立ち会うことはできません。

呼び出しと測定のジョブをより適切に実行するための代替スクリプト/ユーティリティはありますか?

14
Jokester

これはあなたが必要なことをするはずです。 /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

ノート:

  • これは、名前が指定されたsingle実行中のプロセスのみがあると想定しています。
11
terdon

数年後、私は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は監視だけではありません。コードを挿入してメモリのスナップショットを取得する必要があります。これは統計の精度を損なう可能性があります。

1
Jokester