https://blogs.oracle.com/Tuxedo/entry/tuxedo_load_balancing
よく頂く質問に、「Tuxedoはどうやって負荷分散するの?」というのがあります。この質問は、特定のサービスを提供しているサーバが捌くリクエストの件数にばらつきがあることを知っているお客様からよく頂きます。
まず、Tuxedoは負荷分散するのではなく、リクエストや負荷の最適化をやっています。言わんとすることは、Tuxedoは特定のサービスを提供する全てのサーバが同じ件数のリクエストを受け取っていることを保証しようとはしておらず、その代わりに最小の時間でリクエストが処理されることを保証しようとしています。シンプルなラウンドロビンの負荷分散を使って特定のサービスのサーバ全てに同じ件数のリクエストを渡すことを保証できるでしょうが、それになんのメリットがあるのでしょうか。
Tuxedoではその代わりに、Queue(SSSQ*やMSSQ**に基づきサーバに対応している場合とサーバに対応していない場合があります)をスキャンして、どのQueueにリクエストを配置すべきかを決定します。
SSSQ : Single Server Single Queue常に同じ順序でスキャンを実施し、Queueが空の場合はリクエストを即座にそのQueueに配置してリクエストのルーティングを終了します。しかし、全てのQueueが詰まっている場合(リクエストが現在処理中の場合)、TuxedoはWorkリクエスト件数が最小のQueueを選択してリクエストをEnqueueします。ここでworkとは、UBBCONFIGファイルで定義されている「負荷」の値で重み付けされてQueueに入れられた全てのリクエストの合計です。これは軽い負荷であれば、スキャン完了までに空のQueueが見つかることが多いので、最初にスキャンした数個のQueue(サーバ)で全てのリクエストを処理することを意味します。したがって、最初にスキャンしたキュー内のサーバ数個で、ほとんどのリクエストを処理します。最適化されていないように思えますが、実際には、基礎となるオペレーティングシステムおよびハードウェアを十分に活用して、可能な限り最高のパフォーマンスを生成しています。ラウンドロビンスケジューリングを使うと使用可能なすべてのサーバーへリクエストを散らすため、すべてのリクエストがメモリに存在する必要があり、おそらくハードウェアやメモリのキャッシュの方法で多くを共有しないでしょう。Tuxedoのシステムは種々のキャッシュを最大化し、その結果全体のパフォーマンスを最適化します。
MSSQ : Multiple Server Single Queue
このことが、ほとんどのリクエストを数個のサーバで処理している状況を目の当たりにする理由を説明しています。高負荷、つまり、リクエストを処理する全てのサーバに十分な負荷がかかり続けている場合、処理されたリクエスト件数はほぼ均等になることがわかると思います。
次回のエントリでは、クラスタ環境(MP)では負荷分散が少々複雑になるので、クラスタ環境のサーバに適用する方法を取り扱う予定です。
0 件のコメント:
コメントを投稿