回答:
以下は、外部スクリプトやユーティリティを必要とせず、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 共有テキストの平均サイズ(キロバイト):0 非共有データの平均サイズ(キロバイト):0 平均スタックサイズ(キロバイト):0 平均合計サイズ(キロバイト):0 最大常駐セットサイズ(キロバイト):0 常駐セットの平均サイズ(キロバイト):0 メジャー(I / Oが必要)ページ違反:0 マイナー(フレームの再利用)ページ違反:315 任意のコンテキストスイッチ:2 非自発的なコンテキストスイッチ:0 スワップ:0 ファイルシステム入力:0 ファイルシステム出力:0 送信されたソケットメッセージ:0 受信したソケットメッセージ:0 配信されたシグナル:0 ページサイズ(バイト):4096 終了ステータス:0
/bin/time -v
それを解決します。
time -l
MacOSで試してみてください。同様の出力が得られます。
(これはすでに回答済みの古い質問ですが、参考までに:)
私はヤンのスクリプトに触発され、memusgというこの小さなツールを思いつきました。サンプリングレートを0.1に増やして、短い生活プロセスを処理しました。単一のプロセスを監視する代わりに、プロセスグループのrss合計を測定するようにしました。(うん、私は一緒に動くたくさんの別々のプログラムを書いています)それは現在Mac OS XとLinuxで動きます。使用方法は次のようにする必要がありtime
ます。
memusg ls -alR /> / dev / null
それは今のところピークを示すだけですが、私は他の(大まかな)統計を記録するためのわずかな拡張に興味があります。
本格的なプロファイリングを開始する前に、このような単純なツールを確認しておくとよいでしょう。
ps -o rss=
は、 rssがプロセスの実メモリ(常駐セット)サイズ(1024バイト単位)であるBSD manページから表示される値を単に監視します。
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
time
、あなたから離れます。
valgrind --massif
。またms_print
、付属のツールを使用して、便利な出力(ASCIIチャートの使用時間の
time
、などのコマンドでは少なくとも10倍の時間がかかりls
ます。
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
. . .
sudo apt-get install time
たぶん(gnu)time(1)はすでにあなたの望むことをしています。例えば:
$ /usr/bin/time -f "%P %M" command
43% 821248
ただし、他のプロファイリングツールでは、探しているものに応じてより正確な結果が得られる場合があります。
time
を使用する場合の組み込みコマンドcsh
です。正確なパスを使用すると、外部コマンドを実行できるようになります。私の知る限りでは、GNUバージョンのみがフォーマットオプションをサポートしています。
/ usr / bin / timeは、おそらくあなたが望んでいることを実際に行います。何かのようなもの。
/ usr / bin / time --format = '(%Xtext +%Ddata%Mmax)'
詳細については、time(1)を参照してください...
MacOS Sierraの場合:
/usr/bin/time -l commandToMeasure
あなたはgrep
多分あなたが欲しいものを取るために使うことができます。
command time -l
代わりに使用/usr/bin/time -l
すると、シェルtime
は組み込み関数の代わりに呼び出されるバイナリを実際に呼び出すようになります。(はい、command
プレースホルダーでcommand time
はありませんtime
。単なるものとは異なります。)
プロセスが少なくとも2秒間実行される場合は、次のbashスクリプトを使用できます。このスクリプトは、指定されたコマンドラインを実行し、印刷してピークRSSをstderrしrss
ます(興味のある他の属性に置き換えます)。それはやや軽量でありps
、Ubuntu 9.04に含まれていると私には機能します(これについては言えません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
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
Massifを使用:http : //valgrind.org/docs/manual/ms-manual.html
Heaptrackは、GUIとテキストインターフェイスを備えたKDEツールです。プロセスのメモリ使用量を理解することは、詳細とフレームグラフを提供するため、valgrindよりも適切だと思います。また、そのvalgrindのチェックが減るため、処理速度も向上します。そして、それはあなたにピークメモリ使用量を与えます。
とにかく、rssとvssの追跡は、ページが共有される可能性があるため誤解を招く可能性があり、そのためですmemusg
。実際にすべきことは、Pss
in /proc/[pid]/smaps
またはuseの合計を追跡することpmap
です。以前はGNOMEシステムモニターがそうでしたが、高すぎました。
手作りの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%未満
カスタムコマンド出力
macOSでは、代わりにDTraceを使用できます。「Instruments」アプリはそのための素晴らしいGUIであり、XCode afaikが付属しています。
「htop」は、どのプロセスがどのくらいのRAMを使用しているかを確認するのに最適なコマンドです。
詳細については http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html
必ず質問にお答えください。詳細を提供し、あなたの研究を共有してください!
申し訳ありません、私はここに初めて来て、質問することしかできません…
使用される提案:
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
次に:
grep mem_heap_B massif.out
...
mem_heap_B=1150976
mem_heap_B=1150976
...
これはtop
、同じようなときにコマンドが表示するものとは大きく異なります。
14673 gu27mox 20 0 3280404 468380 19176 R 100.0 2.9 6:08.84 pwanew_3pic_com
Valgrindの測定単位は何ですか?
/usr/bin/time -v ./test.sh
答えはありません-あなたは直接に実行可能養う必要があります/usr/bin/time
ように:
/usr/bin/time -v pwanew_3pic_compass_2008florian3_dfunc.static card_0.100-0.141_31212_resubmit1.dat_1.140_1.180 1.140 1.180 31212
Command being timed: "pwanew_3pic_compass_2008florian3_dfunc.static card_0.100-0.141_31212_resubmit1.dat_1.140_1.180 1.140 1.180 31212"
User time (seconds): 1468.44
System time (seconds): 7.37
Percent of CPU this job got: 99%
Elapsed (wall clock) time (h:mm:ss or m:ss): 24:37.14
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): 574844
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 74
Minor (reclaiming a frame) page faults: 468880
Voluntary context switches: 1190
Involuntary context switches: 20534
Swaps: 0
File system inputs: 81128
File system outputs: 1264
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0