13

重複の可能性:
プロセスを強制終了する前に gmon.out を保存する

Linux 環境でサーバー (私が入手できるソース コード、c コード) のプロファイルを作成しようとしています。このサーバーは、Web サーバーのように継続的に実行されます。gprof を使用してサーバーのプロファイルを作成しようとしています。サーバーが単独で終了すると、gmon.out ファイルが生成されます。プロファイリングされたデータを理解するには、gprof と gmon.out を使用できます。今私が抱えている問題は、このサーバーが継続的に実行され、着信ソケット接続、要求などを待っていることです。このサーバーを強制終了すると、gmon.out が生成されません。この時点で、次のオプションが表示されます。

  1. ソースコードを変更してそれ自体をプロファイリングし、SIGKILL シグナルを受信した後にこの情報をログに記録します。これは最も醜い解決策であり、測定にノイズが入る可能性があります。
  2. サーバーがまだ稼働している間に、gprof を使用してこのサーバーのプロファイルを作成する方法があるかもしれません。
  3. 他のツールを試すには?

編集:サーバーはマルチプロセス サーバーです。FreeBSD 7.2 で動作

確かに、人々は以前にこの種の問題を解決したことがあります。SO または外部で有用な情報を見つけることができませんでした。

人々の考えや解決策に感謝します。

本当にありがとう。

更新 1:

  1. gprof はマルチプロセス サーバーでは動作しないようです。サーバーの実行後に gmon.out を取得できた場合、実際には実際の作業を行わない親プロセスのみがインストルメント化されます!
  2. oProfile は、私のサーバーが実行されている FreeBSD をサポートしていません。さまざまな理由で、OS を変更できません (許可されていません)。
  3. Valgrind の Web サイトには、FreeBSD 用のポートがありません。しかし、FreeBSD への移植への言及がいくつかあります。FreeBSD ポート ソースが見つかりませんでした。

何とか valgrind のポートを取得できました。make を実行すると、次のエラーが表示されます。

=> valgrind-stable-352.tar.gz doesn't seem to exist in /usr/obj/ports/distfiles/.
=> Attempting to fetch from ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/.
fetch: ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/valgrind-stable-352.tar.gz: File unavailable (e.g., file not found, no access)
=> Attempting to fetch from http://www.rabson.org/.
fetch: http://www.rabson.org/valgrind-stable-352.tar.gz: No address record
=> Couldn't fetch it - please try to retrieve this
=> port manually into /usr/obj/ports/distfiles/ and try again.
*** Error code 1

Web で valgrind-stable-352.tar.gz を見つけようとしました。私が見つけたリンクはすべて死んでいます。

  1. freebsd に pstack をインストールしましたが、認識された pstack はスタック トレースのみを提供します。参考:http ://sourceforge.net/projects/bsd-pstack/

  2. 私の理解では、systemtap はカーネル空間のイベント、計測など専用です。

間違っているか、情報が不十分である可能性があります。私を訂正して、あなたの考えを教えてください。本当にありがとうございました。

更新 2 : プロファイリングしようとしているサーバーに関する詳細を提供すると役立つと思います。

  1. マルチサーバープログラムです。特定の mysql データベースであるために、I/O バウンド。
  2. スレッドは関係ありません。各子サーバー プロセスは、1 つの要求のみを処理します。サーバーの起動時に、設定可能な数のプロセスが作成されます。
  3. 各機能に費やされた時間とその頻度を見つけたいと思います。関数コードは、CPU バウンドと IO バウンドが混在しています (IO の方が多いと思います)。
  4. FreeBSD 7.2で実行されています
  5. cで書かれています。読み取りの数は、このサーバーを介したデータベースへの書き込みよりもはるかに多くなります。
4

9 に答える 9

5

重要な実稼働システムのプロファイリングには確実に注意を払う必要がありますが、oprofilesystemtapを使用してください。これらは、ディストリビューションに既に含まれている可能性があります。

于 2011-03-03T21:24:27.017 に答える
3

gprofにサービスを提供しても、問題があります。

  • システムコールやI/Oは認識されません。これは、不必要なハングを決して行わないという前提に基づいています。CPUバウンドの問題のみを調べます。

  • 再帰があると、それを処理できません。

  • それが与える時間は、ルーチンへのすべての呼び出しがほぼ同じ時間かかるなど、不安定な仮定に基づいています。行レベルの情報は提供されません。

測定は1つのことですが、CPUであれI / Oであれ、不要なことをしている「ボトルネック」を見つけたい場合は、非常にラフで効果的なツールですlsstack(SourceForgeにあると思います)。

また、Zoomもご覧ください。Linux用の実時間スタックサンプラーです。これはラインレベルのパーセントを示し、実行中のプロセスに接続したり、プロセスから切り離したりできると思います。

于 2011-03-03T22:35:30.623 に答える
3

FreeBSD の oProfile のような代替手段である PmcTools を使用することもできます。

于 2011-03-10T19:01:49.567 に答える
1

SIGTERM ハンドラをオーバーライドして呼び出すことができます。exit(0)これにより、gprof は通常のgmon.out.

于 2011-03-03T21:20:18.293 に答える
0

You might want to look at Dyninst : http://www.dyninst.org/

It is a ptrace()-based API for dynamically adding and removing instrumentation to running code. You can use it for debugging, profiling, etc.

Good luck.

于 2011-03-16T14:31:16.713 に答える
0

サーバーをメソッド(おそらくソケットを介して送信されるコマンド)で拡張してサーバーをスムーズに終了すると、gmon.outが作成されます。それとも私は何かを逃していて、それを殺さずにそれを終了させることは完全に不可能ですか?

于 2011-03-10T19:42:16.553 に答える
0

開発テスト用に fedora/rhel linux ボックスを試すことができれば、そこにある systemtap によってサーバー プロセスがよく見えるようになるはずです。たとえば、ユーザー空間プログラムでアクティブな関数をサンプリングしたい場合は、次のような比較的単純なものが役立つ場合があります。

# stap -e 'global fns; probe timer.profile {if (user_mode()) fns[usymdata(uaddr())] <<< 1 }' -d /bin/yourserver -d /lib/yourlibrary.so -d /lib/yourotherlibrary.so

^Cあなたが終わったら。レポートは次のようになります

fns["memset /lib64/libc-2.12.so+0xa7d/0xb20"] @count=0x56 @min=0x1 @max=0x1 @sum=0x56 @avg=0x1

fns["memset /lib64/libc-2.12.so+0x560/0xb20"] @count=0x12 @min=0x1 @max=0x1 @sum=0x12 @avg=0x1

fns["__GI_strlen /lib64/libc-2.12.so+0x0/0x50"] @count=0x4 @min=0x1 @max=0x1 @sum=0x4 @avg=0x1

fns["gobble_file /bin/ls+0x729/0xc70"] @count=0x1 @min=0x1 @max=0x1 @sum=0x1 @avg=0x1

fns["getuser /bin/ls+0x1c/0xa0"] @count=0x1 @min=0x1 @max=0x1 @sum=0x1 @avg=0x1

fns["getuser /bin/ls+0x23/0xa0"] @count=0x1 @min=0x1 @max=0x1 @sum=0x1 @avg=0x1

于 2011-03-15T18:38:57.520 に答える
0

これはPMPのケースかもしれません

于 2011-03-18T03:44:42.753 に答える
0

私はあまり詳しくありませんが、DTrace を使用してこれを行うことはできませんか?

FreeBSD では、そのサポートが改善されました。 http://wiki.freebsd.org/DTrace/userland

于 2011-03-17T01:02:44.340 に答える