Linux / Unixプロセスのピークメモリ使用量


376

コマンドラインを実行し、ピークRAM使用量の合計を報告するツールはありますか?

/ usr / bin / timeに似たものを想像しています

回答:


28

以下は、外部スクリプトやユーティリティを必要とせず、Valgrindやtimeなどの別のプログラムを介してプロセスを開始する必要がないワンライナーなので、すでに実行中のすべてのプロセスに使用できます。

grep VmPeak /proc/$PID/status

$PID興味のあるプロセスのPIDに置き換えてください)


4
PIDがわからない場合はどうなりますか?たとえば、プログラムの実行時間が短い場合(<1秒)
diralik

4
「VmHWM:常駐セットサイズのピーク」は、RAMの使用量を測定するために(他の多くのものも含まれるVmPeakの代わりに)より使いやすいかもしれません。
jfs

@jfsそれはあなたが何を知りたいかによります。IIRC VmPeakは仮想メモリを含む最大合計メモリ使用量であり、VmHWMはピークRAM使用量です。したがって、プログラムが要求したメモリの総量を知りたい場合は、VmPeakを使用してください。特定の時間に実際に使用されたRAMの量を知りたい場合は、VmHWMを使用してください。
erobertc

1
@diralik自分で作成したプログラムをチェックする場合は、コード行を埋め込んで「/ proc / self / status」ファイルを調べることができます。
Fileland

404

