私はこれが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(Resident Set Size)またはVSZ(Virtual Size)情報を使用する必要がありますか?ウィキペディアとフォーラムでいくつかの内容を読んだが、違いを完全に理解したかどうかはわかりません。また、そのどれも信頼できるようではありません。それでは、メモリ使用量を確認するためにプロセスをどのように監視しますか?
この問題の助けが役に立ちます。
ベストアンサー1
RSSは、プロセスが現在メインメモリ(RAM)に持っているメモリの量です。 VSZ は、プロセスの総仮想メモリ量です。これには、RAM内のメモリと交換されたメモリの両方を含むすべての種類のメモリが含まれます。この数には共有ライブラリやその他の種類のメモリも含まれているため、歪むことがあります。 500個のインスタンスを実行できbash
、そのインスタンスの合計メモリスペースはRSSまたはVSZ値の合計ではありません。
プロセスのメモリスペースをさらに詳しく調べるには、いくつかのオプションがあります。/proc/$PID/map
気に入らないものを見つけて削除できます。共有ライブラリであれば、必要に応じて計算が複雑になることがあります(私の記憶では)。
プロセスのヒープサイズにのみ興味がある場合は、いつでもファイル内[heap]
の項目を解析できますmap
。プロセスヒープにカーネルが割り当てるサイズは、プロセスが所有する正確なバイト数を反映したり、反映しない場合があります。尋ねる割り当てられます。この問題を解決できる小さな詳細、カーネルの内部、最適化があります。理想的には、プロセスに必要なサイズであり、システムページサイズの最も近い倍数に丸められます(getconf PAGESIZE
この値からわかります。PCではおそらく4,096バイトです)。
プロセスのメモリ量を確認するには割り当てられた、最良のアプローチの1つは、カーネル側の指標を放棄することです。代わりに、このメカニズムを使用してCライブラリのヒープメモリ(使用可能)割り当て機能を検出できますLD_PRELOAD
。個人的には、私はvalgrind
このようなことに関する情報を得ることを一種の乱用します。 (アプリを検出するにはプロセスを再起動する必要があります。)
おそらくランタイムもベンチマークするので、valgrind
プログラムは少し遅くなります(たぶん許容範囲内)。