この章では、デフォルトのTCMP設定を変更する方法について説明します。TCMPについても簡単に説明します。TCMPの詳細は、「TCMPについて」を参照してください。また、チューニング上の考慮事項と方法を数多く取り上げているOracle Coherence管理者ガイドも参照してください。
この章は次の各項で構成されています。
クラスタ・メンバーどうしは、Tangosol Cluster Management Protocol (TCMP)を使用して通信します。TCMPは、クラスタ・メンバーの検出、クラスタの管理、サービスのプロビジョニングおよびデータの伝送に使用する、IPベースのプロトコルです。TCMPは非同期プロトコルなので、サーバー上で多数のスレッドが同時に通信している場合でも、通信がブロックされることがありません。また、非同期通信では、ネットワークの待ち時間(2つの異なるサイト間でルーティングされるネットワーク上での待ち時間など)が特定の操作の速度に影響を与える場合でも、クラスタ・スループットに影響が及ぶことはありません。
TCMPプロトコルは非常にチューニング性が高いため、特定のネットワーク・トポロジの利用や、地理的に分散したクラスタにある低帯域幅で長待機時間のセグメントに対する許容差の追加が可能です。Coherenceには出荷時の初期設定の構成があります。TCMP属性の中には、実行時に動的に自己構成できるものがありますが、デプロイ目的でそれらをオーバーライドすることやロックダウンすることも可能です。TCMPの動作は、パフォーマンスのテストに基づいて変更する必要があります。Coherenceには、ネットワーク上でのTCMPのデータ転送パフォーマンスを評価するために使用できるデータグラム・テストが用意されています。データグラム・テスト・ユーティリティを使用してネットワークのパフォーマンスをテストする方法の詳細は、Oracle Coherence管理者ガイドを参照してください。
TCMPデータ転送の動作は、tangosol-coherence-override.xml
ファイルの中で、<packet-publisher>
、<packet-speaker>
、<incoming-message-handler>
および<outgoing-message-handler>
の各要素を使用して構成します。この章で取り上げるTCMP関連要素すべてのリファレンスは、付録A「オペレーション構成要素」を参照してください。
データの転送速度は<flow-control>
要素と<traffic-jam>
要素を使用して制御します。パケットの障害を最小限に抑えながら最大限のスループットを得るうえで、これらの要素は効果的です。ネットワークが低速な場合やパケット・バッファが小さい場合は、ここで説明する速度調整設定を変更することが普通です。
この項の内容は次のとおりです。
フロー制御を使用して、所定のクラスタ・メンバーへのパケット転送速度を動的に調整します。この調整は、Point-to-Point転送でのクラスタ・メンバーの応答性を数値化した統計に基づいて実行されます。フロー制御は、応答できなくなったクラスタ・メンバーに大量のパケットが滞留する状況の発生を防止します。
<flow-control>
要素でフロー制御を構成します。フロー制御の動作を調整するための設定には、次の2つがあります。
<pause-detection>
: 応答しなくなったクラスタ・メンバーに再送信するパケットの最大数を制御する設定です。この数のパケットを送信しても応答しないメンバーは一時停止していると判断されます。一時停止していると判断されたクラスタ・メンバー宛てのパケットは、そのメンバーが応答を再開するまで低速で送信されます。ガベージ・コレクションの実行時間が長いと、このような一時停止が発生します。この値は<maximum-packets>
要素を使用して指定します。デフォルトのパケット数は16
です。0
を指定すると、一時停止の検出が無効になります。
<outstanding-packets>
: クラスタ・メンバーに送信する未確認パケットの数を定義する設定です。送信した未確認パケット数がこの値に達すると、以降はそのメンバーにパケットを遅延送信します。この値には、<maximum-packets>
要素を使用して数値を明示的に指定するか、<maximum-packets>
要素と<minimum-packets>
要素の両方を使用して値の範囲を指定します。範囲を指定すると、この設定はネットワーク統計に基づいて動的に調整されます。最大値には256パケットを超える値を指定する必要があり、デフォルト値は4096パケットです。最小値には16パケットを超える値を指定する必要があり、デフォルト値は64パケットです。
フロー制御の動作を調整するには、オペレーション・オーバーライド・ファイルを編集して、次のように<pause-detection>
要素と<outstanding-packets>
要素を追加します。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <packet-publisher> <packet-delivery> <flow-control> <pause-detection> <maximum-packets>32</maximum-packets> </pause-detection> <outstanding-packets> <maximum-packets>2048</maximum-packets> <minimum-packets>128</minimum-packets> </outstanding-packets> </flow-control> </packet-delivery> </packet-publisher> </cluster-config> </coherence>
フロー制御を無効にするには、オペレーション・オーバーライド・ファイルを編集して、<flow-control>
要素の中に、false
に設定した<enabled>
要素を追加します。次に例を示します。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <packet-publisher> <packet-delivery> <flow-control> <enabled>false</enabled> </flow-control> </packet-delivery> </packet-publisher> </cluster-config> </coherence>
パケット・パブリッシャのクライアント・スレッドによるエンキュー処理でネットワークへの送信を待機している保留パケットの数が、パケット・パブリッシャによって過大であると判断されるレベルに達すると、パケット・トラフィックの輻輳状態になります。<traffic-jam>
要素でトラフィック輻輳動作を構成します。トラフィック輻輳動作を調整する設定には、次の2つがあります。
<maximum-packets>
: パケット・パブリッシャで許容できる保留パケットの最大数を制御する設定です。保留パケット数がこの値を超えると、輻輳が発生していると判断され、その場合はクライアント・リクエスト(システム・スレッド以外のローカル・スレッドからのリクエスト)の速度を遅くする必要があります。この構成した上限パケット数を超えると、未処理のパケット数がこの指定した上限値を下回るまで、クライアント・スレッドは強制的に一時停止状態になります。この設定で再送信キューのサイズを制限することにより、予期しないメモリー不足状態のほとんどは発生しなくなります。0
を指定すると、この上限は設定されません。デフォルト値は8192
です。
<pause-milliseconds>
: パケット・パブリッシャが輻輳状態のときにメッセージを送信しようとするクライアント・スレッドを一時停止する時間(ミリ秒)を制御する設定です。パブリッシャの詰まりが解消されるまでメッセージは送信されず、このプロパティで指定した時間でスレッドの一時停止が繰り返されます。デフォルト値は10
です。
パケット上限値が小さすぎる場合や一時停止時間が長すぎる場合は、パブリッシャによってすべての保留パケットが送信され、送信するパケットがなくなることがあります。この状態が検出されると、定期的に警告がログに記録されます。理想的な値は、パブリッシャで実行する処理がなくならず、同時にキューが制御できないほど大きくならないような値です。一時停止時間は短い時間(10ミリ秒以下)に設定し、パケット数の上限は大きい値(5,000を超える値)に設定します。
<traffic-jam>
要素と<flow-control>
要素を使用した設定はPoint-to-Pointモードで動作し、受信側に未処理パケットが多数存在する場合は送信のみがブロックされます。<traffic-jam>
要素の<maximum-packets>
サブ要素の値を、<outstanding-packets>
要素の<maximum-packets>
値よりも大きく設定することをお薦めします。<flow-control>
が無効な場合、<traffic-jam>
では未処理のパケットがすべて考慮されます。
エンキュー動作の速度を調整するには、オペレーション・オーバーライド・ファイルを編集して、次のように<maximum-packets>
要素と<pause-milliseconds>要素を追加します。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <packet-publisher> <traffic-jam> <maximum-packets>8192</maximum-packets> <pause-milliseconds>10</pause-milliseconds> </traffic-jam> </packet-publisher> </cluster-config> </coherence>
複数の小さいパケットを1つの大きいパケットにバンドルして、ネットワーク・スイッチ・インフラストラクチャへの負荷を低減できます。パケットのバンドルは、<packet-bundling>
要素の中で次のような設定で構成します。
<maximum-defferal-time>
: 別のパケットのバンドルを待機している間のパケットの最大遅延時間を指定する設定です。この値を0に設定すると、待機のないアルゴリズムとなり、即座にアクセスできるパケットのみがバンドルされます。0より大きい値を設定すると、追加のパケットが得られるまで待機する間に、多少の送信遅延が発生します。スループットに有害な影響が出ないように、通常この値は250マイクロ秒未満に設定します。単位を指定しない場合は、ナノ秒と見なされます。デフォルト値は1us
(マイクロ秒)です。
<agression-factor>
: パケット遅延アルゴリズムのアグレッシブさを指定する設定です。<maximum-deferral-time>
要素では遅延時間の上限を定義しますが、<aggression-factor>
要素は平均の遅延時間に影響します。アグレッシブさを示す値が大きいほど、パブリッシャが追加のパケットを待つ時間が長くなります。この係数は実数で表します。多くの場合は待機時間を最小に抑えながらパケットの使用率を上げることができるように、0.0から1.0の値を使用します。デフォルト値は、0
です。
デフォルトの packet-bundling は、体感できる遅延を加えることなくバンドルを実行できる、アグレッシブさが最小の設定です。よりアグレッシブなバンドルの利点は、ネットワーク・インフラストラクチャとアプリケーション・オブジェクトの一般的なデータ・サイズおよびアクセス・パターンにより異なります。
パケットのバンドルの動作を調整するには、オペレーション・オーバーライド・ファイルを編集して、次のように<maximum-defferal-time>要素と<agression-factor>
要素を追加します。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <packet-publisher> <packet-delivery> <packet-bundling> <maximum-deferral-time>1us</maximum-deferral-time> <aggression-factor>0</aggression-factor> </packet-bundling> </packet-delivery> </packet-publisher> </cluster-config> </coherence>
TCMPでは、通知パケットを使用して、確認を要求するパケットを受信したことを応答します。肯定応答(ACK)パケットは、パケットが正しく受信されたので、再送信が不要であることを示します。多数の小さいACKパケットによってネットワーク帯域幅が浪費されないように、1つの送信元に対する複数のACKパケットは1つのACKパケットにまとめられます。肯定応答が得られないパケットは、パケット・パブリッシャに構成した再送信間隔に基づいて再転送されます。
否定応答(NACK)パケットは、パケットが正しく受信されていないことを示すものなので、そのパケットは再転送されます。受信したパケットの順序を検査してパケットの損失があることがわかると、否定応答が送信されます。否定応答があると、パブリッシャの再送信間隔に関係なく、はるかに早いタイミングでパケットが再送信されます。否定応答を無効にするには、「否定応答の無効化」を参照してください。
この項の内容は次のとおりです。
パケットの再送信間隔は、送信に対応するACKパケットをパケット・パブリッシャが待機する最小時間(ミリ秒)を指定します。この時間が経過するとパケットが再送信されます。デフォルトの再送信間隔は200
ミリ秒です。
パケットの再送信間隔を変更するには、オペレーション・オーバーライド・ファイルを編集して、次のように<resend-milliseconds>
要素を追加します。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <packet-publisher> <packet-delivery> <resend-milliseconds>400</resend-milliseconds> </packet-delivery> </packet-publisher> </cluster-config> </coherence>
パケットの再送信タイムアウト間隔は、ACKパケットが受信されない場合にパケットの再送信を継続する最長時間(ミリ秒)を指定します。このタイムアウトが経過すると、受信側が終了しているかどうかの判断が下されます。これを決定するには、他のノードがその受信者と通信できているかどうかなど、他のデータも考慮されます。デフォルト値は、300000
ミリ秒です。本番環境で使用する場合の推奨値は、300000を超え、予想される最大のGCの全所要時間の2倍より大きな値です。
注意: デフォルトの停止検出メカニズムはTCPリング・リスナーです。このリスナーは、再送信タイムアウト間隔が経過する前に、障害が発生しているクラスタ・メンバーを検出します。停止検出の詳細は「停止検出の構成」を参照してください。 |
パケットの再送信タイムアウト間隔を変更するには、オペレーション・オーバーライド・ファイルを編集して、次のように<timeout-milliseconds>
要素を追加します。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <packet-publisher> <packet-delivery> <timeout-milliseconds>420000</timeout-milliseconds> </packet-delivery> </packet-publisher> </cluster-config> </coherence>
ACKパケットおよびNACKパケットの送信を必要に応じて変更できるようになるまでパケット・パブリッシャが待機する時間です。ACKパケットとNACKパケットの遅延間隔は、次の設定を使用して<notification-queueing>
要素の中で構成します。
<ack-delay-milliseconds>
: ACKパケットを送信するまでパケット・パブリッシャが遅延する最長時間(ミリ秒)を指定する要素です。複数の肯定応答をまとめてACKパケットが満たされると、より早いタイミングでそのACKパケットが送信されることがあります。リモート・メンバーのパケット配信再送信タイムアウトが経過する前にACKを受信して処理する時間を十分に確保できるように、リモート・メンバーのパケット配信再送信タイムアウトよりも相当に小さい値を設定する必要があります。デフォルト値は16
です。
<nack-delay-milliseconds>
: NACKパケットを送信するまでパケット・パブリッシャが遅延する最長時間(ミリ秒)を指定する要素です。デフォルト値は、1
です。
ACKおよびNACKの遅延間隔を変更するには、オペレーション・オーバーライド・ファイルを編集して、次のように<ack-delay-milliseconds>
要素と<nack-delay-milliseconds>
要素を追加します。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <packet-publisher> <notification-queueing> <ack-delay-milliseconds>32</ack-delay-milliseconds> <nack-delay-milliseconds>1</nack-delay-milliseconds> </notification-queueing> </packet-publisher> </cluster-config> </coherence>
転送パケット・プールは、UDPパケットの転送に使用するバッファです。パケット・バッファと異なり、このバッファはオペレーティング・システムで管理されるのではなく、Coherenceで内部的に管理され、JVMヒープ上に割り当てられます。
パケット・プールは複数のCoherenceネットワーク・サービス間で再使用可能バッファとして使用され、メモリー使用量の増加と引き替えに高速なソケット層処理が可能です。このプールは最初は空で、必要に応じて指定の上限サイズまで増大します。したがって、メモリーは必要になったときに確保されるので、メモリーを有効利用できるバッファが実現します。
転送パケット・プールのサイズは、パケット・パブリッシャがブロックする必要が生じるまでパケット・スピーカー上のキューに入れることができるパケットの最大数を制御します。このプールは、<packet-publisher>
ノードの中で<packet-pool>
要素を使用して構成します。プールの最大サイズを指定するには<size>
要素を使用します。この値はバイト単位で入力します。このサイズはデフォルトでは指定されていませんが、デフォルト値は0
です。ゼロを指定すると、最適なMTUサイズを2048で因数分解することによってバッファが計算されます。サイズを明示的に定義すると、プール・サイズ/MTUサイズ
としてパケットの数が計算されます。受信ハンドラのパケット・プールのサイズを構成する方法は、「受信ハンドラのパケット・プールの構成」を参照してください。
転送パケット・プールのサイズを構成するには、オペレーション・オーバーライド・ファイルを編集して、次のように<packet-pool>
要素を追加します。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <packet-publisher> <packet-pool> <size>3072</size> </packet-pool> </packet-publisher> </cluster-config> </coherence>
パケット・バッファはオペレーティング・システムのバッファであり、データグラム・ソケットで使用します(ソケット・バッファともいいます)。オペレーティング・システムに対してバッファ処理を要求するパケットの数を制御するようにパケット・バッファを構成できます。パケット・バッファは、ユニキャスト・リスナーとマルチキャスト・リスナーでインバウンド・バッファとして使用し、パケット・パブリッシャでアウトバウンド・バッファとして使用します。
この項の内容は次のとおりです。
パケット・バッファのサイズは、次の設定を使用して、パケット数またはバイト数に基づいて構成できます。
<maximum-packets>
: データグラム・ソケットに対してソケット自身のサイズを調整してバッファすることを要求するパケット数を(構成済のパケット・サイズに基づいて)指定します。詳細は、java.net.SocketOptions#SO_SNDBUF
プロパティおよびjava.net.SocketOptions#SO_RCVBUF
プロパティを参照してください。基礎となるソケットの実装で一定のサイズ以上をサポートできない場合、実際のバッファ・サイズは小さくなることがあります。
<size>
: 基礎となるソケット・バッファに要求されるサイズをバイト単位で指定します。
オペレーティング・システムでは、指定されたパケット・バッファ・サイズを参考値として扱うにすぎず、指定の量を割り当てることは要求されません。割り当てられた領域が要求量よりも少ないと、Coherenceでは警告が発行され、領域が制限されたバッファを使用して稼動を継続するので、十分なパフォーマンスが得られない可能性があります。領域が大きいバッファが割り当てられるようにオペレーティング・システムを構成する方法の詳細は、Oracle Coherence管理者ガイドを参照してください。
領域が大きいインバウンド・バッファを使用すると、Javaのガベージ・コレクタに起因するJVMの一時停止からCoherenceのネットワーク層を保護するうえで効果的です。JVMが一時停止している間、Coherenceではどのインバウンド・ソケットからもパケットをデキューできません。パケット・バッファのオーバーフローを引き起こすほど一時停止時間が長いと、発信元ノードがパケット消失を検出してパケットを再送信する必要があるため、パケットの受信が遅延します。
アウトバウンド・パケット・バッファは、パケットを転送するときにパケット・パブリッシャで使用します。バッファのサイズを変更するときは、スループットと待機時間の両面からパフォーマンスを評価する必要があります。バッファのサイズを大きくするとスループットが増加し、逆に小さくすると待機時間が短くなります。
アウトバウンド・パケット・バッファのサイズを構成するには、オペレーション・オーバーライド・ファイルを編集して、<packet-publisher>
ノードに<packet-buffer>
要素を追加し、<size>
要素(バイト単位)または<maximum-packets>
要素(パケット数単位)を使用してパケット・バッファのサイズを指定します。デフォルト値は32パケットです。次の例では、パケット数に基づいてパケット・バッファのサイズを指定しています。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <packet-publisher> <packet-buffer> <maximum-packets>64</maximum-packets> </packet-buffer> </packet-publisher> </cluster-config> </coherence>
マルチキャスト・リスナーとユニキャスト・リスナーはそれぞれ専用のインバウンド・パケット・バッファを備えています。インバウンド・パケット・バッファのサイズを構成するには、オペレーション・オーバーライド・ファイルを編集して、(<multicast-listener>
ノードまたは<unicast-listener>
ノードに) <packet-buffer>
要素を追加し、<size>
要素(バイト単位)または<maximum-packets>
要素(パケット数単位)を使用してパケット・バッファのサイズを指定します。デフォルト値は、マルチキャスト・リスナーで64パケット、ユニキャスト・リスナーで1428パケットです。
次の例では、ユニキャスト・リスナーのパケット・バッファのサイズをバイト数で指定しています。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <unicast-listener> <packet-buffer> <size>1500000</size> </packet-buffer> </unicast-listener> </cluster-config> </coherence>
次の例では、マルチキャスト・リスナーのパケット・バッファのサイズをパケット数で指定しています。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <packet-publisher> <packet-buffer> <maximum-packets>128</maximum-packets> </packet-buffer> </packet-publisher> </cluster-config> </coherence>
クラスタ通信の効率とスループットが最適になるように、UDPパケットの最大サイズと最適サイズを調整できます。クラスタ・ノードは、いずれも同一の最大パケット・サイズを使用する必要があります。ネットワークの使用率を最適化するには、この値にネットワークのMTU (maximum transmission unit)より32バイト小さい値を指定する必要があります。
注意: Microsoft Windowsで1024バイトを超えるUDPパケット・サイズを指定する場合、転送速度が最適になるようにレジストリ設定を調整する必要があります。COHRENCE_HOME /bin/optimize.reg 登録ファイルにはレジストリ設定が保存されています。Windowsでデータグラムのサイズを設定する方法の詳細は、Oracle Coherence管理者ガイドを参照してください。 |
パケットのサイズは<packet-size>
要素で構成し、次の設定を指定します。
<maximum-length>
: すべてのクラスタ・メンバーが問題なく処理できるパケット・サイズをバイト単位で指定します。この値は、クラスタ内のすべてのメンバーで同一にする必要があります。小さい値を設定することでクラスタの最大サイズを意図的に制限できます。この値は512以上とする必要があります。デフォルト値は64KBです。
<preferred-length>
: ユニキャスト・ソケットおよびマルチキャスト・ソケットで送受信されるDatagramPacket
オブジェクトの最適サイズをバイト単位で指定します。
これには<maximum-length>
値よりも大きい値または小さい値を指定できます。この値は、クラスタ内のすべてのメンバーで同一にする必要はありません。理想的な値は、UDPパケット・ヘッダー(32バイト)またはTCPパケット・ヘッダー(52バイト)用の十分な容量を確保しながら、ネットワークのMTUの範囲に収まる値です。
この値は512以上にする必要があり、ローカル・ノードのMTUに基づいてデフォルト値に設定されています。MTUを取得できない場合、MTU値は1500になります。
このパケット・サイズを調整するには、オペレーション・オーバーライド・ファイルを編集して、次のように<maximum-length>
要素と<preferred-length>要素を追加します。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <packet-publisher> <packet-size> <maximum-length>49152</maximum-length> <preferred-length>1500</preferred-length> </packet-size> </packet-publisher> </cluster-config> </coherence>
ネットワークの送信操作がブロックされている可能性があることをpacket-publisher
が検出すると、パケット・スピーカーはネットワークにパケットを送信します。これにより、パケット・パブリッシャはI/Oのブロックを回避し、送信パケットの準備を続行できます。パケット・パブリッシャは、パケットの負荷の変化に伴ってスピーカーを使用するかどうかを動的に選択します。
パケットの負荷が比較的低い場合、スピーカーの操作をパブリッシャのスレッドで実行すると効率が向上することがあります。パケットの負荷が高い場合、スピーカーを使用すると、スピーカーによってネットワーク上でパケットを送信しながらパブリッシャはパケットの準備を続けることができます。
パケット・スピーカーを構成するには、<volume-threshold>
要素を使用して、アクティブにするスピーカー・デーモンに送信できるようにしておくことが必要な最小のパケット数を指定します。値を0
に指定すると必ずスピーカーが強制的に使用され、高い値を指定すると使用されなくなります。値を指定しない場合は(デフォルト)、パケット・バッファに合わせて値が設定されます。
パケット・スピーカーのボリュームしきい値を指定するには、オペレーション・オーバーライド・ファイルを編集して、次のように<volume-threshold>
要素を追加します。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <packet-speaker> <volume-threshold> <minimum-packets>32</minimum-packets> </volume-threshold> </packet-speaker> </cluster-config> </coherence>
クラスタ・サービスでは、メッセージ・ハンドラを使用してデータを送受信します。受信データを処理するハンドラと送信データを処理するハンドラが存在します。どちらのハンドラにも、必要に応じて構成できる設定があります。
この項の内容は次のとおりです。
受信メッセージ・ハンドラは、UDPパケットを論理メッセージにアセンブルし、それを適切なCoherenceサービスにディスパッチして処理できるようにします。<incoming-message-handler>
要素で受信メッセージ・ハンドラを構成します。
この項の内容は次のとおりです。
<maximum-time-variance>
要素では、新しいクラスタ・メンバーのシステム時刻と現在のクラスタ時刻との間の差異を測定する際に、ブロードキャスト・メッセージの送受信間の最大時刻差異を指定します。この差異が小さいほど、クラスタ内で稼動している複数のシステムどうしでクラスタ時刻が互いにより近くなります。ただし、クラスタに参加するプロセスは、指定の時刻差異の範囲内でメッセージを交換できるようになるまで続くので、長時間を要します。通常は、20ミリ秒程度の値で十分ですが、負荷の高いクラスタや複数のネットワーク・ホップでは、より大きな値が必要になる場合があります。デフォルト値は16
です。
最大の時刻差異を変更するには、オペレーション・オーバーライド・ファイルを編集して、次のように<maximum-time-variance>
を追加します。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <incoming-message-handler> <maximum-time-variance>16</maximum-time-variance> </incoming-message-handler> </cluster-config> </coherence>
受信メッセージ・ハンドラに対して、否定応答を無効化できます。無効にすると、パケットが正しく受信されていなくても、ハンドラはそのパケットの送信側に何も通知しません。この場合、パケットの送信側は、指定の再送信タイムアウト間隔の経過を待ったうえでパケットを再送信します。パケットの応答の詳細は、「パケットの再転送動作の変更」を参照してください。
否定応答を無効にするには、オペレーション・オーバーライド・ファイルを編集して、false
に設定した<use-nack-packets>
要素を追加します。例:
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <incoming-message-handler> <use-nack-packets>false</use-nack-packets> </incoming-message-handler> </cluster-config> </coherence>
受信パケット・プールは、UDPパケットの受信で使用するバッファです。パケット・バッファと異なり、このバッファはオペレーティング・システムで管理されるのではなく、Coherenceで内部的に管理され、JVMヒープ上に割り当てられます。
パケット・プールは複数のCoherenceネットワーク・サービス間で再使用可能バッファとして使用され、メモリー使用量の増加と引き替えに高速なソケット層処理が可能です。このプールは最初は空で、必要に応じて指定の上限サイズまで増大します。したがって、メモリーは必要になったときに確保されるので、メモリーを有効利用できるバッファが実現します。
受信ハンドラのパケット・プールのサイズは、ユニキャスト・リスナーとマルチキャスト・リスナーがブロックする必要が生じるまでキューに入れることができるパケットの数を制御します。このプールは、<incoming-message-handler>
ノードの中で<packet-pool>
要素を使用して構成します。プールの最大サイズを指定するには<size>
要素を使用します。この値はバイト単位で入力します。このサイズはデフォルトでは指定されていませんが、デフォルト値は0
です。ゼロを指定すると、最適なMTUサイズを2048で因数分解することによってバッファが計算されます。サイズを明示的に定義すると、プール・サイズ/MTUサイズ
としてパケットの数が計算されます。パケットの転送に使用するパケット・プールのサイズを構成する方法は、「転送パケット・プールのサイズの構成」を参照してください。
受信ハンドラのパケット・プールのサイズを構成するには、オペレーション・オーバーライド・ファイルを編集して、次のように<size>
要素を追加します。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <incoming-message-handler> <packet-pool> <size>3072</size> </packet-pool> </incoming-message-handler> </cluster-config> </coherence>
送信メッセージ・ハンドラは、転送するメッセージを処理するためにクラスタ・サービスで使用します。送信メッセージ・ハンドラでは、必要に応じてサイズを構成できる専用のメッセージ・プールを使用します。送信メッセージ・ハンドラは、<outgoing-message-handler>
要素で構成します。
送信メッセージ・ハンドラでは、メッセージ・プールを使用して、メッセージの転送のためにプールするメッセージ・バッファの数を制御します。メッセージ・バッファをプールすると、メッセージングに必要なメモリー・リソースがプールされ、JVMガベージ・コレクタの圧力が緩和されます。
このメッセージ・プールには、指定したサイズを持つ任意の数のセグメントを保存できます。たとえば、セグメント・サイズが10MBの4つのセグメントで構成されるプールは、最大で40MBのシリアライズ用領域を保持できます。セグメント数とセグメント・サイズは、それぞれ<segment>
要素と<segment-size>
要素を使用して定義されます。
各プール・セグメントが特定のサイズのメッセージ・バッファを格納します。最小サイズのバッファは、<min-buffer-size>
要素で定義されます。その後、次のセグメントの次のバッファ・サイズが、<growth-factor>
値('min-buffer-size' << growth-factor
)を使用してビット単位の左シフトにより計算されます。n
をgrowth-factor値とした場合、n分の左シフトとは2nを乗算するのと同じになります。つまり、growth-factorが2の場合はmin-buffer-sizeの4倍になります。growth-factorが3の場合はmin-buffer-sizeの8倍のようになります。
次の例はデフォルトのプール値を示しており、合計サイズが64MBのメッセージ・プールを構成します。最初のプール・セグメントには1KBのメッセージ・バッファ、2番目のプール・セグメントには4KBのメッセージ・バッファ、3番目のプール・セグメントには16KBのメッセージ・バッファ、4番目のプール・セグメントには64KBのメッセージ・バッファがそれぞれ収められています。growth-factorを3にし、その他は同じデフォルト値を使用すると、バッファ・サイズはそれぞれ1KB、8KB、64KB、512KBとなります。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <outgoing-message-handler> <message-pool> <segments>4</segments> <segment-size>16MB</segment-size> <min-buffer-size>1KB</min-buffer-size> <growth-factor>2</growth-factor> </message-pool> </outgoing-message-handler> </cluster-config> </coherence>
ネットワーク・バッファ(入力および出力)およびシリアライズ・バッファ用に獲得される領域は、その容量が実際の使用量を上回る場合、定期的に再利用されます。
Coherenceには、TCMPで使用するために、次の3つの基本的なソケット・プロバイダ実装が用意されています。
システム・ソケット・プロバイダ(デフォルト): JVMのデフォルトのソケットとチャンネル実装のインスタンスを生成するソケット・プロバイダです。
TCPソケット・プロバイダ: TCPベースのソケットとチャンネル実装を生成するソケット・プロバイダです。
SSLソケット・プロバイダ: SSLを使用するソケットとチャンネル実装を生成するソケット・プロバイダです。
必要に応じて、カスタム・ソケット・プロバイダを有効にすることもできます。TCMPで使用するソケット・プロバイダは、<unicast-listener>
要素でユニキャスト・リスナー向けに構成します。
この項の内容は次のとおりです。
TCPソケット・プロバイダは、可能なかぎりTCPベースのソケットを生成するソケット・プロバイダです。このソケット・プロバイダは、TCPによってバッキングされるDatagramSocket
のインスタンスを作成します。WKA機能とともに使用するTCMPは(マルチキャストを無効化)、UDPを必要とせずにTCPを介して全面的に機能します。
注意: WKA機能を併用せずにこのソケット・プロバイダを使用すると(マルチキャストを有効化)、すべてのユニキャスト通信にTCPが使用されます。マルチキャストは、グループベースの通信に使用されます。 |
TCPソケット・プロバイダでは、クラスタ・メンバーのペアごとに最大で2つのTCP接続を使用します。このTCPトラフィックは、ブロックしないNIOベースのソケットを使用してすべて管理されるので、トラフィック管理用のスレッドが別に追加されることはありません。したがって、既存のTCMPスレッドですべての接続を扱います。これらの接続は要求に応じて使用され、なんらかの理由で切断されると、必要に応じて自動的に再度開放されます。送受信どうしの輻輳の低減とパフォーマンスの顕著な向上を図るために、2つの接続を使用します。TCMPでは、信頼できるプロトコルを使用していることをほとんど認識していないので、保証済の配信とフロー制御を引き続き管理しています。
TCPソケット・プロバイダを指定するには、オペレーション・オーバーライド・ファイルを編集して、tcp
の値を指定した<socket-provider>
要素を追加します。例:
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <unicast-listener> <socket-provider system-property="tangosol.coherence.socketprovider">tcp </socket-provider> </unicast-listener> </cluster-config> </coherence>
オペレーション・オーバーライド・ファイルを使用するかわりに、tangosol.coherence.socketprovider
システム・プロパティを使用してこのソケット・プロバイダを指定できます。例:
-Dtangosol.coherence.socketprovider=tcp
SSLソケット・プロバイダは、SSLで保護したソケットのみを生成するソケット・プロバイダです。このソケット・プロバイダは、SSL/TCPによってバッキングされるDatagramSocket
のインスタンスを作成します。マルチキャスト・ソケットに対してはSSLがサポートされていないので、このプロバイダでTCMPが機能するためにはWKA機能(マルチキャストを無効化)を使用する必要があります。
デフォルトのSSL構成を使用すると、信頼できるすべてのピアが単一のJKSキーストアにあるピア信頼に基づいて、双方向のSSL接続を容易に構成できます。より詳細な構成を別のアイデンティティ・マネージャおよびトラスト・マネージャで定義することで、認証局による信頼の検証が可能になります。TCMPの下で機能するSSLの構成方法と使用方法の詳細は、Oracle Coherenceセキュリティ・ガイドを参照してください。
必要に応じて、TCMPで使用するカスタム・ソケット・プロバイダを作成して有効化できます。カスタム・ソケット・プロバイダではcom.tangosol.net.SocketProvider
インタフェースを実装する必要があります。このAPIの詳細は、Oracle Coherence Java APIリファレンスを参照してください。
カスタム・ソケット・プロバイダを有効にするには、<socket-provider>
要素の中で<instance>
要素を使用します。<socket-providers>
ノードで定義したカスタム・ソケット・プロバイダの構成を、<socket-provider>
要素を使用して参照する方法をお薦めします。
次の例では、MySocketProvider
クラスで実装したmySocketProvider
というプロバイダを参照することにより、カスタム・ソケット・プロバイダを有効にしています。id
属性で定義した名前を使用して、このプロバイダを参照します。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/ coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <unicast-listener> <socket-provider>mySocketProvider</socket-provider> </unicast-listener> <socket-providers> <socket-provider id="mySocketProvider"> <instance> <class-name>package.MySocketProvider</class-name> </instance> </socket-provider> </socket-providers> </cluster-config> </coherence>
<instance>
要素で、<class-factory-name>
要素および<method-name>
要素を使用することもできます。前者の要素は、SocketProvider
インスタンスを作成するファクトリ・クラスを使用します。後者の要素は、オブジェクトをインスタンス化するファクトリ・クラスに対して静的なファクトリ・メソッドを指定します。次の例では、MySocketProviderFactory
クラスでcreateProvider
メソッドを使用して、カスタム・ソケット・プロバイダのインスタンスを取得します。
<socket-providers> <socket-provider id="mySocketProvider"> <instance> <class-factory-name>package.MySocketProviderFactory</class-factory-name> <method-name>createProvider</method-name> </instance> </socket-provider> </socket-providers>
実装に必要な初期化パラメータはすべて、<init-params>
要素を使用して指定できます。次の例では、iMaxTimeout
パラメータを2000
に設定します。
<socket-providers> <socket-provider id="mySocketProvider"> <instance> <class-name>package.MySocketProvider</class-name> <init-params> <init-param> <param-name>iMaxTimeout</param-name> <param-value>2000</param-value> </init-param> </init-params> </instance> </socket-provider> </socket-providers>