[ 編集: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

4
lsはあまり機能していないため、おそらく常に0を返します。CPUに負荷のかかるコマンドを試してください。
ジョンエリクソン

17
manページから:時間によって表示されるほとんどの情報は、wait3(2)システムコールから取得されます。数値は、wait3(2)によって返される数値と同じです。ステータス情報を返すwait3(2)コールがないシステムでは、代わりにtimes(2)システムコールが使用されます。ただし、提供する情報はwait3(2)よりもはるかに少ないため、これらのシステムでは、時間の大半がリソースのゼロとして報告されます。
lothar 2009年

79
「bash:-v:コマンドが見つかりません」とは、bashが独自に使用する時間をインターセプトすることを意味します。/bin/time -vそれを解決します。
gcb 2010年

3
出力に意味があることを確認するために簡単なチェックを行うことは価値があります。Gnu時間には、実際のメモリ使用量の4倍を報告するバグがあります。stackoverflow.com
Ian

24
@skalee time -lMacOSで試してみてください。同様の出力が得られます。
Volker Stolz 2013

96

(これはすでに回答済みの古い質問ですが、参考までに:)

私はヤンのスクリプトに触発され、memusgというこの小さなツールを思いつきました。サンプリングレートを0.1に増やして、短い生活プロセスを処理しました。単一のプロセスを監視する代わりに、プロセスグループのrss合計を測定するようにしました。(うん、私は一緒に動くたくさんの別々のプログラムを書いています)それは現在Mac OS XとLinuxで動きます。使用方法は次のようにする必要がありtimeます。

memusg ls -alR /> / dev / null

それは今のところピークを示すだけですが、私は他の(大まかな)統計を記録するためのわずかな拡張に興味があります。

本格的なプロファイリングを開始する前に、このような単純なツールを確認しておくとよいでしょう。


1
まだPSを使用していて、観測された最上位メモリを特定するのにのみ適しています。実際のトップメモリ​​ではありません。あなたは常にある間隔と別の間隔の間に何かを見逃すことができます。
gcb 2010年

6
memusgスクリプトの出力の単位は何ですか?バイト?キロバイト?
ダニエルスタンダージ2009

1
@DanielStandage:おそらくキロバイト単位。これps -o rss= rssがプロセスの実メモリ(常駐セット)サイズ(1024バイト単位)であるBSD manページから表示される値を単に監視します。
netj 2011

3
@gcbつまり、サンプルを測定しているときに得られるものです。
Volker Stolz 2013年

2
回答にあるmemusgへのリンクが壊れているようです。とにかく、/ usr / bin / timeはこれを非常にうまく行います。
Tom Cornebize、2015

65

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


14
time、あなたから離れます。
jbeard4

1
便利なスクリプトですが、Slackwareシステムでsort -gが必要です(あなたが最も高い値を探していると思います)。
Nick Coleman

3
の+1 valgrind --massif。またms_print、付属のツールを使用して、便利な出力(ASCIIチャートの使用時間の
推移

7
Massifのオーバーヘッドは非常に高くtime、などのコマンドでは少なくとも10倍の時間がかかりlsます。
Timothy Gu 2015年

8
それは確かに非常に巨大です。この回答では、スローダウンについて言及する必要があります。通常、測定したいコマンドの完了には35秒かかります。30分以上前にこのvalgrindコマンドを実行して測定しましたが、まだ完了していません…
unagi

35

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
ロルフ

2
この根拠は、2年前に追加された回答ですでにカバーされていませんか?
Charles Duffy

34

たぶん(gnu)time(1)はすでにあなたの望むことをしています。例えば:

$ /usr/bin/time -f "%P %M" command
43% 821248

ただし、他のプロファイリングツールでは、探しているものに応じてより正確な結果が得られる場合があります。


大きなコマンドであっても、これで常にゼロになるようです
jes5199 2009

同じプログラムで400%0と0%0のようなさまざまな結果が得られます。正確には、より長い時間実行する必要がありますか?
Liran Orevi 2009

何を提案したらいいかわかりません。上記のコードは、たまたまラテックスのコマンドを実行した結果です。私が言うように、他のツールを使用すると、より正確な結果を得ることができます。
ジョンエリクソン

2
これは、少なくともCentOS(したがって、おそらくRHEL)システムで機能します。%Pは、スケジューラーに依存する無関係な統計(%CPU)を提供するため、かなり変動します。
Blaisorblade、2011

2
@Deleteman:timeを使用する場合の組み込みコマンドcshです。正確なパスを使用すると、外部コマンドを実行できるようになります。私の知る限りでは、GNUバージョンのみがフォーマットオプションをサポートしています。
Jon Ericson 2015年

18

/ usr / bin / timeは、おそらくあなたが望んでいることを実際に行います。何かのようなもの。

 / usr / bin / time --format = '(%Xtext +%Ddata%Mmax)'

詳細については、time(1)を参照してください...


1
大きなコマンドでも、これで常にゼロになるようです
jes5199 2009

jes5199、Liran、上記のコメントを見ると、一部のLinuxではメモリレポートでtime(1)が壊れている可能性があります...
simon

Ubuntu 16.04では、テキストとデータはゼロですが、maxはゼロではなく、意味のある値を生成します。私はそれに満足しています。
ステフェイン・グーリッホン

そこのMmaxが意味することを意味することを願っています.... manページはそれについて少し簡潔です
matanster

17

MacOS Sierraの場合:

/usr/bin/time -l commandToMeasure

あなたはgrep多分あなたが欲しいものを取るために使うことができます。


5
この!文字通り1時間かけてInstruments.appとdtraceを取得し、システムの整合性をオン(オフにできない)のメモリプロファイルを取得しようとしましたが、必要なのはこの単純なコマンドだけでした。ちょっとしたメモ。command time -l代わりに使用/usr/bin/time -lすると、シェルtimeは組み込み関数の代わりに呼び出されるバイナリを実際に呼び出すようになります。(はい、commandプレースホルダーでcommand timeはありませんtime。単なるものとは異なります。)
Jakub Arnold

16

プロセスが少なくとも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

1
この方法の主な欠点は、プロセスが短時間(たとえば、終わり近く)に多くのメモリを割り当てる場合、これが検出されない可能性があることです。睡眠時間を減らすことは少し役立つかもしれません。
vinc17 16


8

まあ、本当にメモリのピークといくつかの詳細な統計を表示したい場合は、valgrindなどのプロファイラーを使用することをお勧めします。良いvalgrindフロントエンドはalleyoopです。



5

これは(他の回答に基づく)既に実行中のプロセスを監視する非常に単純なスクリプトです。監視したいプロセスの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


1

Heaptrackは、GUIとテキストインターフェイスを備えたKDEツールです。プロセスのメモリ使用量を理解することは、詳細とフレームグラフを提供するため、valgrindよりも適切だと思います。また、そのvalgrindのチェックが減るため、処理速度も向上します。そして、それはあなたにピークメモリ使用量を与えます。

とにかく、rssとvssの追跡は、ページが共有される可能性があるため誤解を招く可能性があり、そのためですmemusg。実際にすべきことは、Pssin /proc/[pid]/smapsまたはuseの合計を追跡することpmapです。以前はGNOMEシステムモニターがそうでしたが、高すぎました。


1

手作りの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%未満

カスタムコマンド出力




-2

必ず質問にお答えください。詳細を提供し、あなたの研究を共有してください!

申し訳ありません、私はここに初めて来て、質問することしかできません…

使用される提案:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.