[JMS] JMSをsupportするruntimeのperformance tuningのpoint

JMSをサポートするランタイム(プロバイダ)のパフォーマンス・チューニングのポイント
JMSデリバリー・モード
*メッセージの永続先
*データ・バッファ
*処理並列度

JMSデリバリー・モード
JMS 1.1のデリバリーモードは2つ
・NON_PERSISTENT
・PERSISTENT

WASのデフォルトJMSプロバイダーは
2つのデリバリー・モードに対して
5つの信頼性オプション(デリバリー・オプション)をサポートする
・ベストエフォート非PERSISTENT(最速)
・高速非PERSISTENT
・高信頼性非PERSISTENT
・高信頼性PERSISTENT
・保障PERSISTENT(最遅)

信頼性とパフォーマンスは
トレードオフの関係

□デリバリー・モードの設定
4カ所で設定可能
JMSクライアントデフォルト
・JMSプロバイダーあて先リソース
・JMSプロバイダー・接続ファクトリにおけるJMSデリバリー・モードと信頼性レベルの対応付け
・バスあて先

*設定方法:JMSクライアントによるデリバリー・モード設定
メッセージ・プロデューサー(JMS接続ファクトリ)のデフォルトデリバリー・モード(PERSISTENT)を上書きして設定する
javax.jms.MessageProducer.setDeliveryMode(int deliveryMode)
で上書いた設定が
MessageProducer.send()
で有効になる
javax.jms.MessageProducer.send(Destination destination, Message message, int deliveryMode, int priority, long timeToLive)
でも設定できる
指定可能なモード
・javax.jms.DeliveryMode.PERSISTENT
・javax.jms.DeliveryMode.NON_PERSISTENT

*設定方法:デフォルトJMSプロバイダーあて先リソースによるデリバリー・モード設定
JMSプロバイダーのあて先リソースごとにデリバリー・モードを設定する
「アプリケーション」を指定した場合は
JMSクライアントにおけるデリバリー指定か適用される
「NON_PERSISTENT」か「PERSISTENT」を指定した場合は
そのJMSあて先に対するデリバリー・モードが適用される

*設定方法:JMS接続ファクトリ設定におけるJMSデリバリー・モードとWASメッセージングの信頼性モードとの対応付け
JMS接続ファクトリごとに
JMSデリバリー・モード(NON_PERSISTENT/PERSISTENT)

信頼性モード(ベストエフォート非PERSISTENT/高速非PERSISTENT/高信頼性非PERSISTENT/高信頼性PERSISTENT/保障PERSISTENT)
の対応付けが必要で
デフォルト設定は
非パーシスタント・デリバリーモードが「高速非PERSISTENT」
パーシスタント・デリバリーモードが「高信頼性PERSISTENT」
に結び付く

*設定方法:バスあて先による指定
デフォルトは
「プロデューサーによるデフォルトの信頼性のオーバーライドを可能にする」
であるため
メッセージ・プロデューサーの指定よりも
バスあて先で指定された信頼性オプションが優先される


■メッセージの永続先(メッセージ・ストア・タイプ)

「ファイル・ストア」の場合
「ログ」「永続ストア」「テンポラリ」ファイルを保存する場所の管理が
パフォーマンスに影響する
それらファイルを高速なディスクに配置するば
書き込み遅延を抑えられる

「データ・ストア」を利用する場合
JDBCデータ・ソースのチューニングが必要

基本的なチューニング・ポイント
・JDBCコネクション・プール・サイズ(最小および最大接続数の調整)
・ステートメント・キャッシュ・サイズ

「Tivoli Performance Viewer」「Thread Dump(javacore)」を利用して最適化する


WASのデフォルトJMSプロバイダー(メッセージング・エンジン)は
主にSQLの 「INSERT」「DELETE」オペレーションを実行するため
最適化されてないと
メッセージ永続に対する遅延が発生し
メッセージングシステム全体のスループットに影響を与える


デフォルトでは
データ・ストアが「Derby JDBC Provider」
データ・ストアが使用するデータ・ソースに対して
「ステートメント・キャッシュ・サイズ = 40」
「接続プール最大接続数 = 50」


