2 つの優れたプロファイラーを見つけました。
両方試した人いる?どちらが良いですか?
oprofile の方が正確です。CPU パフォーマンス モニタリング (数百のパフォーマンス イベントを備えた組み込みのハードウェア モニタリング) を使用します。
および google-perftools libprofiler.so 使用setitimer
- OS カーネルの間隔タイマー:
$ nm -D libprofiler.so | grep timer
U getitimer
U setitimer
HZ
インターバルタイマーはOSによってエミュレートされ、私が知っているように(1秒あたり100回または1秒あたり1000回または300または250)を超えることはできません。10000 と 100000 の両方を試しましたが、実効レートは 1000 でした (プログラムの実行時間は 2 秒で、Google から CPU プロファイラーによって収集されたサンプルは ~2000 しかありません)。これは私の HZ です:
$ zgrep HZ= /proc/config.gz
CONFIG_HZ=1000
これがティックレスカーネルでどのように機能するかわかりません。
次に、oprofile は CPU で特別なハードウェアを使用し、このハードウェアは数ティックまで正確です。プログラムがある場所で、CPU の 100000 番目または 1000000 番目のティックごとに測定できます。この値は OS HZ 設定に関連付けられていません。また、CPU の N 番目ごとのティックだけでなく、N 番目ごとの L2 キャッシュ ミスや N 番目ごとのjmp
予測ミスなどについてもプロファイリングできます... Pentium Pro 以降の CPU には何百ものハードウェア パフォーマンス イベントがあります.
oprofile のもう 1 つの優れた点は、すべてのユーザー アプリケーション、またはすべてのユーザー アプリケーションまたはカーネルとすべてのアプリケーションをプロファイリングできることです。
ただし、oprofile を使用するには root が必要です (AFAIK)。間違った使用法でシステムをフリーズさせる可能性があります。カーネルで有効にする必要があります (カーネルのビルド時)。
google-perftools の優れた点は次のとおりです。使いやすい。優れたグラフ作成および分析機能。動作するのにルートは必要ありません。また、google-perftools には優れたヒープ プロファイラがあります。
oprofile と google-perftools/cpuprofiler の両方:
callgrind
command を使用して kcachegrind を介して描画することもできます)