5

C++ で記述されたデーモンをプロファイリングする必要があるため、gprof は、gmon.out を取得するためにプロセスを終了する必要があると言います。ctrl-c で gmon.out を取得するアイデアを誰かが持っているのだろうか? CPUサイクルのホットスポットを知りたい

4

3 に答える 3

3

C++ で記述されたデーモンをプロファイリングする必要があるため、gprof は、gmon.out を取得するためにプロセスを終了する必要があると言います。

これは、デーモン プロセスをデバッグする通常の方法に適合します。つまり、デーモンを強制的にフォアグラウンドで実行するスイッチを (たとえば、コマンド ライン オプションを使用して) プロビジョニングします。

ctrl-c で gmon.out を取得するアイデアを誰かが持っているのだろうか?

私はそのようなオプションを知りません。

ただし、gmon の場合は への呼び出しexit()で十分です。たとえば、100K メッセージの処理をテストする場合は、処理されたメッセージごとにインクリメントされるカウンターをコードに追加できます。カウンターが制限を超えたら、単に を呼び出しますexit()

未使用のシグナル (SIGUSR1 や SIGUSR2 など) のハンドラーを追加して、exit()そこから呼び出すこともできます。私は個人的な経験がなく、その場合に gmon が適切に機能するかどうか確信が持てません。

CPUサイクルのホットスポットを知りたい

私の通常のプラクティスは、デーモンと同じソース コードを使用してテスト アプリケーションを作成することですmain()が、デバッグまたはテストする必要がある正確なシナリオ (多くの場合、コマンド ライン スイッチで多くのシナリオを切り替える) をシミュレートする場所は異なります。この目的のために、私は通常、モジュール全体 (ファイルを除く) を含む静的ライブラリを作成しmain()、テスト アプリケーションを静的ライブラリにリンクします。(これは、Makefile を整理するのに役立ちます。)

特にパフォーマンス テストの場合、プロファイラーのサンプリングをゆがめ、出力を役に立たなくすることが多い高価な I/O (または DB アクセス) の呼び出しをバイパスまたは削減できるため、コード内をハックするよりも別のテスト アプリケーションを好みます。

于 2010-08-12T09:48:24.897 に答える
0

デーモンをできるだけ速く動かしたい場合は、この手法でlsstackを使用できます。削除できるのに時間がかかっているものを表示します。ホット スポットを探している場合は、間違ったものを探している可能性があります。通常、絶対に必要ではない関数呼び出しがあり、それらはホット スポットとして表示されませんが、スタックショットには表示されます。

別の良いオプションはRotateRight/Zoomです。

于 2010-08-25T17:33:22.123 に答える
0

最初の提案として、別のツールを使用してみてください。そのデーモンのパフォーマンスがテストで問題にならない場合は、 valgrindを試すことができます。素晴らしいツールです。本当に気に入っています。

于 2010-08-12T07:53:40.007 に答える