適切なメモリ断片化プロファイラーはありますか? (Linux gcc バージョンがいいでしょう)。カスタム malloc/free 関数を使用しているため、Valgrind はこれを分析できません。
ありがとう、アンドリュー
適切なメモリ断片化プロファイラーはありますか? (Linux gcc バージョンがいいでしょう)。カスタム malloc/free 関数を使用しているため、Valgrind はこれを分析できません。
ありがとう、アンドリュー
私はmtraceから始めます。トレースがある場合、glibc にはリークを検出する perl スクリプト mtrace(1) が付属しています。ただし、トレース形式はわかりやすいので、これを断片化解析に簡単に処理できます。
残念ながら、答えはValgrind です。
どの関数が割り当てを行うために使用され、どのように割り当てを行うかを Valgrind に伝えることができます (そのため、アプリケーションを変更して再コンパイルする必要がありますが、デバッグを行っていない場合、変更は noops にコンパイルされます)。詳細は次のとおりです。 Valgrind マニュアルメモリ プール: カスタム アロケータの操作。
これが完了すると、ヒープの使用状況を診断できる 2 つのツール、massif と DHAT が手に入ります。 .
Massif "はヒーププロファイラーです。プログラムが使用するヒープメモリの量を測定します。これには、有用なスペースと、ブックキーピングとアライメントの目的で割り当てられた余分なバイトの両方が含まれます。プログラムのスタックのサイズも測定できます。 、デフォルトではそうしませんが。」
「グラフ」を作成できるため、一種のグラフィカルです。
19.63^ ### | | # | | # :: | | # : ::: | | :::::::::# : : :: | | : # : : : :: | | : # : : : : ::: | | : # : : : : :: | | ::::::::::: # : : : : : ::: | | : : # : : : : : : :: | | ::::: : # : : : : : : :: | | @@@: : : # : : : : : : : @ | | ::@ : : : # : : : : : : @ | | :::: @ : : : # : : : : : : : @ | | ::: : @ : : : # : : : : : : : @ | | ::: : : @ : : # : : : : : : : @ | | :::: : : @ : : # : : : : : : @ | | ::: : : : @ : : # : : : : : : @ | | :::: : : : : @ : : # : : : : : : : @ | | ::: : : : : @ : : # : : : : : : : @ 0 +------------------------------------------------ ----------------------->KB 0 29.48 スナップショットの数: 25 詳細なスナップショット: [9、14 (ピーク)、24]
さらに、非常にきれいなグラフを生成するMassif Visualizerがあります。
DHATを使用すると、アプリケーションがそのヒープをどの程度正確に使用しているか、どの部分が短命であるか、プログラムの全期間にわたって保持されているが最初にのみ使用されているかなどを診断できます。残念ながら、適切なグラフやグラフィカル ツールはありません。これにより、出力は純粋なテキストになります。ありがたいことに、取得したいデータの量と並べ替え方法を指定できるので、思ったほど悪くはありません。
カスタム メモリ管理のセグメント データ構造をどのようなツールで理解するのか、理解に苦しみます。ビジー ディストリビューション (malloc/free へのフック) を取得できるかもしれませんが、フリー ディストリビューション (本質的には断片化) は宙に浮いているようです。
それでは、ビジー/空き統計/ヒストグラムをカスタム メモリ マネージャーに追加してみませんか。ビンがlog2(サイズ)に比例するものでインデックス付けされている場合、O(1)は、分割して合体するときにこれらの統計を保持し、サイズを知っており、log2(サイズ)に比例するインデックスを使用して直接ルックアップでビンを見つけることができます
例: ヒストグラム ビン間隔
[2^n,2^(n+1) ) ...
(たとえば、より細かいビンが必要な場合は、x86 [ビットスキャン、比較、設定、追加]で4つの整数命令で計算できる対数ベースの平方根2(サイズ)を使用します)
使用する妥当なビン サイズの別のセットは、次のオープン インターバルです。
[2^n, 2^n+2^(n-1) ),[2^n+2^(n-1),2^(n+1) )...
ここでも簡単に計算できます [ビットスキャン、シフト、および加算])
nedmallocは非常に優れたカスタムアロケータであり、ソースが付属しており、断片化を回避するように最適化されています。
私はそれをプラグインし、断片化統計のためにその内部ロギングを調べ始めます。