2011-07-12 7 views
1

私はLinuxプロセスで確実に割り当てられたメモリを測定する必要があります。私はmallinfoを探していますが、私はそれをit is deprecatedと読んでいます。このような統計のための最先端の方法は何ですか?プロセスはカーネルからメモリブロックを割り当てました

は基本的に私は、少なくとも二つの数字に興味がある:任意のmallocによって

  • 数(及びサイズ)カーネルから割り当てられたメモリ・ブロック/ページのまたは任意の実装が選択

  • のCライブラリを使用しています( malloc介して、 new、等)ユーザ空間のコードによって割り当てられたメモリの
  • (任意依然として重要)数マイナス(free介して、delete、等)ことによって割り当て解除メモリ

1つの可能性はoverride malloc calls with LD_PRELOADですが、実行時に不要なオーバーヘッドが発生する可能性があります。また、他のライブラリと適切にやり取りできない可能性があります。これはLD_PRELOADに依存しています。

もう1つの可能性はrusageです。

明確にするために、これは、メモリ使用量は、(ブロック・レベルでだけで、より正確な、使用されるメモリの量を表示のMathematica、またはMatlabのと同様に)アプリケーションの固有の特徴ではないデバッグするためのものです

答えて

3

/proc/PID/statusには、いくつかの有用な情報が含まれています(例:cat /proc/$$/statusを実行してみてください)。

VmPeakは、実行中にプロセスの仮想メモリ空​​間が最大になった最大サイズです。これには、実行可能ページ、mmapされたファイル、スタック、ヒープなど、プロセスにマップされたすべてのページが含まれます。

VmSizeは、プロセスの仮想メモリ空​​間の現在のサイズです。

は、プロセスの常駐セットサイズです。つまり、現在どのくらい物理RAMを占有しているのかがわかります。 (典型的なプロセスでは、Cライブラリの大部分のように、決して使用されないたくさんのものがマップされていますが、プロセスがページを必要としない場合、最終的には追い出されて非居住者になります。

VmHWMは、のハイウォーターマークです。すなわち、プロセスの存続期間中にその数が最高であった。

VmDataは、プロセスの「データ」セグメントのサイズです。すなわち、、おおよそのヒープ使用量。 mallocとそれに続いてfreeを行った小さなブロックは、カーネルの観点からはまだ使用されていることに注意してください。大きなブロックは、解放されたときに実際にカーネルに返されます。 (メモリが使用されている場合、 "大"は現在のglibcの128kよりも大きいことを意味します)これはおそらくあなたが探しているものに最も近いでしょう。

これらの測定値は、システム全体の視点から実際に何が起こっているかを示すため、mallocとfreeを追跡しようとするよりも優れている可能性があります。何らかのメモリにfree()と呼ばれているだけで、他のプロセスが使用するためにシステムに返されたわけではありません。

+0

+1:ニースの答えは、個々の値の良い説明! –

4

この目的では、アプリケーション内の "メモリ使用率"イントロスペクション機能 - 最も適切なインターフェイスはmalloc_hook(3)です。これらはGNUの拡張で、malloc()realloc()free()の呼び出しごとに統計情報を保持できます。

アプリケーションがカーネルの視点からマップしたメモリ量を確認するには、/proc/self/smaps疑似ファイルの情報を読み込んで照合することができます。これにより、各割り当てのどれが常駐、スワップ、共有/プライベート、クリーン/汚れなどであるかを確認することもできます。

関連する問題