Linuxでアプリケーションが終了した後のピークメモリを測定する方法


11

Linuxで実行されているアプリケーションのピークメモリを測定するにはどうすればよいですか?

このアプリをバッチで実行しているため、RSSを使用できません。現在のメモリを報告するからです。アプリケーションが最後に報告するために使用したピークメモリが必要です。

VmPeakも解決策ではありません。割り当てられたメモリを報告し、実際のRAMからではなく、ハードディスクからも計算するためです。


どのOSでアプリケーションを実行していますか?
CVn 2013年

私はLinuxに取り組んでいます
des_user 2013年

このスレッドは、あなたの助けになるはずです。serverfault.com/questions/387268/...
ジェイコブ・コールマン

回答:


13

プロセスのピークメモリ使用量を追跡する2つの方法を次に示します。

シロップ

私はこのツールを使用していませんが、あなたが探しているもののように思えます。それはシロップと呼ばれています

説明文

Syrupyは、1つ以上の実行中のプロセスのメモリとCPU負荷のスナップショットを定期的に取得して、システムリソースの使用状況のプロファイルを動的に構築するPythonスクリプトです。

$ syrupy.py myprog

  PID DATE        TIME     ELAPSED  CPU   MEM    RSS   VSIZE
14634 2008-10-10  20:45:25   00:00  0.0   0.0   2996    6680
14634 2008-10-10  20:45:26   00:01  105   0.2   7804   12592
14634 2008-10-10  20:45:27   00:02  103   0.2   8996   13776
14634 2008-10-10  20:45:28   00:03  103   0.2  10468   15348
14634 2008-10-10  20:45:29   00:04  103   0.3  11412   16396
14634 2008-10-10  20:45:30   00:05  104   0.3  12492   17444

/usr/bin/time -v

皮肉なことに、GNU timeコマンドは、プロセスのピーク時のメモリ使用量を提供します。ピークメモリは次のように報告されますMaximum resident set size (kbytes)

$ /usr/bin/time -v ~/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000
...

    Command being timed: "/home/saml/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000"
    User time (seconds): 1.12
    System time (seconds): 0.05
    Percent of CPU this job got: 54%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.19
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 79304
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 20014
    Voluntary context switches: 83
    Involuntary context switches: 274
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

参考文献


3

トピックはかなり古いですが、cgroups Linuxカーネル機能から生まれた別のプロジェクトを共有したいと思います。

https://github.com/gsauthof/cgmemtime

cgmemtimeは、プロセスとその子孫プロセスの高水準RSS + CACHEメモリ使用量を測定します。

そうすることができるように、それはプロセスをそれ自身のcgroupに入れます。

たとえば、プロセスAは10 MiBを割り当て、子Bをフォークして20 MiBを割り当て、子Bをフォークして30 MiBを割り当てます。3つのプロセスすべてが時間枠を共有しており、その割り当てにより、対応するRSS(常駐セットサイズ)のメモリ使用量が発生します。

ここでの質問は、Aを実行した結果、実際にどのくらいのメモリが使用されているのかということです。

回答:60 MiB

cgmemtimeはそのような質問に答えるためのツールです。

使用例は次のとおりです。

$ sudo ./cgmemtime --setup -g <myusergroup> --perm 775

$ ./cgmemtime ./testa x 10 20 30
Parent PID is 27189
Allocating 10 MiBs
New Child: 27193
Allocating 20 MiBs
New Child: 27194
Allocating 30 MiBs
Child user:    0.000 s
Child sys :    0.005 s
Child wall:    6.006 s
Child high-water RSS                    :      11648 KiB
Recursive and acc. high-water RSS+CACHE :      61840 KiB

$ ./cgmemtime python -c 'print range(100000)[48517]'
48517
Child user:    0.014 s
Child sys :    0.014 s
Child wall:    0.029 s
Child high-water RSS                    :       9948 KiB
Recursive and acc. high-water RSS+CACHE :       5724 KiB

では、このツールを使用して、プログラムが終了した後のプログラムのピーク RAM使用量を報告するにはどうすればよいでしょうか。
terdon

@terdon wait4cgroups(memory.max_usage_in_bytes)と組み合わせてプロセスの終了をキャッチするために使用しますが、これは理にかなっているようです。詳細については、githubのREADMEを参照してください。
Vlad Frolov、2015年

ありがとう、しかし私のポイントはあなたの答えについてでした。現状では、それは質問に答えているのではなく、可能な外部リソースを指し示しているだけです。また、自動フラグを立てるまったく同じ回答を他の場所に投稿しました。回答を編集して、このプログラムがOPの要求にどのように対応できるかを示す例を含めてください。
terdon

2
@terdonはい、そうしました!私は同じ質問を検索しましたが、質問はほとんど同じで、答えもすべて同じです。「ps出力を解析」というのはクレイジーです!私が1週間費やしてから、誤ってcgmemtimeプロジェクトにぶつかりました。これは、コメントしたすべての質問に完全に一致しています。
Vlad Frolov、2015年

1
けっこうだ。それがどのように使用されるかの例を示すことができればそれは素晴らしいでしょう。それはあなたの答えを改善するでしょう。いずれにせよ、これを投稿する時間を割いてくれてありがとう、私は他の人が役に立つと確信しているでしょう。
terdon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.