Topics
Enterprise Architecture
WebLogic Real Time 1.0 "Trader" アプリケーションのパフォーマンス分析
Pages:
1,
2,
3
Traderサンプルは、サーバサイドのJ2EE MDBとの間でリクエスト/応答形式のJMSメッセージングを実行するマルチスレッド Jythonクライアントで構成されます。適用可能な場合、Java Spring Frameworkを利用しています。サーバサイドのコードは、株価キャッシュ、株価更新サービス、株価照会サービス、株式注文サービスを実装します。サンプルに含まれるベンチマークフレームワークは、 Grinder Java Load Testing Framework(Java負荷テストフレームワーク)です。さらに、ベンチマーク出力およびJVMの冗長GCログからの出力を解析し、グラフ化するプログラムが含まれています。
|
コンポーネント |
機能 |
|
FixMLフォーマットのメッセージ |
リクエストおよび応答は、 FixML 4.4 schemaを使用して XMLBeans形式にエンコードされたJMSテキストメッセージです。 |
|
株価キャッシュ |
継続的に更新される株価データの、サーバサイドのインメモリキャッシュ。 |
|
株価更新サービス |
株価キャッシュの更新は、外部のデータフィードによって行われることを前提とします。このフィードは株価キャッシュを更新するMDBによってエミュレートされます。 ベンチマークではこのフィードを エミュレートせず、事前に生成される株価キャッシュを代わりに使用します。 |
|
株価照会サービス |
非トランザクション型MDB。非永続的な株価照会リクエストを受信し、インメモリの株価キャッシュを検索し、リクエスト元が指定した返信送り先に非永続的な応答を返送します。 |
|
注文サービス |
トランザクション型MDB。1回のトランザクションは、永続的な注文リクエストメッセージを受信し、(Spring DAOを介して)データベースにリクエストのレコードを挿入し、リクエスト元が指定した返信送り先に非永続的な応答を返送する一連の処理で構成されます。 ベンチマークでは、 エミュレートされたリソースマネージャを使用してデータベースをエミュレートします。 |
|
クライアントの株価照会リクエスト/応答 |
Jythonベンチマーククライアントは、同期的な株価照会リクエストを実行します。クライアントは株価照会サービスに、株価照会リクエストの非永 続的JMSメッセージを送信し、応答を受信するための一時キューを指定します。リクエストメッセージの送信後、非同期コンシューマを介して非永続的な応答 を受信するまで、クライアントはブロックします。非同期コンシューマは確認応答を呼び出しません(no-ACKモード)。 |
|
クライアントの注文リクエスト/応答 |
Jythonベンチマーククライアントは、同期的な注文リクエストも実行します。クライアントは注文サーバに、注文リクエストの永続的JMSメッ セージを送信し、応答を受信するための一時キューを指定します。リクエストメッセージの送信後、非同期コンシューマを介して非永続的な応答を受信するま で、クライアントはブロックします。非同期コンシューマは確認応答を呼び出しません(no-ACKモード)。 |
|
ベンチマークリクエスト |
ベンチマークリクエストでは、まずクライアントの株価照会リクエスト/応答を4回連続で実行し、次にクライアントの注文リクエスト/応答を1回実行 します。ベンチマークフレームワークは、1つ以上のスレッド内でベンチマークリクエストを実行し、必要に応じて複数のクライアントJVMを使用します。 WLRTのTraderベンチマークの主な意図は、個々の株価照会リクエストおよび注文リクエストのレイテンシを測定することです。 |
Traderサンプルに適用した以下のチューニングガイドラインの目的は、プログラミングのベストプラクティスへの準拠度を高め、スループットを向 上させ、レイテンシを低減し、ベンチマークの目的に合わせてサンプルを単純化することでした。これらのチューニングの組み合わせにより、スループットは 10倍超に向上し、レイテンシは90%以上減少し、ベンチマークを何時間実行しても安定した結果を得られるようになりました。
重量JMSオブジェクト(JMS接続、セッション、プロデューサ、コンシューマ、一時送り先)を1つ1つのメッセージに対して開いたり閉じたりする 代わりに、キャッシュして再利用するようにクライアントアプリケーションおよびサーバMDBのコードを改良しました。これは標準的なベストプラクティスで あり、安定的に低い応答時間を達成するために必要でした。
安定的に低い応答時間を達成するために、サーバJVMだけでなくクライアントJVM上でもDetGCオプションを使用する必要がありました。た だし、負荷の高い少数のクライアントが1台のマシン上で動作しているのではなく、(実際のアプリケーション環境で典型的なように)それほど負荷の高くない クライアントが多数のマシンに分散しているような環境では、クライアントでのDetGCの使用は必要ではない可能性もあります。
カスタムJMS接続ファクトリのチューニングでは、 MessagesMaximum属性を使用して、サーバとコンシューマの間の処理中メッセージのためのメッセージパイプラインのサイズを 1に制限しました。また、これらのカスタムファクトリを参照するようにMDBとクライアントの両方を変更しました。これはスループットよりもレイテンシを優先する設定であり、アプリケーションによっては応答時間が改善される可能性があります。
MDBとクライアントの両方が、非同期メッセージ処理のために十分な数のスレッドを利用できることを保証するために、クライアントスレッドプールの スレッド保持数を32に増やし、株価照会Beanおよび注文Beanに32個の専用サーバスレッドを与えました。専用スレッドを利用するために、注文 Beanおよび株価照会Beanの両方について、MDB記述ファイルで max-beans-in-free-poolの値を32に設定しました。
Javaヒープサイズの設定値が大きすぎると、確定的GCエンジンではGC処理の遅延時間が長くなり、さらに長いGC休止が発生する可能性があります。この問題は後のJRockitバージョンで解決されました。JRockit上で GCトリガの設定値を小さくする回避方法もありますが、Traderサンプルの目的のために、今回はその方法ではなくサーバJVM用に構成されるメモリ容量を256MBに制限することにしました。
ベンチマークの目的のために、データベースへの呼び出しを、 エミュレートされたXAリソースマネージャを利用する呼び出しに置き 換えました。これは、注文をデータベースに記録するレイテンシと、2フェーズトランザクションのオーバーヘッドをエミュレートします。またこれは、データ ベーステーブルの肥大化や、実行ごとにデータベースのパフォーマンスが一定しないという潜在的な問題にも対処します。
メモリリーク位置の特定に加えて、キャッシュされる必要があったリソースの位置を特定するために、次の3つのツールが非常に有効でした。
これらのベンチマークの意図は最大のレイテンシを測定することであるため、ベンチマークと関連のないプロセスが干渉しないことの保証は通常よりも重 要でした。そのようなプロセスの処理はスループットにはそれほど影響しないかもしれませんが、応答時間の測定には容易に干渉する可能性があります。そのた め、アクティブにログインしているユーザがいないこと、ウイルスチェッカが無効になっていること、などの保証に配慮しました。
ここでは、ベンチマーク環境の詳細を示します。
マシン1台のベンチマークでは、サーバとクライアントの両方をDell 6650上で実行しました。マシン2台のベンチマークでは、HP DL380上でサーバを、Dell 6650上でクライアントを実行しました。HP DL380はDell 6650よりずっと高速なディスクドライブを装備し、トランザクション型および永続的なメッセージングの処理を高速化しています。
|
製品/ライブラリ |
バージョン |
|
BEA WebLogic Server |
9.1 |
|
BEA JRockit JVM |
5.0 R26 |
|
Sun JVM |
1.5.0_04-b05 |
|
Spring |
1.2.6 |
|
XMLBeans |
1.0.3 |
|
Grinder |
3.0-beta27 |
|
JRockit JVM |
|
|
クライアントオプション |
-Xms128m -Xmx128m -Dweblogic.ThreadPoolSize=32 |
|
サーバオプション |
-Xms256m -Xmx256m -Xverbose:opt,memory,memdbg,gcpause,compaction,license |
|
Deterministic GCオプション |
-Xgcprio:deterministic |
|
Sun JVM |
|
|
クライアントオプション |
-Xms128m -Xmx128m -Dweblogic.ThreadPoolSize=32 |
|
サーバオプション |
-server -Xms256m -Xmx256m -XX:+UseSpinning -verbose:gc |
|
GC休止低減オプション |
-Xincgc |