■ データ・ストアとファイル・ストアの利用トポロジー

デフォルトのローカル・データストア構成(Derby)よりは
DB2やOracleをローカル・データストアとした方が高性能


/------------------------
脱線
DB2をデータ・ストアにする場合
DB2 のデフォルトのテーブル・スペースのページサイズは4kbytes
1つのメッセージは複数行にまたがることができないため
3360bytesより 小さいメッセージは「DATA」カラム(VARCHAR)に保管され
3360bytesよりも大きい場合は
「LONG_DATA」カラム (BLOB)に保管される

BLOBでのメッセージ保管はパフォーマンスに影響する
テーブル・スペースのページサイズを32kbytesに変更することで
VARCHARとして保管できるメッセージサイズが32032bytesになる
(32kbytes - 3360 bytes = 32032bytes)

メッセージサイズが 3kbytesから20kbytesの間の場合
SIBnnnテーブルを32kbytesのテーブル・スペースに保管し
VARCHARカラムのサイズを32032bytesにすることを検討する価値あり
------------------------/

■データ・バッファ
メッセージング・エンジンは
メッセージを保管するために
「破棄可能なデータ・バッファ」と
「キャッシング可能なデータ・バッファ」の2つの領域を持つ


□ 廃棄可能なデータ・バッファ
サービス品質属性が「ベストエフォート非パーシスタント」に対するデータを保持する
同データをデータ・ストアに書き込むことはない

メッセージング・エンジンは
バッファにデータを追加するとき
スペースを空けるため
既にバッファ内にあるデータを廃棄する可能性あり

バッファには
アクティブ・トランザクションに含まれるデータと
メッセージング・エンジンが廃棄/消費しない他のベストエフォート非パーシスタントのデータ
の両方が含まれるが
メッセージング・エンジンが破棄するのは
アクティブ・トランザクションに含まれていないデータだけ

メッセージング・エンジンの「sib.msgstore.discardableDataBufferSize」プロパティで
廃棄可能なデータ・バッファのサイズをバイト単位で指定する
デフォルト値は 320000 (約320kbytes)

アクティブ・トランザクションに含まれないデータ全てを廃棄した後で
十分なスペースが残っていない時に
メッセージング・エンジンがデータを廃棄可能なデータ・バッファにデータを追加しようとすると
メッセージング・エンジンは
「com.ibm.ws.sib.msgstore.OutOfCacheSpace」例外を投げる
クライアントアプリは
javax.jms.JMSExceptionにラップされた例外をキャッチできる


□ キャッシング可能なデータ・バッファ
サービス品質属性が「ベストエフォート非パーシスタント」以外のデータを保持するバッファ

メモリにキャッシングすることで
メッセージング・エンジンのパフォーマンスを最適化する

メッセージング・エンジンは
データをDB(あるいはファイル・ストア)に書き込み
DB(あるいは、ファイル・ストア)から読み取る時
そのデータをキャッシュ・データ・バッファに追加しようとする
メッセージング・エンジンは、スペースを空けるため
すでにバッファ内にあるデータを廃棄しうる
メッセージング・エンジンの「sib.msgstore.cachedDataBufferSize」プロパティで
キャッシュ・データ・バッファのサイズをバイト単位で指定する
デフォルト値は「320000」(約320kbytes)


■ データ・バッファのサイズ調整

「破棄可能なデータ・バッファ」と
「キャッシング可能なデータ・バッファ」
のデフォルトサイズは 約320kbytesで決して大きくない

[サービス統合]→[バス]→「バス名」→[追加プロパティー]→[カスタム・プロパティー]で値を設定・変更できる

「Tivoli Performance Viewer」で
破棄されたメッセージの数をモニタし
破棄されるメッセージ数が小さくなるようにバッファサイズを調節するで
パフォーマンス向上が期待できる


■ 処理並列度
処理の並列度を調整することで
パフォーマンス向上が期待できる



■ JMS接続ファクトリーのチューニング:接続プール
Default JMSプロバイダに対するJMS接続ファクトリの接続プールの設定(最大接続数)を調整することで
JMSクライアントの性能向上が期待できる

デフォルト値は「10」接続

