web-dev-qa-db-ja.com

RAMプログラムの実行中に使用された量を伝えるUnixコマンド?

スクリプト(Pythonなど)を実行しているとしましょう。プログラムにかかった時間を知るために、

time python script1.py

スクリプトの実行中にRAMが使用された量を追跡するコマンドはありますか?使用可能な量RAMを見つけるために、 freeですが、このコマンドは上記のタスクに適合しません。

37
ShanZhengYang

time(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コマンドとtimebash builtin )を混同しないでください。完全なファイルパス/usr/bin/timeシェルに組み込みコマンドではなくコマンドを実行するように要求する)を入力するか、command timeまたは\time( _(Toby Speight &への感謝、そして Arrow へのコメント)。

だからあなたは試すかもしれません(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で実行しませんが、独自の仮想アドレススペース(およびその中で実行)を持ち、カーネルは高度な によって仮想メモリを実装しますデマンドページング レイジー コピーオンライト テクニックを使用し、 [〜#〜] mmu [〜#〜] を構成します。 [〜#〜] ram [〜#〜] は、仮想メモリを実装するためにカーネルによって使用され、管理されている内部の物理デバイスおよびリソースです( ページキャッシュ および スラッシング )についても参照)。

オペレーティングシステム についてさらに理解するために数日を費やすこともできます。無料でダウンロードできる本である オペレーティングシステム:3つの簡単な小片 を読むことをお勧めします。RAMはオペレーティングシステム全体で(直接ではなく個々のプロセスによって)使用され、特定のプロセスのRAM内の実際のページは、時間の経過とともに変化する可能性があります(他のプロセスと何らかの形で共有される可能性があります)。したがって、RAM所定のプロセスの消費量は、絶えず変化しているため(平均値やピーク値などが必要になる場合があるため)、同様に仮想アドレス空間のサイズについても明確に定義されていません。

(特にスクリプトが数秒間実行される場合) top(1) ユーティリティ(おそらく他の端末で))、または ps(1) または pmap(1) - watch(1) を使用して、psまたはpmapコマンドを繰り返すことができます。/proc/を直接使用することもできます( proc(5) ...を参照)、おそらくwatch cat /proc/$(pidof python)/statusまたは/proc/$(pidof python)/statまたは/proc/$(pidof python)/mapsなど...

しかしRAMの使用法(カーネルによって一部のプロセスで)広く時間とともに変化します特定のプロセスに対して(そしてその仮想アドレス空間でさえも)たとえば、 ld-linux(8)dlopen(3)malloc(3)munmap and manyによって使用される m​​map(2) およびfreeへの呼び出しによって) Pythonインタープリターに必要な他の関数...).

また、 strace(1) を使用して、スクリプトのPythonによって実行される システムコール を理解することで、mmapmunmapと他の syscalls( 2) )。-e trace=%memoryまたは-e trace=memorystraceを制限して、メモリ(つまり仮想アドレス空間)関連のシステムコールのみを取得することができます。

ところで、 tracemalloc Python機能も役に立ちます。

あなたのみ仮想メモリに注意してください。これは、Pythonインタープリターによって使用される仮想アドレス空間(RAMではない)に関するものですPythonスクリプトを実行します。そして、それはプロセスの実行中に変化しています。 RSS(または仮想アドレス空間の最大ピークサイズ)は、実際に知っておくと役立ちます。

LinuxAteMyRAM も参照してください。

52

伝説的な 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プロセスのピークメモリ使用量 を参照してください。

17
cat

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

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

2
upkar