プログラムのRAM使用量を測定する


46

time 特定のコマンドにかかるCPU時間を把握したい場合は、すばらしいコマンドです。

プログラムとすべての子の最大RAM使用量を測定できる類似のものを探しています。できれば、使用されたメモリと未使用のメモリを区別する必要があります。たぶん、メモリ使用量の中央値(したがって、長時間実行するときに予想されるメモリ使用量)を与えることもできます。

だから私はやりたい:

rammeassure my_program my_args

次のような出力を取得します。

Max memory allocated: 10233303 Bytes
Max memory used: 7233303 Bytes
Median memory allocation: 5233303 Bytes

私はmemusg https://gist.github.com/526585/590293d6527c91e48fcb08edb8de9fd6c88a6d82を見ましたが、それはややハックだと思います

回答:


24

tstimeを使用して、プロセスの最大メモリ使用量(RSSおよび仮想)を測定できます。

例えば:

$ tstime date       
Tue Aug 16 21:35:02 CEST 2011

Exit status: 0

pid: 31169 (date) started: Tue Aug 16 21:35:02 2011
        real   0.017 s, user   0.000 s, sys   0.000s
        rss      888 kb, vm     9764 kb

また、より簡単に解析できる出力モード(-t)もサポートしています。


私はそれが好きです。それもで正しいことをやった./tstime -t bash -c 'perl -e "\$a=\"x\"x100000000;\$b=\$a.\$a;\$b=\"\";\$a=\"\";sleep 10;"'
オレ丹下

3
「プロセスによるRAM使用量」は明確に定義された値ではありません。実行中の同じプログラムのインスタンスが複数ある場合、それらは実行可能ファイルを共有します。ほとんどのプログラムは共有しますglibc(およびその他の各種ライブラリ、何かのために「共有」と呼ばれます)。多くのデーモンは、構成をメモリとfork(2)の子にロードし、子は構成データを共有します。次に、カーネルが管理する先読み/後書きバッファにデータがあります。そして、疎結合プロセスの群れであるサービスがあります(デスクトップ環境とそのすべてのアプレットとバックグラウンドのものを考えてください)。
フォンブランド

@ vonbrand、Linux-KernelがRSS / VSS値を計算する方法は明確に定義されています。
-maxschlepzig

@maxschlepzig、それはいくつかのランダムな値を計算する可能性がありますが、それはあなたが彼らが意味することを意味することを意味するわけではありません:それは「このプロセスが使用するメモリ」ではなく、共有しているものはすべて含まれます。
フォンブランド

@vonbrandプロセスのメモリ使用量を測定するほとんどのユースケースでは、共有されていない匿名ページを測定する必要があります。これは、同じ入力で非常に予測可能です。
ウラジミールパンテレエフ

28

timeシェルの組み込みです。time必要な場合でも詳細情報が必要な場合は、GNU timeを詳細(-v)モードで試してください。

/usr/bin/time -v sleep 5               
    Command being timed: "sleep 5"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.00
    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): 2144
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 179
    Voluntary context switches: 2
    Involuntary context switches: 1
    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

パッケージマネージャーでパッケージ「time」または「gnutime」を検索します。


3
GNU timeによって報告される一部の情報は不正確である可能性があることに注意してください。たとえば、Ubuntu 10.04の場合:マニュアルページには、「数値はwait3(2)によって返される数値と同じくらいしかありません」と記載されています。つまりwait3で説明された構造を埋めるgetrusage(2):「すべてのフィールドは、Linuxの下に意味があるわけではありません。[..] '。
-maxschlepzig

4
たとえば、10 MBを正確に割り当てる(および各ページに触れる)テストプログラムでは、GNU timeは42608 KiBのmaxRSSを報告し、10652 KiBをtstime報告します。再びUbuntu 10.04で。
maxschlepzig

それがこんなに簡単だったら、私は大好きだっただろう。私のUbuntuマシンで試しました:/usr/bin/time -v perl -e '$a="x"x100000000;$b=$a.$a;sleep 10;'。topは約570 MBかかりますが、時間は2.3 GBと言います。実際には、その数は私には使えません。
オレ丹下

4の係数はGNU time 1.7で修正されているため、期待どおりに機能します。
オレ丹下

重要な注意:「最大常駐セットサイズ」は、Linux 2.6.32以降でのみ機能します。
ジャン・ヒューデック

17

多すぎるかもしれませんが、私はちょうどvalgrindという名前の素晴らしいツールを持っていることがわかりましたmassif。私はそれをテストしましたxterm

valgrind --trace-children=yes --tool=massif xterm
ms_print massif.out.* | less

そして、素敵なメモリ使用量グラフを取得します:

    MB
4.230^                     #                    :::::::  :::      @@:     ::: 
     |   @                 #:::@::@@:::::@::::::: :: : ::: :::::::@ ::::::: ::
     |   @               ::#:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::::@@:::::::::: #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
   0 +----------------------------------------------------------------------->Mi
     0                                                                   292.4

過度に詳細なメモリ使用情報とともに。valgrindマニュアルの詳細。

ただし、プログラムの実行速度は約20倍遅くなります。また、内でいくつかのコマンドを実行しましたxterm--trace-children=yesオプションがあるため、メモリのフットプリントが考慮されています!


1
20倍の速度ペナルティにより、私の状況では使用できなくなります。そうでなければ非常にきれいなグラフ!
オレ丹下

1
少なくとも私が使用しているvalgrindのバージョン3.8.1では、ブール値は「true / false」ではなく「yes / no」の形式でのみ受け入れられているようです。私は文句を言いました!:-)
MakisH

6

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

https://github.com/gsauthof/cgmemtime

cgmemtimeは、プロセスおよびその子孫プロセスのRSS + CACHEメモリ使用量を測定します。

そのようにするために、プロセスを独自のcgroupに入れます。

たとえば、プロセスAは10 MiBを割り当て、20 MiBを割り当てる子Bをフォークし、30 MiBを割り当てる子Cをフォークします。3つのプロセスはすべて、割り当てられたRSS(常駐セットサイズ)のメモリ使用量が発生するタイムウィンドウを共有します。

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

回答:60 MiB

cgmemtimeは、このような質問に答えるツールです。


3

Linux> = 3.0では、非ルートではtstimeが機能しなくなったようです。問題を回避するために作成したポーリングユーティリティは次のとおりです。https//github.com/jhclark/memusg/blob/master/memusg


/usr/bin/time -v新しいバージョンで正しい出力が得られます。古いバージョンでは、正しい量を得るために4で割る必要があります。
オレ丹下

ただし、time -vはピークvmemoryサイズ(RSSのみ)をサポートするとは思わない。誰でも最新バージョンでこれを確認できますか?
jhclark
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.