JMS接続ファクトリごとに接続プールを保有する
接続プールの空きがなくなると
JMSクライアントが接続を待たされる

「Tivoli Performance Viewer」で
使用している接続プール・サイズが分かる
[管理コンソール]→[モニターおよびチューニング]→[Performance Monitoring Infrastructure (PMI)]→[パフォーマンス・モジュール]→[JCA 接続プール]→[SIB JMS Resource Adapter]→[接続ファクトリー]→「JNDI名」→モニタ対象を指定


■ MDBの並列度チューニング:インスタンス・プール、エンドポイント・プール、スレッド・プール

MDBの並列度の調整は
スループットに対して影響を与え
MDB(Message Driven Bean)の性能向上が期待できる

MDB関連の並列度に関する設定は以下の3カ所

MDBプール(EJB Pool Size:デフォルト値「500」:全EJB合計)
JMSアクティベーション・スペック(最大並行エンドポイント数:デフォルト値「10」)
JMS Resource Adapter(スレッド・プール最大サイズ:デフォルト値「20」)

基本方針
「JMSアクティベーション・スペック メッセージ・エンドポイント・プールサイズ」より「JMS Resource Adapter スレッド・プール・サイズ」が大きいという設定が適切


■ MDBインスタンス・プール
JVMシステム・プロパティとして
以下のオプションを指定することで
アプリケーションごとにEJB(MDB)インスタンスのプール・サイズを指定できる
デフォルト値:最小50 最大500

-Dcom.ibm.websphere.ejbcontainer.poolsize

最大値が
MDBが同時に受け取れるメッセージの最大数になる


■ MDBの並列度-JMSアクティベーション・スペック
JMSアクティベーション・スペックの設定で
MDBの並列度を調整(同時稼働MDBインスタンス数の調整)できる
デフォルト値:10
[管理コンソール]→[リソース]→[JMSプロバイダー]→[Default messaging
provider]→[アクティベーション・スペック]→「MDB名」→[最大並行エンドポイント数]で指定

「最大並行エンドポイント数」の値は
MDBインスタンスの同時稼働数を制限する

「Tivoli Performance Viewer」で
[管理コンソール]→[Performance Modules]→[SIBサービス]→[SIBメッセージング・エンジン]→「メッセージング・エンジン名」→[Destinations]→[Queues]→「キュー名」→「AvailableMessageCount」をモニタ
でキューに対する負荷を把握できる

「AvailableMessageCount」の値が大きい場合(queue depthが深い場合)
[最大並行エンドポイント数]の値を増やして
MDBの同時並行稼働インスタンスを増やす
改善が見られる可能性があります

■ MDBに対するメッセージ・バッチ処理-JMS(J2C)アクティベーション・スペック
「最大バッチ・サイズ」1つのエンドポイントが同時に受け取るメッセージ数を決定できる
デフォルト値は 「1」

例えば
「最大並行エンドポイント数」が「10」で
「最大バッチ・サイズ」が「3」の場合
最大で「30」メッセージがMDBに渡される

「Available message count」が大きい場合は
「最大バッチ・サイズ」の値を調整することで
パフォーマンス向上が期待できる

■ MDBの並列度-スレッド・プール・サイズすべてのMDB合計の並列度は
「SIB JMS Resource Adapter」に割り当てられているスレッド・プールのサイズで制限される

[管理コンソール]→[リソース]→[リソース・アダプター]→[有効範囲]→[設定]を拡張→[組み込みリソースの表示]→[適用]→「ユーザー設定が変更されました。」メッセージ→[SIB JMS Resource Adapter]→「スレッド・プール別名」を確認

「Default」スレッド・プールの最小値は「5」で 最大値は「20」

独自に定義したスレッド・プールを[SIB JMS Resource Adapter]に割り当てることも可能
その場合
そのスレッド・プールはMDB(SIB JMS Resource Adapter)にのみ利用される



ref:
WebSphereサーバ・チューニング入門(7), Javaのメッセージング・サービスを速くするには?, 2008/8/7
http://www.atmarkit.co.jp/fjava/rensai4/websphere07/websphere07_1.html

tag : JMS DB2

2009-11-18 06:59 : 開発 : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud