コンテンツにスキップ

DHAT - 動的ヒープ 分析ツール チートシート

DHAT - 動的ヒープ 分析ツール チートシート

DHAT(動的ヒープ 分析ツール)はValgrind ツールは最も メモリー プロファイラーから異なるクエスチョンに回答:ただ「メモリー いくら割り当てたか」、それはメモリーが実際にどのように使用されたレポート:割り当てされてされた決して読み、書かれた一度および決して触れられていない、非常に短命割り当て、および割り当てされた多くより大きいバイト実際にアクセス。その使用ビューはサイズのみプロファイラー が見ることができない無駄をしばしば示す。

インストール

PlatformCommand
Debian/Ubuntusudo apt install valgrind
Fedora/RHELsudo dnf install valgrind
Arch Linuxsudo pacman -S valgrind
macOS制限サポート;LinuxをLinux を好む
Verifyvalgrind --tool=dhat --version

有用なスタック トレース用-gでプログラムをビルド。DHATはValgrind下で実行し、かなりの遅くなりを予期—これは分析ツール、本番プロファイラーではありません。

DHAT実行

valgrind --tool=dhat ./my-program
# → dhat.out.<pid>を生成
OptionPurpose
--dhat-out-file=FILE出力パス
--mode=heapデフォルト ヒープ プロファイリング
--mode=copyプロファイル メモリー コピー(memcpyなど)
--mode=ad-hocカスタム計測ポイント
--num-callers=Nレポートのスタック 深さ

結果を表示

DHAT出力はJSON、バンドルHTMLビューアーで表示:

# ビューアーを開きdhat.out.<pid>をロード
firefox /usr/libexec/valgrind/dh_view.html
UI elementShows
Tree of allocation pointsコール スタック グループ化
Total / max bytesサイト毎ボリューム
Reads / writesメモリーが実際にアクセスされた量
Lifetimesブロックが生きた長さ
Sorting最悪いのを見つけるため任意メトリック

重要なメトリック

MetricReveals
Total bytesこのサイトからの全体割り当てボリューム
Max bytesピーク同時使用
Reads / writesアクセス強度
Reads = 0割り当てが決して読まれた—純粋な無駄
Writes = 0決して初期化—可能バグまたは無駄
Short lifetimesチャーン;スタック/プーリング候補
Access ratioアクセスされたバイト対割り当てられたバイト

「読み取り = 0」ケースは古典的なDHAT検出:メモリー プログラムそれぞれ割り当て、埋める、解放するもの何も決して読むなし。

共通検査結果と修正

FindingLikely fix
Many tiny short-lived allocationsスタック 割り当て、アリーナ、またはオブジェクト プール
Large block, tiny accessed portionのみ割り当て使用;遅延ロード
Never-read allocations作業まるごと削除
Repeated alloc/free of same sizeバッファー再利用
Oversized containers正確な容量予約

コピー モード

valgrind --tool=dhat --mode=copy ./my-program

コピー モードプロファイルmemcpy/memmoveボリューム コール サイト—プロファイリング コピーで時間示し、どのコードが責任を知る必要がある有用。

アドホック モード

アドホック モードはコード注釈DHAT クライアント リクエスト任意イベントをカウント、DHATを汎用「どのコール スタックはこれをほとんどする」カウンター に変える。

DHAT対関連ツール

AspectDHATmassifheaptrackBytehound
Focusメモリー使用方法ピーク使用時間割り当てプロファイリングインタラクティブ 探索
Overhead高い(Valgrind)高い(Valgrind)低い低い
Unique insight読みたくない/使用されていない ブロックピーク スナップショットチャーン +リーク豊か フィルタリング
Best for無駄作業検出ピーク 削減高速現実的 実行ディープ インタラクティブ 分析

現実的 実行低オーバーヘッド プロファイリングheaptrackまたはBytehoundを使用;メモリーが割り当てされたかどうか実際に使用されたことを知ることを望む場合DHATに到達。

リソース