アプリケーションのメモリと CPU の使用量をログに記録するにはどうすればよいですか?

アプリケーションのメモリと CPU の使用量をログに記録するにはどうすればよいですか?

類似の質問CPU 負荷をログに記録するにはどうすればいいですか?プロセスのメモリをログに記録したいと思います。

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

[アップデート]

Stefano Palazzoの簡潔なPythonスクリプトと

Michał の 1 行出力は、topCPU と Mem の場合よりも小さい値です。その理由がわかりますか?

出力トップ:

 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

答え1

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

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()

答え2

統計情報を正確に取得したい場合は、対象のプロセスのPIDを指定してバッチモードでtop実行できます。このページの例を見てみましょう(tophttp://www.dedoimedo.com/computers/linux-cool-hacks.html)と入力した場合

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

「top をバッチ モード (-b) で実行します。遅延 (-d) フラグで指定されたとおり、10 秒ごとに更新され、合計 3 回の反復 (-n) が行われます。出力はファイルに送信されます。」 には、必要なプロセスの も-p指定できますpid。もちろん、これによって返されるのは CPU と RAM だけではありませんが、これらのフィールドも含まれます。たとえば、私の場合、 を使って 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

答え3

このシンプルな 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 を押すか、プロセスが強制終了されると、プログラムは終了します。

答え4

プロクパスCPU 使用率や Resident Set Size (RSS) など、アプリケーションの Procfs メトリック (プロセス ツリー) を記録するために使用できます。完全な開示: これは私が作成したものです。

Firefox を例に挙げてみましょう。私のマシンではプロセス ツリーは次のようになります。

 /usr/lib/firefox/firefox
 ├─ /usr/lib/firefox/firefox -contentproc -childID 4 ...
 ├─ /usr/lib/firefox/firefox -contentproc -childID 3 ...
 ├─ /usr/lib/firefox/firefox -contentproc -childID 2 ...
 ├─ /usr/lib/firefox/firefox -contentproc -childID 1 ...
 ├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
 ├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
 └─ /usr/lib/firefox/firefox -contentproc -childID 8 ... 

Procpathを使用すると、次のようにこのツリーからプロセスメトリックを収集できます(ドキュメントアプリケーションのプロセス スーパーバイザー (systemd や Docker など) にルート PID を問い合わせる場合):

procpath record -d firefox.sqlite '$..children[?(@.stat.comm == "firefox")]'

このコマンドを使用すると、Procpath はこのツリーの Procfs メトリックを 10 秒ごとに収集して記録します。ターミナル マルチプレクサ (Byobu など) で実行したままにして、サーバーのバックグラウンドで実行することができます。

アプリケーションが再度クラッシュした場合は、このコマンドを使用して、アプリケーションの CPU 使用率と常駐セット サイズを視覚化できます。

procpath plot -d firefox.sqlite -f firefox.svg -q cpu -q rss --formatter=integer

CPU vs RSS プロット

関連情報