アプリケーションのメモリとCPU使用率を記録する方法は?


16

CPU負荷をログに記録する方法の質問に似ていますか?、プロセスのメモリを記録したいと思います。

ログに記録したいプロセスがリモートサーバーで強制終了され、強制終了される直前のCPU負荷とメモリ使用量を調べたい。

[更新]

Stefano Palazzoのきちんとした小さなpythonスクリプトと

topCPUおよびMemの場合よりも小さいMichałの1行の出力値。理由がわかりますか?

出力トップ:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
2312 schXX     20   0 1241m 328m  58m S  100  0.3  11:56.68 MATLAB 

Stefano Palazzoのpythonスクリプトを出力します。

python memlogger.py 2312
%CPU    %MEM
76.00   0.20
76.00   0.20

私は残念ながらまだここにコメントすることはできませんが、なぜあなたはexpalining興味のこのポストを見つけることpsと異なる場合がありますtopstackoverflow.com/questions/131303/...
PM

回答:


16

シェルでワンライナーを作成できます:

logpid() { while sleep 1; do  ps -p $1 -o pcpu= -o pmem= ; done; }

pid = 123でプロセスをログに記録するには:

logpid 123

または、ログを表示してファイルに書き込むには:

logpid $$ | tee /tmp/pid.log

他のデータをログに記録する-o {this}場合は、オプションを変更します。man ps使用可能なパラメーターについては、「標準形式の仕様」セクションを参照してください。別の時間分解能が必要な場合はsleep {this}、関数を変更しますlogpid()


シンプルで仕事をします!
-rafaelbattesti

3

top統計を正確に追いかけている場合はtop、バッチモードで実行して、後のプロセスのpidを指定できます。入力した場合、このページ(http://www.dedoimedo.com/computers/linux-cool-hacks.html)から例を取り上げます

top -b -d 10 -n 3 >> top-file

「バッチモード(-b)でtopを実行します。遅延(-d)フラグで指定されたように10秒ごとに更新し、合計3回の反復(-n)を行います。出力が送信されます。ファイルに。」含める-pことはpid、あなたが後のプロセスを指定することができます。もちろん、これは純粋にCPUとRAMより多くを返しますが、thosフィールドを含みます。私の場合、たとえば、pid 9189を使用して監視すると次のようになりますtop -b -d 10 -n 3 -p 9189 >> ~/top-file

PID  USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
9189 pmj27     20   0 1617016 808112  27916 S   0.0  0.3   1:36.63 gedit

このページは、ファイルへのリダイレクトを行いませんが、印刷されたCPUのみを取得できるようにする、より洗練された修正を実行します。出力をファイルにリダイレクトして定期的に更新する良い方法を誰かが知っているなら、私は知りたいと思うでしょう。watchこれには私には理想的ではないようです:superuser.com/questions/281347/filtering-top-command-output
PM

2

この単純なpythonスクリプトは、あなたが望むことをするはずです:

import time
import string
import sys
import commands

def get_cpumem(pid):
    d = [i for i in commands.getoutput("ps aux").split("\n")
        if i.split()[1] == str(pid)]
    return (float(d[0].split()[2]), float(d[0].split()[3])) if d else None

if __name__ == '__main__':
    if not len(sys.argv) == 2 or not all(i in string.digits for i in sys.argv[1]):
        print("usage: %s PID" % sys.argv[0])
        exit(2)
    print("%CPU\t%MEM")
    try:
        while True:
            x,y = get_cpumem(sys.argv[1])
            if not x:
                print("no such process")
                exit(1)
            print("%.2f\t%.2f" % (x,y))
            time.sleep(0.5)
    except KeyboardInterrupt:
        print
        exit(0)

最初に監視するプログラムのプロセスIDを見つける必要があります。次に、PIDを引数としてスクリプトを実行できます。

python log.py 3912

CPU使用量とRAM使用量を1秒間に2回パーセントで出力します。

%CPU    %MEM
0.90    0.40
1.43    0.40
8.21    0.40
...

その後、出力をファイルにリダイレクトして、後でスプレッドシートにpython log.py 9391 > firefox_log.txtインポートし()Tab、セパレータとして選択したスプレッドシートにデータをインポートできます。

Ctrl + Cを押すか、プロセスが強制終了されると、プログラムは終了します。


親愛なるステファノ、脚本をありがとうございました。残念ながら、間違った結果を出力するようです。理由はありますか?更新された質問をご覧ください。
フレームスター

psのmanページman7.org/linux/man-pages/man1/ps.1.htmlから、ps は「使用されたCPU時間をプロセスが実行された時間(cputime / realtime ratio)で割った値をパーセンテージで出力します。 " -それは起動してから使用すると、CPU使用率の平均値を得るよう
ニコラス・チャールズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.