コマンドラインを実行してピークのRAM使用量の合計を報告するツールはありますか?
/ usr/bin/timeに似たものを想像しています
これは、外部のスクリプトやユーティリティを必要とせず、Valgrindやtimeなどの別のプログラムを使用してプロセスを開始する必要がないワンライナーです。そのため、既に実行中のプロセスに使用できます。
grep VmPeak /proc/$PID/status
($PID
を興味のあるプロセスのPIDに置き換えます)
[編集:Ubuntu 14.04で動作:/usr/bin/time -v command
必ずフルパスを使用してください。]
/usr/bin/time
を渡すと-v
でその情報が得られるように見えます(これはUbuntu 8.10にあります)。例えば以下のMaximum resident set size
を参照のこと。
$/usr/bin/time -v ls / .... 時間指定されたコマンド: "ls /" ユーザー時間(秒):0.00 システム時間(秒):0.01 このジョブで得たCPUの割合:250% 経過時間(壁時計)(h:mm:ssまたはm:ss):0 :00.00 共有テキストの平均サイズ(KB):0 非共有データの平均サイズ(KB):0 平均スタックサイズ(KB):0 平均合計size(kbytes):0 最大常駐セットサイズ(kbytes):0 平均常駐セットサイズ(kbytes):0 メジャー(I/Oが必要)ページフォルト:0 マイナー(フレームの再生)ページフォルト:315 任意のコンテキストスイッチ:2 任意のコンテキストスイッチ:0 スワップ:0 ファイルシステム入力:0 ファイルシステム出力:0 送信ソケットメッセージ数:0 受信ソケットメッセージ数:0 シグナルd elivered:0 ページサイズ(バイト):4096 終了ステータス:0
(これはすでに回答された、昔の質問ですが、記録のためだけのものです:)
私はYangのスクリプトに触発され、 memusg という名前のこの小さなツールを思い付きました。私は単純にサンプリングレートを0.1に上げて、ずっと短い生活プロセスを処理しました。単一のプロセスを監視する代わりに、プロセスグループの合計を測定するようにしました。 (ええ、私は一緒に動くたくさんの別々のプログラムを書きます)それは現在Mac OS XとLinuxで動きます。使い方はtime
と同じでなければなりません。
memusg ls -alR />/dev/null
今のところピークを示しているだけですが、私は他の(大まかな)統計を記録するためのわずかな拡張に興味があります。
本格的なプロファイリングを始める前に、そのような単純なツールを見てみるだけでいいのです。
Valgrindワンライナー:
valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1
プロセス内のすべてのメモリを測定するための--pages-as-heapの使用に注意してください。詳細はこちら: http://valgrind.org/docs/manual/ms-manual.html
おそらく(gnu) time(1) はもうあなたが望むことをしています。例えば:
$ /usr/bin/time -f "%P %M" command
43% 821248
しかし、他のプロファイリングツールでは、探しているものによってはより正確な結果が得られる場合があります。
/ usr/bin/timeは、おそらくあなたが望むことをしているのでしょう。何かのようなもの。
/usr/bin/time - フォーマット= '(%Xtext +%Dデータ%Mmax)'
詳細は時間(1)をご覧ください。
Linuxの場合
/usr/bin/time -v <program> <args>
を使用して、 "最大常駐セットサイズ"を探します。
(Bash time
組み込みコマンドと混同しないでください!したがって、絶対パス、/usr/bin/time
を使用してください。)
例えば:
> /usr/bin/time -v ./myapp
User time (seconds): 0.00
. . .
Maximum resident set size (kbytes): 2792
. . .
BSD、MacOSの場合
/usr/bin/time -l <program> <args>
を使用して、「最大常駐セットサイズ」を探します。
>/usr/bin/time -l ./myapp
0.01 real 0.00 user 0.00 sys
1440 maximum resident set size
. . .
プロセスが少なくとも2秒間実行される場合は、次のbashスクリプトを使用できます。これにより、指定されたコマンドラインが実行され、ピークRSSが表示されます(興味のあるその他の属性はrss
に置き換えられます)。やや軽量で、Ubuntu 9.04に含まれているps
(私はtime
とは言えません)を使っても動作します。
#!/usr/bin/env bash
"$@" & # Run the given command line in the background.
pid=$! peak=0
while true; do
sleep 1
sample="$(ps -o rss= $pid 2> /dev/null)" || break
let peak='sample > peak ? sample : peak'
done
echo "Peak: $peak" 1>&2
MacOS Sierraでは、以下を使用してください。
/usr/bin/time -l commandToMeasure
あなたはたぶん欲しいものを取るためにgrep
を使うことができます。
time -f '%M' <run_program>
これを行うには、 Valgrind のようなツールを使用できます。
これは(他の答えに基づいて)すでに実行中のプロセスを監視する非常に単純なスクリプトです。あなたは引数としてあなたが見たいプロセスのpidでそれを実行するだけです:
#!/usr/bin/env bash
pid=$1
while ps $pid >/dev/null
do
ps -o vsz= ${pid}
sleep 1
done | sort -n | tail -n1
使用例
max_mem_usage.sh 23423
Heaptrack はGUIとテキストインターフェースを持つKDEツールです。プロセスのメモリ使用量を理解するのはvalgrindよりも適していると思います。なぜなら、プロセスの詳細とフレームグラフを提供するからです。それはそのvalgrindをチェックすることを少なくするのでそれはまた速いです。そしてそれはあなたにピークメモリ使用量を与えます。
とにかく、ページが共有される可能性があるため、rssとvssの追跡は誤解を招く可能性があるため、memusg
name__がその理由です。あなたが本当にすべきことは、/proc/[pid]/smaps
内のPss
name__の合計を追跡すること、またはpmap
name__を使用することです。 GNOME system-monitor 以前はそうしていましたが、高すぎました。
Massifを使用します。 http://valgrind.org/docs/manual/ms-manual.html
手作りのbashスクリプトを使って、ホイールを再発明しました。早くてきれい。
私のユースケース: RAMの少ないLinuxマシンを監視したいと思います。また、コンテナが頻繁に使用されているときには、その使用量のスナップショットを撮りたいと思いました。
#!/usr/bin/env bash
threshold=$1
echo "$(date '+%Y-%m-%d %H:%M:%S'): Running free memory monitor with threshold $threshold%.."
while(true)
freePercent=`free -m | grep Mem: | awk '{print ($7/$2)*100}'`
do
if (( $(awk 'BEGIN {print ("'$freePercent'" < "'$threshold'")}') ))
then
echo "$(date '+%Y-%m-%d %H:%M:%S'): Free memory $freePercent% is less than $threshold%"
free -m
docker stats --no-stream
sleep 60
echo ""
else
echo "$(date '+%Y-%m-%d %H:%M:%S'): Sufficient free memory available: $freePercent%"
fi
sleep 30
done
出力例:
2017-10-12 13:29:33:しきい値30%の空きメモリモニタを実行しています..
2017-10-12 13:29:33:十分な空きメモリがあります:69.4567%
2017-10-12 13:30:03:十分な空きメモリがあります:69.4567%
2017-10-12 16:47:02:空きメモリ18.9387%が30%未満
カスタムコマンド出力
「htop」は、どのプロセスがどのくらいのRAMを使用しているかを確認するのに最適なコマンドです。
詳細については http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html
MacOSでは、代わりにDTraceを使うことができます。 "Instruments"アプリはそのための素晴らしいGUIです、それはXCode afaikが付属しています。