先週ずっと気になっていた質問があります。
Windows デバッガーには!heap -s
、仮想メモリのヒープ ステータスを出力し、次の式を使用して外部フラグメンテーションを計算するコマンドがあります。
External fragmentation = 1 - (larget free block / total free size)
効果を計算するために必要な統計を出力する、Linux に同様の方法はありますか?
長い話: 私は、malloc と free を使用して、異なるサイズのスペースの割り当てと割り当て解除を続ける C アプリケーションを持っています。各割り当てには異なる寿命があります。私が使用しているプラットフォームは Lubuntu なので、ptmalloc2
algorithm がデフォルトです。
これらの割り当ては仮想ユーザー空間ヒープで提供され (アロケーターが使用する 128Kb を超えるものを除くmmap
)、実際にアクセスされたときに物理ページにマップされることを認識しています。割り当ての大部分は 80 バイト未満のサイズであるため、FastBins から提供されます。
を使用するValgrind
とMassif
、各割り当てに使用される余分なバイトが報告されるため、内部の断片化を取得できます。
ただし、私の主な関心事は、外部の断片化をどのように把握するかです。/proc/[pid]/smaps
ヒープ サイズと統計は認識していますpmap-d[pid] anon
が、それらを外部の断片化という観点から解釈するのは難しいと思います。
も認識しておりLD_PRELOAD
、動的に接続できます/lib/i386-linux-gnu/libmemusage.so
。このライブラリは、ヒープの合計、ピーク、および要求された割り当てサイズの分布を出力します。
私はそれが現在非推奨であることを知っており、や__malloc__hook
のような実装固有の統計に本当に依存したくありません。ただし、これらの 2 つを使用する提案があれば教えてください。malloc_stats()
mallinfo()
外部の断片化の問題は、ヒープに連続したスペースがないために要求を満たすことができない場合ですが、要求された合計サイズがその領域全体に散らばっていることがわかります。
この効果を計算できるように、必要な統計を取得する方法はまだわかりません。たとえば、 をキャプチャする、 をlive_memory
取得するtotal_free_pages
、または のサイズを取得する必要があることを示すさまざまな式largest_free_block
。ヒープを「トラバース」してそれらの統計を収集する機能をどのように持つことができますか?
よろしくお願いします。