pidstat
が見つかりました プロセスを監視するための優れたツールになります。特定のプロセスの平均メモリ使用量を計算したいと思います。出力例を次に示します。
02:34:36 PM PID minflt/s majflt/s VSZ RSS %MEM Command
02:34:37 PM 7276 2.00 0.00 349212 210176 7.14 scalpel
(これはpidstat -r -p 7276
からの出力の一部です 。)
常駐セットサイズ(RSS)または仮想サイズ(VSZ)の情報を使用して、平均メモリ消費量を計算する必要がありますか?ウィキペディアとフォーラムでいくつか読んだことがありますが、違いを完全に理解することはできません。さらに、それらのどれも信頼できないようです。では、プロセスを監視してメモリ使用量を取得するにはどうすればよいですか?
この問題に関するヘルプがあれば役に立ちます。
承認された回答:
RSSは、このプロセスが現在メインメモリ(RAM)に持っているメモリの量です。 VSZは、プロセスが合計で持つ仮想メモリの量です。これには、RAM内とスワップアウトされた両方のすべてのタイプのメモリが含まれます。これらの数値には、共有ライブラリや他の種類のメモリも含まれているため、偏る可能性があります。 bash
のインスタンスを500個持つことができます 実行中であり、メモリフットプリントの合計サイズは、RSS値またはVSZ値の合計にはなりません。
プロセスのメモリフットプリントについてより詳細なアイデアを得る必要がある場合は、いくつかのオプションがあります。 /proc/$PID/map
を確認できます 嫌いなものを取り除きます。共有ライブラリの場合、ニーズによっては計算が複雑になる可能性があります(覚えていると思います)。
プロセスのヒープサイズのみを気にする場合は、いつでも[heap]
を解析できます。 map
のエントリ ファイル。カーネルがプロセスヒープに割り当てたサイズは、プロセスが要求した正確なバイト数を反映している場合と反映していない場合があります。 割り当てられます。これを捨てることができる詳細、カーネル内部および最適化があります。理想的な世界では、プロセスが必要とするだけの量になり、システムのページサイズの最も近い倍数に切り上げられます(getconf PAGESIZE
それが何であるかを教えてくれます— PCでは、おそらく4,096バイトです。
プロセスに割り当てられているメモリの量を確認したい場合は、 、最良の方法の1つは、カーネル側のメトリックを放棄することです。代わりに、Cライブラリのヒープメモリ(割り当て解除)関数をLD_PRELOAD
でインストルメントします。 機構。個人的には、valgrind
を少し乱用しています この種のことについての情報を得るために。 (インストルメンテーションを適用するには、プロセスを再起動する必要があることに注意してください。)
ランタイムのベンチマークも行っている可能性があるため、valgrind
に注意してください。 プログラムが少し遅くなります(ただし、おそらく許容範囲内です)。