2009-09-08 10 views
8

私たちのアプリケーションには〜10のスレッドが別々のタスク(スレッドプールなし)を持っています。デッドロックは発生していませんが、要求に応答するために待ち時間を短くしようとしているので、どのロックが最も競合しているかを判断することに関心があります。 jconsoleは、スレッドがブロックされる頻度を示しています。非常に頻繁ではありませんが、最も重視されているロックを知りたいと考えています。最も競合しているロックを特定しますか?

私たちはSun JVMを使用しているため、IBMのJLAは役に立たず、Solarisでは動作していないため、dTraceを使用することはできません。

編集:プロデューサーがアプリを受け入れられないほど遅くするような、この観測をプロダクションで行いたいと思います。これは取引システムです。遅い場合は金銭を失うため、生産時にはプロファイラを実行しません。また、パフォーマンステストで話す多くの交流をシミュレートするのは非常に難しいです。

+0

dTraceは私が個人的に知っている唯一のシステムであり、プロファイリングツールなしであなたが望むのはそれだけです。 – aperkins

+0

これについてもっと考えてみると、私は計装が最良のアプローチだと感じています。個々のロック要求をログに記録するか、グローバルカウンタを保持することができます。 –

答えて

7

YourKitのような良いプロファイラーを入手してください。それは、そこに含まれている特定のメソッドとオブジェクトモニターで、どれくらいの時間待って、ブロックするのに費やされているかを示すことができます。例えば:生産指標についてコメントに関しては

alt text http://i25.tinypic.com/j8ocbm.jpg


は、あなたは非常にあなたが集めることができるものに制限されています。あなたが得ようとしているほとんどの情報は、実行中のすべてのスレッドに関するメタデータを与えることができるThreadMXBeanです。しかし、特定のオブジェクトモニターの競合についての情報は得られません。

ここではアイボリータワーに乗りたいとは思わないが、できるだけ近いところでプロダクション環境を複製しようとするのが最善の策だと思う。そのような準備をしばらく時間を費やすことは、将来にわたって何度も配当を支払うことになります。

シミュレートされたが十分に良い環境でプロファイラを実行しても、おそらく良い情報が得られます。

+0

JProfilerにも同様の機能があります。しかし、私はプロデューサーがアプリを受け入れがたいほど遅くなるプロダクションでこの観察をしたい。 これは取引システムです。私たちが遅い場合、私たちはお金を失うため、プロダクションではプロファイラを実行しません。パフォーマンステスト環境で話す多くの交流をシミュレートすることも非常に難しいです。 –

+0

@テッド、あなたの質問を編集して、あなたができることとできないことを劇的に変えるので、その情報を追加したいと思います。 – Kevin

+0

ありがとうKevin、編集中。 私たちは過去に非常に役立っていたパフォーマンステスト環境を持っていますが、ほとんどの高頻度ファイナンスショップは、実際の世界をシミュレートするには多大な時間を費やすことが生産的ではないと判断しました。 あまりにも多くのダメージを与えることなく、プロダクションでプロファイラを実行できるトレードを探します。 –

4

データベースで同様の問題が発生した場合、要求を行う直前とロックを取得した直後にログを記録します。解放後もログを記録します。このデータを後処理して、探している種類の統計を生成します。

EDIT:開発されたシステムの上で、AspectJはログを生成するのに適しているかもしれません。

5

テッド、私はあなたの状況に共感しますが、パフォーマンスがそれほど重要な場合は、弾丸を噛んでシミュレーションすることをお勧めします。

あなたのエクスチェンジからメッセージフローを生成しようとするのではなく、入ってくるフローを記録してシミュレーションで再生してみてはいかがですか?

このようなことがなければ、測定しているシステムに影響を及ぼすHeisenbergの問題に常に遭遇しています。

関連する問題