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 を見てきましたが、それはややハックだと思います。
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
)。
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」を検索します。
多分やりすぎかもしれませんが、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
オプションがあります!
トピックはかなり古いですが、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はそのような質問に答えるためのツールです。
Linux> = 3.0の非ルートでは、tstimeが機能しないようです。これは私が問題をハッキングするために書いたポーリングユーティリティです: https://github.com/jhclark/memusg/blob/master/memusg