スクリプト(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で行われました(したがって、mmap
&munmap
および他の使用方法を理解できます)システムコール(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
答え3
pmapコマンドを使用すると、プロセスで使用されているメモリ量を表示できます。あなたの場合は、pmapコマンドへの入力としてスクリプトのPIDを提供する必要があります。
pmap $(ps -ef | grep **<SCRIPT NAME>** | grep -v grep | awk '{print $2}')