プログラムの実行中にどれだけのRAMを使用しているかを知らせるUnixコマンドは何ですか? [コピー]

プログラムの実行中にどれだけのRAMを使用しているかを知らせるUnixコマンドは何ですか? [コピー]

スクリプト(Pythonなど)を実行しているとしましょう。プログラムがどれくらいかかったかを調べるには、次の手順を実行します。

time python script1.py

スクリプトの実行中にどのくらいのRAMを使用しているかを追跡するためのコマンドはありますか?使用可能なRAM容量を確認するには使用できますが、freeこのコマンドは上記の操作には適していません。

答え1

これ時間(1)コマンド(timeパッケージとしてインストールする必要があるかもしれません/usr/bin/time)は、理解できる形式文字列を含む多くの引数を受け入れます(-fまたは使用--format)。

  %M     Maximum resident set size of the process during its lifetime,
          in Kbytes.
  %K     Average total (data+stack+text) memory use of the process, in
          Kbytes.

/usr/bin/timeこのコマンドを以下と組み合わせないでください。time バッシュ内蔵。フルファイルパスを入力する必要があります/usr/bin/time(シェルで実行するように要求する場合)。注文する内蔵されていません)またはタイプcommand timeまたは\time(ありがとうトビースペート&到着彼らのコメントを聞いてください)。

試してみることができます(RSSは常駐セットサイズ)

/usr/bin/time -f "mem=%K RSS=%M elapsed=%E cpu.sys=%S user=%U" python script1.py

また試すことができます

/usr/bin/time --verbose  python script1.py

質問された内容は次のとおりです。

スクリプトの実行中にどのくらいのRAMが使用されますか?

これはあなたが誤解していることを示します。 Linux(または最新のマルチプロセスオペレーティングシステム)で実行されているアプリケーションは、次のものを使用します。仮想メモリとそれぞれプロセスpythonスクリプトを実行するプロセスを含む)自体仮想アドレス空間プロセスが実行されていませんまっすぐ存在する物理RAMですが、独自の仮想アドレス空間があります(そしてその中で実行)カーネルは複雑な方法で仮想メモリを実装します。ページング要求怠惰を利用する書き込み中のコピー技術と構成メモリ管理ユニット。これメモリ使用および管理される物理デバイスおよびリソース。内部仮想メモリはカーネルによって実装されています(参照:ページキャッシュそして薬勝つ)。

数日間、もっと詳しく知りたいと思うかもしれません。オペレーティングシステム。私は読書をお勧めしますオペレーティングシステム:3つの簡単な部分無料でダウンロードできる本です。 RAMはオペレーティングシステム全体で使用され(個々のプロセスでは直接使用されません)、特定のプロセスRAMの実際のページは時間の経過とともに変更される可能性があります(そして他のプロセスとは何らかの方法で共有されます)。したがって、特定のプロセスのRAM消費は絶えず変化するため(平均値や最高値などが必要になる場合があります)、明確に定義されておらず、仮想アドレス空間のサイズも同じです。

以下を使用することもできます(特にスクリプトが数秒間実行される場合)。タワー(1)ユーティリティ(他の端末にある場合もあります)または参考(1)またはマッピング(1)- たぶん使用する地図時計(1)コマンドを繰り返しpsますpmap。直接使用することもできます/proc/(参照工程(5)...) おそらく、watch cat /proc/$(pidof python)/statusまたは/proc/$(pidof python)/stat/proc/$(pidof python)/maps...

しかし、メモリ使用量(一部のプロセスのカーネルによって)はい広く時間とともに変化特定のプロセスに対して(仮想アドレス空間も変更されます。たとえば、呼び出しを介して)マッピング(2)そしてmunmap使用されるld-Linux(8)ドロペン(3)割り当て(3)freeとPythonインタプリタに必要な他の多くの機能...)。

また、使用することができますトラック(1)理解するシステムコールスクリプトはPythonで行われました(したがって、mmapmunmapおよび他の使用方法を理解できます)システムコール(2))またはメモリ(仮想アドレス空間など)に関連するシステムコールにのみインポートを制限straceできます。-e trace=%memory-e trace=memory

さて、メモリ割り当ての追跡Python関数も役に立ちます。

そうかもしれないと思います。あなたただ仮想に興味を持ってメモリこれは、PythonインタプリタがPythonスクリプトを実行するために使用する仮想アドレス空間(RAMではない)に関するものです。これはプロセスの実行中に変更されます。実際には、RSS(または仮想アドレス空間の最大ピークサイズ)がより便利です。

また、見ることができますLinuxAteMyRAM

答え2

伝説を使うこともできます。valgrind、パッケージマネージャからインストールする必要があります。

$ valgrind c-projects/objtest/bin/objtest 
==6543== Memcheck, a memory error detector
==6543== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==6543== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info
==6543== Command: c-projects/objtest/bin/objtest
==6543== 
|ERROR|array:189: array_delete: delete index 0 but the highest is -1 (delete from empty array): index out of bounds
==6543== 
==6543== HEAP SUMMARY:
==6543==     in use at exit: 480 bytes in 20 blocks
==6543==   total heap usage: 7,390 allocs, 7,370 frees, 256,217 bytes allocated
==6543== 
==6543== LEAK SUMMARY:
==6543==    definitely lost: 96 bytes in 4 blocks
==6543==    indirectly lost: 384 bytes in 16 blocks
==6543==      possibly lost: 0 bytes in 0 blocks
==6543==    still reachable: 0 bytes in 0 blocks
==6543==         suppressed: 0 bytes in 0 blocks
==6543== Rerun with --leak-check=full to see details of leaked memory
==6543== 
==6543== For counts of detected and suppressed errors, rerun with: -v
==6543== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

上級ユーザーで美しいチャートが必要な場合は、ms_print次のコマンドを使用できます。

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

バラよりLinux/Unixプロセスの最大メモリ使用量

答え3

pmapコマンドを使用すると、プロセスで使用されているメモリ量を表示できます。あなたの場合は、pmapコマンドへの入力としてスクリプトのPIDを提供する必要があります。

pmap $(ps -ef | grep **<SCRIPT NAME>** | grep -v grep | awk '{print $2}')

関連情報