web-dev-qa-db-ja.com

測定RAMプログラムの使用状況

timeは、特定のコマンドがどれだけのCPU時間を消費するかを知りたい場合に最適なコマンドです。

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

だから私はしたいと思います:

rammeassure my_program my_args

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

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

私はmemusghttps://Gist.github.com/526585/590293d6527c91e48fcb08edb8de9fd6c88a6d82 を見てきましたが、それはややハックだと思います。

47
Ole Tange

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

25
maxschlepzig

timeはシェルの組み込みです。 timeが気に入ったが、さらに情報が必要な場合は、GNU time in verbose(-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」を検索します。

28
Rufo El Magufo

多分やりすぎかもしれませんが、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オプションがあります!

17

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

https://github.com/gsauthof/cgmemtime

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

これを実行できるようにするには、プロセスを独自のcgroupに入れます。

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

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

回答:60 MiB

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

6
Vlad Frolov

Linux> = 3.0の非ルートでは、tstimeが機能しないようです。これは私が問題をハッキングするために書いたポーリングユーティリティです: https://github.com/jhclark/memusg/blob/master/memusg

3
jhclark