重複の可能性:
プロセスを強制終了する前に gmon.out を保存する
Linux 環境でサーバー (私が入手できるソース コード、c コード) のプロファイルを作成しようとしています。このサーバーは、Web サーバーのように継続的に実行されます。gprof を使用してサーバーのプロファイルを作成しようとしています。サーバーが単独で終了すると、gmon.out ファイルが生成されます。プロファイリングされたデータを理解するには、gprof と gmon.out を使用できます。今私が抱えている問題は、このサーバーが継続的に実行され、着信ソケット接続、要求などを待っていることです。このサーバーを強制終了すると、gmon.out が生成されません。この時点で、次のオプションが表示されます。
- ソースコードを変更してそれ自体をプロファイリングし、SIGKILL シグナルを受信した後にこの情報をログに記録します。これは最も醜い解決策であり、測定にノイズが入る可能性があります。
- サーバーがまだ稼働している間に、gprof を使用してこのサーバーのプロファイルを作成する方法があるかもしれません。
- 他のツールを試すには?
編集:サーバーはマルチプロセス サーバーです。FreeBSD 7.2 で動作
確かに、人々は以前にこの種の問題を解決したことがあります。SO または外部で有用な情報を見つけることができませんでした。
人々の考えや解決策に感謝します。
本当にありがとう。
更新 1:
- gprof はマルチプロセス サーバーでは動作しないようです。サーバーの実行後に gmon.out を取得できた場合、実際には実際の作業を行わない親プロセスのみがインストルメント化されます!
- oProfile は、私のサーバーが実行されている FreeBSD をサポートしていません。さまざまな理由で、OS を変更できません (許可されていません)。
- 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 を見つけようとしました。私が見つけたリンクはすべて死んでいます。
freebsd に pstack をインストールしましたが、認識された pstack はスタック トレースのみを提供します。参考:http ://sourceforge.net/projects/bsd-pstack/
私の理解では、systemtap はカーネル空間のイベント、計測など専用です。
間違っているか、情報が不十分である可能性があります。私を訂正して、あなたの考えを教えてください。本当にありがとうございました。
更新 2 : プロファイリングしようとしているサーバーに関する詳細を提供すると役立つと思います。
- マルチサーバープログラムです。特定の mysql データベースであるために、I/O バウンド。
- スレッドは関係ありません。各子サーバー プロセスは、1 つの要求のみを処理します。サーバーの起動時に、設定可能な数のプロセスが作成されます。
- 各機能に費やされた時間とその頻度を見つけたいと思います。関数コードは、CPU バウンドと IO バウンドが混在しています (IO の方が多いと思います)。
- FreeBSD 7.2で実行されています
- cで書かれています。読み取りの数は、このサーバーを介したデータベースへの書き込みよりもはるかに多くなります。