web-dev-qa-db-ja.com

linux / unixプロセスの最大メモリ使用量

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

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

336
jes5199

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

grep VmPeak /proc/$PID/status

$PIDを興味のあるプロセスのPIDに置き換えます)

6
erobertc

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

(これはすでに回答された、昔の質問ですが、記録のためだけのものです:)

私はYangのスクリプトに触発され、 memusg という名前のこの小さなツールを思い付きました。私は単純にサンプリングレートを0.1に上げて、ずっと短い生活プロセスを処理しました。単一のプロセスを監視する代わりに、プロセスグループの合計を測定するようにしました。 (ええ、私は一緒に動くたくさんの別々のプログラムを書きます)それは現在Mac OS XとLinuxで動きます。使い方はtimeと同じでなければなりません。

 memusg ls -alR />/dev/null 

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

本格的なプロファイリングを始める前に、そのような単純なツールを見てみるだけでいいのです。

91
netj

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

61
jbeard4

おそらく(gnu) time(1) はもうあなたが望むことをしています。例えば:

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

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

26
Jon Ericson

/ usr/bin/timeは、おそらくあなたが望むことをしているのでしょう。何かのようなもの。

/usr/bin/time  - フォーマット= '(%Xtext +%Dデータ%Mmax)' 

詳細は時間(1)をご覧ください。

17
simon

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
      . . .
16
rustyx

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

MacOS Sierraでは、以下を使用してください。

/usr/bin/time -l commandToMeasure

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

13
gsamaras

さて、あなたが本当にメモリピークといくつかのより詳細な統計を見せたいのなら、私は valgrind のようなプロファイラを使うことを勧めます。 Nice valgrindのフロントエンドは alleyoop です。

7
alexn
time -f '%M' <run_program>
4
Jason

これを行うには、 Valgrind のようなツールを使用できます。

4
Dana the Sane

これは(他の答えに基づいて)すでに実行中のプロセスを監視する非常に単純なスクリプトです。あなたは引数としてあなたが見たいプロセスの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
4
static_rtti

Heaptrack はGUIとテキストインターフェースを持つKDEツールです。プロセスのメモリ使用量を理解するのはvalgrindよりも適していると思います。なぜなら、プロセスの詳細とフレームグラフを提供するからです。それはそのvalgrindをチェックすることを少なくするのでそれはまた速いです。そしてそれはあなたにピークメモリ使用量を与えます。

とにかく、ページが共有される可能性があるため、rssとvssの追跡は誤解を招く可能性があるため、memusgname__がその理由です。あなたが本当にすべきことは、/proc/[pid]/smaps内のPssname__の合計を追跡すること、またはpmapname__を使用することです。 GNOME system-monitor 以前はそうしていましたが、高すぎました。

1
Benoît
1
Hans W

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

カスタムコマンド出力

0
147.3k

「htop」は、どのプロセスがどのくらいのRAMを使用しているかを確認するのに最適なコマンドです。

詳細については http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html

0
Sanket

MacOSでは、代わりにDTraceを使うことができます。 "Instruments"アプリはそのための素晴らしいGUIです、それはXCode afaikが付属しています。

0