2009-05-13 7 views
6

特定の状態でさまざまなプログラムがどの程度のメモリにアクセスしたかを追跡したいと思います。たとえば、グラフィカルなプログラムがあるとします。イメージやフォントの読み込みと多数のライブラリ関数の実行が必要なウィンドウを再描画しないので、最小化するとメモリ使用量が大幅に減る可能性があります。これらのオブジェクトはメモリ内でアクセス可能ですが、実際には使用されていません。Linuxプログラムで積極的に使用されているメモリを追跡する

topのようなツールは、プログラムのアドレススペースにマップされているメモリの量と、物理RAMにどれくらい存在しているかを示すだけなので、使い方が限定されています。同様に、リークディテクタはメモリがアクセスできない場合にのみ使用され、使用されていない場合には通知されません。

このように積極的に使用/未使用メモリを追跡できる既存のツールはありますか?可能であれば、私はヒープ上だけでなく、プログラム/ライブラリコードを格納するメモリ内でも使用状況を追跡したいと思います。


編集:私は明確にしたい:私はそれが特定の状態に達するとプログラムが実際、すなわち、読み取り、書き込み、または特定のポイントの後に実行される多くの多くのメモリを知りたいです。アドレス空間のページ数と常駐ページ数は重要な測定値ですが、これは私が探しているものではありません。

私は今、3つのアプローチを追求しています:

  1. 私は/ procの/自己/マップから読み取る(スタックと自身のコードを除く)すべてのメモリ領域の保護ビットをクリアし、ライブラリを書きました`mprotect`を使ってください。保護ビットを復元してカウンタをインクリメントするsegfaultハンドラがあります。私はそれを `LD_PRELOAD`でロードし、シグナルの受信時にメモリアクセスの追跡を開始します。これは、見かけ上偽のアドレス(いくつかのレジスタや障害時に近くのメモリに格納されていない)でいくつかの本物の障害を生成しています。
  2. 私は `mmap`がエラーを返すまで、` mmap`を使ってメモリから割り当てて読み出す `purge`プログラムを書いています。これにより、 `purge`が実行されている間中断されているターゲットプロセスからすべてのページが強制的に出力されます。次に、 `pidstat`を使って、ターゲットプロセスが再開されたときのページイン数を数えます。これはうまくいくようですが、非常に鈍い道具です。どのページに触れたかについての情報は提供していません。
  3. 私は、valgrindを使用すると、メモリアクセスなどの特定のイベントで特定のアクションが実行されるようなプラグインを作成できると言われました。これはこれまでのところ有望です。
+0

重複:http://stackoverflow.com/questions/131303/linux-how-to-measure-actual -memory-of-an-application-or-process – lothar

答えて

2

valgrindツールのcachegrindは、メモリ使用量をトラッキングするのに適しています。

また、キャッシュグレイドの出力をグラフィックで表示するツールがいくつかあります。

更新情報に返信する編集:
valgrindの出現前に、私はmpatrolというプロジェクトを使用しました。
mprotect()を使用してページを読み取り専用にし、
ページへのアクセスを追跡します。また、レポートを開始および停止するタイミングを指定することもできます。
は、n番目のmallocの後など、特に仕様です。

あなたが探している機能の多くまたはすべてを実行することがあります。

警告1つは、多く、よりも遅いです。

2

これは、/ proc/pid/smapsのデータから取得できます。これにより、マップされた各領域(スタック、テキスト/データ、および匿名でマップされた領域を含む)のRSS値がブレークアウトされるため、スタックされた各オブジェクトとスタックおよびヒープに存在するものを正確に見ることができます。役に立つかもしれません

いくつかのリンク:

関連する問題