最大メッセージ分割サイズのチューニング
IIOP通信において、メッセージを送信する側では、シリアライズ完了後、最大メッセージ分割サイズ毎にフラグメント(分割)して、送信します。メッセージを受信する側では、最大メッセージ分割サイズまで受信すると、デシリアライズ処理を開始します。
つまり、最大メッセージ分割サイズが小さいほど、早くデシリアライズ処理を開始します。
しかし、フラグメント数(通信データ量/最大メッセージ分割サイズ)が多いと、送信処理回数やデータ量が増加します。
最大メッセージ分割サイズの設定が小さい場合
デシリアライズ処理開始が早まる。
送信処理回数が多くなる。
データ量が若干増加(フラグメント数×ヘッダ分16byte)。
最大メッセージ分割サイズの設定が大きい場合
デシリアライズ処理開始が遅れる。
送信処理回数が少なくなる。
データ量が若干減少(フラグメント数×ヘッダ分16byte)。
フラグメント数の大小によるメリットデメリットがトレードオフの関係であること、マシンスペックなど環境依存で処理時間が変わることから、最速値となる一般的な指標を出すことは困難ですが、大体の目安として10分割程度を目安としてください。
データサイズ | 最大メッセージ分割サイズの目安 |
---|---|
10000byteまで | 最大メッセージ分割サイズはデフォルト(1024)のままで問題ありません。 |
100000byteまで | 最大メッセージ分割サイズは8192としてください。 |
300000byteまで | 最大メッセージ分割サイズは32768としてください。 |
上記を超える場合 | 最大メッセージ分割サイズは64000としてください。 設定値が64000を超えると受信側のバッファ拡張が必要となるため、64000より大きいサイズを設定することは推奨しません。 |
データサイズが自身でわからない場合は、IIOPアクセスログをTRACEモードで採取し、以下の例に記載する方法で確認してください。IIOPアクセスログの出力モードについては、「IIOPアクセスログの出力モード」を参照してください。
例
IIOPアクセスログの出力結果
[29/Aug/2014 09:31:36.101 +0900] "70(p: thread-pool-1; w: 5)" "OUT(SV) Fragment(request_id=1211, client=192.0.2.2:51375, server=192.0.2.2:25700, more=true)" [29/Aug/2014 09:31:36.101 +0900] "70(p: thread-pool-1; w: 5)" "OUT(SV) Fragment(request_id=1211, client=192.0.2.2:51375, server=192.0.2.2:25700, more=true)" [29/Aug/2014 09:31:36.101 +0900] "70(p: thread-pool-1; w: 5)" "OUT(SV) Fragment(request_id=1211, client=192.0.2.2:51375, server=192.0.2.2:25700, more=true)" [29/Aug/2014 09:31:36.101 +0900] "70(p: thread-pool-1; w: 5)" "OUT(SV) Fragment(request_id=1211, client=192.0.2.2:51375, server=192.0.2.2:25700, more=true)" [29/Aug/2014 09:31:36.101 +0900] "70(p: thread-pool-1; w: 5)" "OUT(SV) Fragment(request_id=1211, client=192.0.2.2:51375, server=192.0.2.2:25700, more=true)" [29/Aug/2014 09:31:36.101 +0900] "70(p: thread-pool-1; w: 5)" "OUT(SV) Fragment(request_id=1211, client=192.0.2.2:51375, server=192.0.2.2:25700, more=true)" [29/Aug/2014 09:31:36.102 +0900] "70(p: thread-pool-1; w: 5)" "OUT(SV) Fragment(request_id=1211, client=192.0.2.2:51375, server=192.0.2.2:25700, more=false)"
最大メッセージ分割サイズ算出方法
request_id が同一のFragmentメッセージの数を数えます。
上記の例ではrequest id=1211のFragmentメッセージが7回出力されています。
「最大メッセージ分割サイズ×(Fragmentメッセージの数)」から「最大メッセージ分割サイズ×(Fragmentメッセージの数+1)」の間がデータサイズになります。
上記の例で最大メッセージ分割サイズが64000byteの場合、データサイズは64000byte×7(448000byte)~64000byte×8(512000byte)の間と判断できます。
最大受信バッファサイズの拡張について
最大受信バッファサイズは、接続先の送信データサイズより大きい値を指定する必要があります。最大メッセージ分割サイズの拡張時、接続先の送信データサイズが256000byteを超える場合がないか確認してください。
デフォルトの最大受信バッファサイズは256000byteですので、接続先の送信データサイズが256000byteを超える場合、最大受信バッファサイズを拡張してください。
最大受信バッファサイズの設定は、Java VMオプションで指定します。
最大受信バッファサイズはデータ受信時の設定であり、クライアントからのリクエスト受信時と、サーバーからのリプライ受信時に有効な機能になります。
com.sun.corba.ee.transport.ORBMaximumReadByteBufferSize
256000~2147483647(byte)
256000
スタンドアロンクライアントの場合
Java VMオプションに設定します。
-Dcom.sun.corba.ee.transport.ORBMaximumReadByteBufferSize=設定値
アプリケーションクライアントコンテナに設定する場合
環境変数VMARGSに設定します。
GlassFish Serverクラスターに設定する場合
asadminコマンドを使用してJava VMオプションに設定します。詳細については、「JVMオプション」を参照してください。
設定変更時は、GlassFish Serverクラスターを再起動する必要があります。
-Dcom.sun.corba.ee.transport.ORBMaximumReadByteBufferSize=設定値
接続先から受信したデータは、受信バッファに格納されます。受信バッファのサイズは、受信するデータサイズにより、インストール直後の値64000byteから、最大受信バッファサイズの設定値まで、2倍ずつ(64000→128000→256000)拡張されます。
受信するデータサイズが、最大受信バッファサイズを超過した場合、データ受信処理は失敗し、以下の警告メッセージが通知されます。
IOP00410233
本警告メッセージが通知された場合は、接続先の送信データサイズが最大受信バッファサイズより小さくなるようにチューニングしてください。
Windowsにおける処理遅延について
オペレーションシステムの仕様(KB2020447)により、以下の条件でデータ送受信中に5秒間の処理遅延が発生する場合があります。
Jakarta EEのクライアントとサーバを同一マシンで運用する。
65536byteから1048576byteの通信データを一度に送受信する。
本現象を回避するためには、以下の対処を行ってください。
最大メッセージ分割サイズが有効な場合
最大メッセージ分割サイズを65536byte未満に設定します。
最大メッセージ分割サイズが無効な場合
ユーザアプリケーションで一度に送受信する通信データサイズを以下の範囲で調整します。
65536byte未満
1048577byte以上