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


14

メモリを消費するプログラムを実行し、そのメモリ使用量を経時的に追跡したい。プログラムは、起動後数秒で終了します。

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

  • の最小間隔を受け入れますが1s、より短い粒度で測定したいです。(問題0.1sないはずです)
  • 既存のプロセスのみを追跡しますが、pidをコピーして貼り付けるために常に存在することはできません。

起動および測定ジョブをより良くするための代替スクリプト/ユーティリティはありますか?


1
プロセスのメモリ使用量をダンプする単純な小さなPythonまたはBashスクリプトを作成し(で最初の整数を表示できます/proc/$PID/statm)、100ミリ秒間スリープしてから繰り返す必要があるようです。なぜ、あなただけのPIDのは、関連付けられて投げ続けることはできませんstatmを通じてcat、多分余分な/不要な値オフフィルターにいくつかの正規表現を使用して、ただやりますかsleep 0.01?一部のオペレーティングシステムではsleep、1秒未満の値が許可されないため、その場合はPythonルートを使用する必要があります(time代わりに、Pythonの組み込みライブラリを使用してスリープします)。
ブレークスルー

多くの方法
16年

回答:


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

スクリプト:

#!/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

ノート:

  • これは、指定された名前の実行中のプロセスが1つしかないことを前提としています。

@björnen編集してくれてありがとう。あなたは非常に正しいです、私はmanそこに間違っていました、あなたの編集が拒否された理由がわかりません。
テルドン

1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.