(57)【要約】【課題】仮想パケット振り分け装置間のデータのコピーを減らして性能劣化を防ぐ。【解決手段】物理サーバは、複数の仮想マシン２−０〜２−５と、仮想マシン２−０〜２−５にパケットを振り分けると共に相互にパケットを渡すディスパッチャ３−０〜３−２と、仮想マシン２のうちいずれかに送信する上りパケットを、バランサ振分テーブル５１に基づいてディスパッチャ３−０〜３−２のいずれかに振り分けると共に、この上りパケットへの応答である下りパケットが所定割合を超えて異なるディスパッチャ３から中継されてきたとき、バランサ振分テーブル５１を修正するバランサ４とを備える。【選択図】図２
2019071564.tif 000002
【特許請求の範囲】
【請求項１】
複数の仮想マシンと、
前記複数の仮想マシンにパケットを振り分けると共に相互にパケットを渡す複数のディスパッチャと、
前記仮想マシンのうちのいずれかに送信する上りパケットを、振分テーブルに基づいて前記複数のディスパッチャのいずれかに振り分けると共に、前記上りパケットへの応答である下りパケットが所定割合を超えて異なるディスパッチャから中継されてきたとき、前記振分テーブルを修正するバランサと、
を備えることを特徴とする負荷分散装置。
【請求項２】
前記バランサは、上りパケットに固有の識別子のハッシュ値と前記振分テーブルとに基づいて前記上りパケットを振り分けるディスパッチャを特定し、下りパケットに固有の識別子のハッシュ値と前記振分テーブルに基づいて、前記下りパケットに対応する上りパケットを振り分けたディスパッチャを特定する、
ことを特徴とする請求項１に記載の負荷分散装置。
【請求項３】
前記バランサは、所定のハッシュ値の上りパケットへの応答である下りパケットを最も多く送信したディスパッチャを特定し、特定した当該ディスパッチャに前記所定のハッシュ値の上りパケットを振り分けるように前記振分テーブルを修正する、
ことを特徴とする請求項２に記載の負荷分散装置。
【請求項４】
前記バランサは、所定のハッシュ値の上りパケットへの応答である下りパケットを送信した割合と、ディスパッチャ間の転送効率とによって、前記上りパケットの送信先のディスパッチャごとの振分効率を算出して、前記振分効率を最大化するディスパッチャを特定し、特定した当該ディスパッチャに前記所定のハッシュ値の上りパケットを振り分けるように前記振分テーブルを修正する、
ことを特徴とする請求項２に記載の負荷分散装置。
【請求項５】
前記固有の識別子は、前記上りパケットの送信先情報および前記下りパケットの送信元情報である、
ことを特徴とする請求項２に記載の負荷分散装置。
【請求項６】
前記バランサは、前記固有の識別子からハッシュ値を計算するハッシュ関数による全体の振分効率が所定の閾値以下ならば、更に振分効率のよいハッシュ関数に変更する、
ことを特徴とする請求項２に記載の負荷分散装置。
【請求項７】
複数の仮想マシンと、
前記複数の仮想マシンにパケットを振り分けると共に相互にパケットを渡す複数のディスパッチャと、
前記仮想マシンのうちのいずれかに送信する上りパケットを、振分テーブルに基づいて前記複数のディスパッチャのいずれかに振り分けると共に、前記上りパケットへの応答である下りパケットが所定割合を超えて異なるディスパッチャから中継されてきたとき、前記振分テーブルを修正するバランサと、
を備えることを特徴とする負荷分散システム。
【請求項８】
複数の仮想マシンと、前記複数の仮想マシンにパケットを振り分けると共に相互にパケットを渡す複数のディスパッチャとが具現化されたコンピュータを、
前記仮想マシンのうちのいずれかに送信する上りパケットを、振分テーブルに基づいて前記複数のディスパッチャのいずれかに振り分ける負荷分散手段、
前記上りパケットへの応答である下りパケットが所定割合を超えて異なるディスパッチャから中継されてきたとき、前記振分テーブルを修正するテーブル変更手段、
として機能させるための負荷分散プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、仮想化環境下において複数の仮想マシンに対して負荷の振り分けを行う負荷分散装置、負荷分散システム、および負荷分散プログラムに関する。
【背景技術】
【０００２】
物理サーバ上の仮想マシン間を高速に接続する技術として、ソフトウェアで実現された仮想パッチパネル技術や仮想スイッチ技術が存在する（非特許文献１）。これら仮想パケット振り分け技術では、宛先ＩＰアドレス等の識別子に基づき、仮想マシンへの振り分けを行う。
【０００３】
図２０は、比較例の物理サーバを示す概念図である。
物理サーバ１Ａは、負荷分散装置の一例を含んでおり、ネットワークＮを介してクライアント端末６ａ〜６ｃに接続されている。
【０００４】
この物理サーバ１Ａには、仮想マシン２−０〜２−２が具現化され、更にディスパッチャ３を含んだ仮想パケット振り分け装置７が具現化されている。仮想マシン２−０には、ＩＰアドレスａが払い出されている。仮想マシン２−１には、ＩＰアドレスｂが払い出されている。仮想マシン２−２には、ＩＰアドレスｃが払い出されている。
【０００５】
なお、図面では各仮想マシン２のことを“ＶＭ”（Virtual Machine）と省略して記載している。この仮想パケット振り分け装置７は、例えば上りパケットの送信先ＩＰアドレスを元に、この上りパケットを仮想マシン２−０〜２−２のうちいずれかに振り分ける。ここではクライアント端末６ａが送信するパケットは、仮想マシン２−０に振り分けられる。クライアント端末６ｂが送信するパケットは、仮想マシン２−１に振り分けられる。クライアント端末６ｃが送信するパケットは、仮想マシン２−２に振り分けられる。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】小川 泰文、中村 哲朗、高田 直樹、中村 宏之、「高速かつ柔軟な仮想マシン間接続を実現するSoft Patch Panelの提案および評価」, 電子情報通信学会技術研究報告, vol. 116, no. 322,NS2016-116, pp. 85-90, 2016年11月17日,
【発明の概要】
【発明が解決しようとする課題】
【０００７】
仮想マシンへの接続を行う仮想パケット振り分け装置を性能向上する際には、仮想パケット振り分け装置をスケールアウトさせる方法がある。その際、物理サーバが備える複数のＣＰＵコア（不図示）を利用して並列化を行い、個々の仮想パケット振り分け装置への負荷分散を行うことが考えられる。これをバランサ−ディスパッチャ構成という。
【０００８】
バランサは、ラウンドロビンなどのように、ボトルネックにならない単純なロジックとする必要がある。ここでは仮想マシンのインタフェースを変更させないために、仮想マシンを複数のディスパッチャに接続することは考慮しない。このとき、負荷分散により特定のディスパッチャに振り分けられたパケットは、このディスパッチャに直接に接続されている仮想マシンに宛先が無い場合、別のディスパッチャに振り分けられる。このディスパッチャ間転送に付随するデータのコピー処理がオーバヘッドとなり、負荷分散装置の性能劣化を招くおそれがある。
【０００９】
そこで、本発明は、負荷分散装置、負荷分散システム、および負荷分散プログラムにおいて、仮想パケット振り分け装置間のデータのコピーを減らして性能劣化を防ぐことを課題とする。
【課題を解決するための手段】
【００１０】
前記した課題を解決するため、請求項１に記載の発明では、複数の仮想マシンと、前記複数の仮想マシンにパケットを振り分けると共に相互にパケットを渡す複数のディスパッチャと、前記仮想マシンのうちのいずれかに送信する上りパケットを、振分テーブルに基づいて前記複数のディスパッチャのいずれかに振り分けると共に、前記上りパケットへの応答である下りパケットが所定割合を超えて異なるディスパッチャから中継されてきたとき、前記振分テーブルを修正するバランサと、を備えることを特徴とする負荷分散装置とした。
【００１１】
このようにすることで、仮想パケット振り分け装置間のデータのコピーを減らして性能劣化を防ぐことができる。
【００１２】
請求項２に記載の発明では、前記バランサは、上りパケットに固有の識別子のハッシュ値と前記振分テーブルとに基づいて前記上りパケットを振り分けるディスパッチャを特定し、下りパケットに固有の識別子のハッシュ値と前記振分テーブルに基づいて、前記下りパケットに対応する上りパケットを振り分けたディスパッチャを特定する、ことを特徴とする請求項１に記載の負荷分散装置とした。
【００１３】
このようにすることで、下りパケットに対応する上りパケットを振り分けたディスパッチャを特定することができる。よって、ディスパッチャ跨ぎによる性能劣化が発生していることを容易に検知できる。
【００１４】
請求項３に記載の発明では、前記バランサは、所定のハッシュ値の上りパケットへの応答である下りパケットを最も多く送信したディスパッチャを特定し、特定した当該ディスパッチャに前記所定のハッシュ値の上りパケットを振り分けるように前記振分テーブルを修正する、ことを特徴とする請求項２に記載の負荷分散装置とした。
【００１５】
このようにすることで、ディスパッチャ跨ぎによる性能劣化を抑えることができる。
【００１６】
請求項４に記載の発明では、前記バランサは、所定のハッシュ値の上りパケットへの応答である下りパケットを送信した割合と、ディスパッチャ間の転送効率とによって、前記上りパケットの送信先のディスパッチャごとの振分効率を算出して、前記振分効率を最大化するディスパッチャを特定し、特定した当該ディスパッチャに前記所定のハッシュ値の上りパケットを振り分けるように前記振分テーブルを修正する、ことを特徴とする請求項２に記載の負荷分散装置とした。
【００１７】
このようにすることで、ディスパッチャ間の転送効率を考慮して、より正確にディスパッチャ跨ぎによる性能劣化を抑えることができる。
【００１８】
請求項５に記載の発明では、前記固有の識別子は、前記上りパケットの送信先情報および前記下りパケットの送信元情報である、ことを特徴とする請求項２に記載の負荷分散装置とした。
【００１９】
このようにすることで、バランサは、負荷分散処理を高速に行うことができる。
【００２０】
請求項６に記載の発明では、前記バランサは、前記固有の識別子からハッシュ値を計算するハッシュ関数による全体の振分効率が所定の閾値以下ならば、更に振分効率のよいハッシュ関数に変更する、ことを特徴とする請求項２に記載の負荷分散装置とした。
【００２１】
このようにすることで、本発明によれば、ハッシュ値の重複による振分効率の低下を回避することができる。
【００２２】
請求項７に記載の発明では、複数の仮想マシンと、前記複数の仮想マシンにパケットを振り分けると共に相互にパケットを渡す複数のディスパッチャと、前記仮想マシンのうちのいずれかに送信する上りパケットを、振分テーブルに基づいて前記複数のディスパッチャのいずれかに振り分けると共に、前記上りパケットへの応答である下りパケットが所定割合を超えて異なるディスパッチャから中継されてきたとき、前記振分テーブルを修正するバランサと、を備えることを特徴とする負荷分散システムとした。
【００２３】
このようにすることで、仮想パケット振り分け装置間のデータのコピーを減らして性能劣化を防ぐことができる。
【００２４】
請求項８に記載の発明では、複数の仮想マシンと、前記複数の仮想マシンにパケットを振り分けると共に相互にパケットを渡す複数のディスパッチャとが具現化されたコンピュータを、前記仮想マシンのうちのいずれかに送信する上りパケットを、振分テーブルに基づいて前記複数のディスパッチャのいずれかに振り分ける負荷分散手段、前記上りパケットへの応答である下りパケットが所定割合を超えて異なるディスパッチャから中継されてきたとき、前記振分テーブルを修正するテーブル変更手段、として機能させるための負荷分散プログラムとした。
【００２５】
このようにすることで、仮想パケット振り分け装置間のデータのコピーを減らして性能劣化を防ぐことができる。
【発明の効果】
【００２６】
本発明によれば、仮想パケット振り分け装置間のデータのコピーを減らして性能劣化を防ぐことが可能となる。
【図面の簡単な説明】
【００２７】
【図１】本実施形態の負荷分散装置を示す構成図である。
【図２】負荷分散装置の構成とパケットの流れを示す図である。
【図３】バランサのハッシュ関数変更処理を示すフローチャートである。
【図４】バランサの振分処理を示すフローチャートである。
【図５】バランサ振分テーブルを示す図である。
【図６】ディスパッチャ＃０が備えるディスパッチャ振分テーブルを示す図である。
【図７】ディスパッチャ＃１が備えるディスパッチャ振分テーブルを示す図である。
【図８】ディスパッチャ＃２が備えるディスパッチャ振分テーブルを示す図である。
【図９】統計テーブルを示す図である。
【図１０】パラメータリストを示す図である。
【図１１】ディスパッチャテーブルを示す図である。
【図１２】振分動作を示す図である。
【図１３】初期状態におけるバランサ振分テーブルと統計テーブルに識別子欄を設けたテーブルを示す図である。
【図１４】振分後の応答を示す図である。
【図１５】応答後におけるバランサ振分テーブルと統計テーブルに識別子欄を設けたテーブルを示す図である。
【図１６】集計後におけるバランサ振分テーブルと統計テーブルに識別子欄を設けたテーブルを示す図である。
【図１７】修正後におけるバランサ振分テーブルと統計テーブルに識別子欄を設けたテーブルを示す図である。
【図１８】ハッシュ値が分散されていない場合のバランサ振分テーブルと統計テーブルに識別子欄を設けたテーブルを示す図である。
【図１９】ハッシュ値が分散されており、かつ修正後におけるバランサ振分テーブルと統計テーブルに識別子欄を設けたテーブルを示す図である。
【図２０】比較例の物理サーバの概念図である。
【図２１】比較例の物理サーバの構成とパケットの流れを示す図である。
【図２２】バランサ振分テーブルを示す図である。
【図２３】ディスパッチャ＃０が備えるディスパッチャ振分テーブルを示す図である。
【図２４】ディスパッチャ＃１が備えるディスパッチャ振分テーブルを示す図である。
【図２５】ディスパッチャ＃２が備えるディスパッチャ振分テーブルを示す図である。
【図２６】ＮＵＭＡ構成の負荷分散装置による振分動作を示す図である。
【発明を実施するための形態】
【００２８】
以降、比較例と本発明を実施するための形態を、各図と各数式を参照して詳細に説明する。
《比較例》
図２１は、比較例の物理サーバ１Ｂの内部構成とパケットの流れを示す図である。
バランサ４は、上りパケットのためにパケット受信部４１と上りハッシュ部４２と負荷分散部４３とバランサ振分テーブル５１（図２２参照）を備え、下りパケットのためにパケット集約部４６とパケット送信部４８とを備える。
【００２９】
パケット受信部４１は、クライアント端末６からのパケットを受信する。上りハッシュ部４２は、受信したパケットに対しハッシュ計算を行い、ハッシュ値を算出する。負荷分散部４３は、ハッシュ値とバランサ振分テーブル５１によって送信先のディスパッチャ３を特定し、特定したディスパッチャ３に対してパケットを送信する。
パケット集約部４６は、各ディスパッチャ３からのパケットを集約する。パケット送信部４８は、下りパケットをクライアント端末６に送信する。
【００３０】
ディスパッチャ３−０は、上りパケットのためにパケット受信部３１と振分部３２とディスパッチャ振分テーブル３５−０（図２３参照）とを備え、下りパケットのためにパケット集約部３３とパケット送信部３４とを備える。ディスパッチャ３−１は、ディスパッチャ振分テーブル３５−１（図２４参照）を備え、ディスパッチャ３−０と同様に構成されている。ディスパッチャ３−２は、ディスパッチャ振分テーブル３５−２（図２５参照）を備え、ディスパッチャ３−０と同様に構成されている。
【００３１】
パケット受信部３１は、バランサ４または他のディスパッチャ３−１，３−２から上りパケットを受信する。振分部３２は、ディスパッチャ振分テーブル３５−０（図２３参照）を参照して、目的の仮想マシン２−０，２−１またはディスパッチャ３−１，３−２に上りパケットを送信する。
パケット集約部３３は、仮想マシン２−０，２−１から受信した下りパケットを集約する。パケット送信部３４は、集約した下りパケットをバランサ４に送信する。
【００３２】
仮想マシン２−０は、パケット受信部２１とパケット処理部２２とパケット送信部２３とを備える。他の仮想マシン２−１〜２−５も、仮想マシン２−０と同様に構成されている。仮想マシン２−０，２−１はディスパッチャ３−０に接続されている。仮想マシン２−０には、ＩＰアドレスａが払い出されている。仮想マシン２−１には、ＩＰアドレスｂが払い出されている。
【００３３】
仮想マシン２−２，２−３はディスパッチャ３−１に接続されている。仮想マシン２−２には、ＩＰアドレスｃが払い出されている。仮想マシン２−３には、ＩＰアドレスｄが払い出されている。
仮想マシン２−４，２−５はディスパッチャ３−２に接続されている。仮想マシン２−４には、ＩＰアドレスｅが払い出されている。仮想マシン２−５には、ＩＰアドレスｆが払い出されている。
【００３４】
パケット受信部２１は、ディスパッチャ３−０から上りパケットを受信する。パケット処理部２２は、この仮想マシン２−０のロジックに基づき上りパケットを処理し、下りパケットを生成する。パケット送信部２３は、下りパケットを自身が接続されているディスパッチャ３−０に送信する。
【００３５】
図２２は、バランサ振分テーブル５１を示す図である。
バランサ振分テーブル５１は、ハッシュ値欄と送信先欄とを含んで構成される。
ハッシュ値欄は、上りパケットの識別子のハッシュ値に対応している。送信先欄のＤ０〜Ｄ２は、ハッシュ値に対応する送信先のディスパッチャ３−０〜３−２を示している。負荷分散部４３は、上りパケットの識別子のハッシュ値とバランサ振分テーブル５１に基づいて送信先のディスパッチャ３を特定する。
【００３６】
図２３は、ディスパッチャ３−０が備えるディスパッチャ振分テーブル３５−０を示す図である。
ディスパッチャ振分テーブル３５−０は、識別子欄と送信先欄とを含んで構成される。
識別子欄は、上りパケットの識別子に対応している。送信先欄のＶ０，Ｖ１は、この識別子に対応する送信先の仮想マシン２−０，２−１を示している。送信先欄のＤ１，Ｄ２は、この識別子に対応する転送先のディスパッチャ３−１，３−２を示している。
【００３７】
振分部３２は、このディスパッチャ振分テーブル３５−０と上りパケットの識別子に基づいて、目的の仮想マシン２−０，２−１またはディスパッチャ３−１，３−２を特定する。更に振分部３２は、目的の仮想マシン２−０，２−１またはディスパッチャ３−１，３−２に上りパケットを送信する。
【００３８】
図２４は、ディスパッチャ３−１が備えるディスパッチャ振分テーブル３５−１を示す図である。
ディスパッチャ振分テーブル３５−１は、識別子欄と送信先欄とを含んで構成される。
識別子欄は、上りパケットの識別子に対応している。送信先欄のＶ２，Ｖ３は、この識別子に対応する送信先の仮想マシン２−２，２−３を示している。送信先欄のＤ０，Ｄ２は、この識別子に対応する転送先のディスパッチャ３−０，３−２を示している。
【００３９】
振分部３２は、このディスパッチャ振分テーブル３５−１と上りパケットの識別子に基づいて、目的の仮想マシン２−２，２−３またはディスパッチャ３−０，３−２を特定する。更に振分部３２は、目的の仮想マシン２−２，２−３またはディスパッチャ３−０，３−２に上りパケットを送信する。
【００４０】
図２５は、ディスパッチャ３−２が備えるディスパッチャ振分テーブル３５−２を示す図である。
ディスパッチャ振分テーブル３５−２は、識別子欄と送信先欄とを含んで構成される。
識別子欄は、上りパケットの識別子に対応している。送信先欄のＶ４，Ｖ５は、この識別子に対応する送信先の仮想マシン２−４，２−５を示している。送信先欄のＤ０，Ｄ１は、この識別子に対応する転送先のディスパッチャ３−０，３−１を示している。
【００４１】
振分部３２は、このディスパッチャ振分テーブル３５−２と上りパケットの識別子に基づいて、目的の仮想マシン２−４，２−５またはディスパッチャ３−０，３−１を特定する。更に振分部３２は、目的の仮想マシン２−４，２−５またはディスパッチャ３−０，３−１に上りパケットを送信する。
【００４２】
これらディスパッチャ振分テーブル３５−０〜３５−２を全体として見ると、識別子ａの上りパケットは仮想マシン２−０に送信される。識別子ｂの上りパケットは仮想マシン２−１に送信される。識別子ｃの上りパケットは仮想マシン２−２に送信される。識別子ｄの上りパケットは仮想マシン２−３に送信される。識別子ｅの上りパケットは仮想マシン２−４に送信される。識別子ｆの上りパケットは仮想マシン２−５に送信される。
【００４３】
図２６は、比較例における物理サーバ１Ｂ上の負荷分散システムによる振分動作を示す図である。
この物理サーバ１Ｂには、仮想マシン２−０〜２−５が具現化され、更にディスパッチャ３−０〜３−２とバランサ４とが具現化されている。以下、各仮想マシン２−０〜２−５を区別しないときには、単に仮想マシン２と記載する。ディスパッチャ３−０〜３−２を区別しないときには、単にディスパッチャ３と記載する。ディスパッチャ３−０は、ＮＵＭＡ（Non-Uniform Memory Access）ノード７１上に具現化されている。ディスパッチャ３−１，３−２は、ＮＵＭＡノード７２上に具現化されている。バランサ４が備える上りハッシュ５５は、上りパケットの識別子から算出したハッシュ値である。
【００４４】
負荷分散先をランダムに決定してしまうと、ＮＵＭＡ構成等でキャッシュ共有が困難な場合にディスパッチャ３間のデータのコピーに伴う性能劣化が懸念される。そのためバランサ４は、なるべく上りパケットの宛先である仮想マシン２が直接に接続されたディスパッチャ３に対して、この上りパケットを送る必要がある。ここでバランサ４は、上りパケットの識別子から算出したハッシュ値により、ディスパッチャ３を選択している。
【００４５】
バランサ４は、識別子ａの上りパケットと識別子ｃの上りパケットをディスパッチャ３−０に振り分けている。ディスパッチャ３−０は、識別子ａの上りパケットを仮想マシン２−０に振り分け、識別子ｃの上りパケットをディスパッチャ３−１に振り分ける。その後、ディスパッチャ３−１は、識別子ｃの上りパケットを仮想マシン２−２に振り分ける。このとき、識別子ｃの上りパケットは、ディスパッチャ３−０とディスパッチャ３−１を跨いでいる。このように、異なるＮＵＭＡノード７１，７２を跨いでいるため、所定のオーバヘッドが発生し、負荷分散装置の性能劣化を招くおそれがある。
【００４６】
なお、同様のオーバヘッドは、識別子ｄ〜ｆの上りパケットをディスパッチャ３−０に振り分けた場合と、識別子ａ，ｂの上りパケットをディスパッチャ３−１，３−２に振り分けた場合に発生する。このとき、上りパケットは異なるＮＵＭＡノード７１，７２を跨いで送信される。
【００４７】
バランサ４が識別子ｃ，ｄの上りパケットをディスパッチャ３−２に振り分けた場合と、識別子ｅ，ｆの上りパケットをディスパッチャ３−１に振り分けた場合にも所定のオーバヘッドが発生する。しかし、同じＮＵＭＡノード７２に属するディスパッチャ３−１，３−２間の送信であるため、異なるＮＵＭＡノード７１，７２を跨ぐ送信よりもオーバヘッドは少ない。
【００４８】
バランサ４が識別子ａ，ｂの上りパケットをディスパッチャ３−０に振り分けた場合には、ディスパッチャ３の跨ぎは発生せず、オーバヘッドが発生しない。同様に、識別子ｃ，ｄの上りパケットをディスパッチャ３−１に振り分けた場合と、識別子ｅ，ｆの上りパケットをディスパッチャ３−２に振り分けた場合には、ディスパッチャ３の跨ぎは発生せず、オーバヘッドが発生しない。
【００４９】
《本実施形態》
図１は、本実施形態の物理サーバ１を示す構成図である。
サービスを享受するクライアント端末６と、サービスを提供する物理サーバ１とは、インターネット９２と社内ネットワーク９１を介して接続されている。この物理サーバ１のＣＰＵ（不図示）は、負荷分散プログラム（不図示）を実行することによって、図１の各部を具現化する。物理サーバ１は、負荷分散装置の一例であるディスパッチャ３−０〜３−２とバランサ４とを含んでいる。
【００５０】
物理サーバ１内には、不図示のハイパーバイザによって複数の仮想マシン２−０〜２−５が具現化されている。仮想マシン２−０，２−１は、ディスパッチャ３−０に接続されている。仮想マシン２−０には、ＩＰアドレスａが払い出されている。仮想マシン２−１には、ＩＰアドレスｂが払い出されている。クライアント端末６は、送信先アドレスをａとするパケットを送信することにより、仮想マシン２−０のサービスを享受する。クライアント端末６は、送信先アドレスをｂとするパケットを送信することにより、仮想マシン２−１のサービスを享受する。
【００５１】
仮想マシン２−２，２−３は、ディスパッチャ３−１に接続されている。仮想マシン２−２には、ＩＰアドレスｃが払い出されている。仮想マシン２−３には、ＩＰアドレスｄが払い出されている。クライアント端末６は、送信先アドレスをｃとするパケットを送信することにより、仮想マシン２−２のサービスを享受する。クライアント端末６は、送信先アドレスをｄとするパケットを送信することにより、仮想マシン２−３のサービスを享受する。
【００５２】
仮想マシン２−４，２−５は、ディスパッチャ３−２に接続されている。仮想マシン２−４には、ＩＰアドレスｅが払い出されている。仮想マシン２−５には、ＩＰアドレスｆが払い出されている。クライアント端末６は、送信先アドレスをｅとするパケットを送信することにより、仮想マシン２−４のサービスを享受する。クライアント端末６は、送信先アドレスをｆとするパケットを送信することにより、仮想マシン２−５のサービスを享受する。
【００５３】
ディスパッチャ３−０〜３−２は、クライアント端末６が送信した上りパケットを仮想マシン２−０〜２−５のいずれかに振り分けると共に、この上りパケットを相互に受け渡す。ディスパッチャ３−０〜３−２同士は互いに接続され、どのディスパッチャ３からも目的の仮想マシン２に上りパケットを送信することが可能である。ディスパッチャ３−０は、ＮＵＭＡノード７１上に具現化されている。ディスパッチャ３−１，３−２は、ＮＵＭＡノード７２上に具現化されている。更にディスパッチャ３−０〜３−２は、バランサ４に接続されている。
【００５４】
バランサ４は、仮想マシン２−０〜２−５のうちいずれかに送信する上りパケットを、バランサ振分テーブル５１（図５参照）に基づいてディスパッチャ３−０〜３−２のいずれかに振り分ける。バランサ４は、所定のハッシュ値の上りパケットへの応答である下りパケットを送信した割合と、ディスパッチャ３間の転送効率の情報によって、この上りパケットの送信先のディスパッチャ３ごとの振分効率を算出して、この振分効率を最大化するディスパッチャ３を特定し、特定したディスパッチャ３に所定のハッシュ値の上りパケットを振り分けるようにバランサ振分テーブル５１を修正する。具体的にいうとバランサ４は、上りパケットへの応答である下りパケットが所定割合を超えて異なるディスパッチャ３から中継されてきたときに、バランサ振分テーブル５１を修正するとよい。これによりバランサ４は、パケットの振分効率の低下を抑止することができる。
【００５５】
図２は、物理サーバ１（負荷分散装置）の構成とパケットの流れを示す図である。
バランサ４は、上りパケットのためにパケット受信部４１と上りハッシュ部４２と負荷分散部４３とバランサ振分テーブル５１（図５参照）とを備える。
【００５６】
バランサ４は、ハッシュ関数を決定するためにパラメータリスト５４（図１０参照）とハッシュ決定部４４とを備える。ハッシュ決定部４４が決定したハッシュ関数は、上りハッシュ部４２と下りハッシュ部４７とが使用する。バランサ４は、このバランサ振分テーブル５１を修正するためにテーブル変更部４５とディスパッチャテーブル５２（図１１参照）と統計テーブル５３（図９参照）とを備える。更にバランサ４は、下りパケットのためにパケット集約部４６と下りハッシュ部４７とパケット送信部４８とを備える。
【００５７】
パケット受信部４１は、クライアント端末６からの上りパケットを受信する。上りハッシュ部４２は、受信した上りパケットに対しハッシュ計算を行う。負荷分散部４３は、ハッシュ値とバランサ振分テーブル５１とによって送信先のディスパッチャ３を特定し、特定したディスパッチャ３に対して上りパケットを送信する。これによりバランサ４は、上りパケットに固有の識別子のハッシュ値とバランサ振分テーブル５１とに基づいて、この上りパケットを振り分けるディスパッチャ３を特定する。
【００５８】
ハッシュ決定部４４は、パラメータリスト５４を参照しつつハッシュ関数を決定する。パラメータリスト５４は、各パラメータにおけるハッシュ関数の振り分け効率を記録するためのリストである。これによりバランサ４は、固有の識別子からハッシュ値を計算するハッシュ関数による全体の振分効率が閾値以下ならば、更に振分効率のよいハッシュ関数に変更することができる。
【００５９】
テーブル変更部４５は、統計テーブル５３を元に、ハッシュ値に対する送信先のディスパッチャ３を変更するためにバランサ振分テーブル５１を修正する。バランサ４は、バランサ振分テーブル５１が所定のハッシュ値の上りパケットをディスパッチャ３−０に振り分けるように設定されている。例えば、この上りパケットへの応答である下りパケットがディスパッチャ３−１から統計的に最も多く送信されたとき、バランサ４は、所定のハッシュ値の上りパケットをディスパッチャ３−１に振り分けるようにバランサ振分テーブル５１を修正する。これにより、上りパケットがディスパッチャ３を跨いで送信されることを抑制することができ、仮想パケット振り分け装置間のデータのコピーを減らして性能劣化を防ぐことができる。
【００６０】
パケット集約部４６は、各ディスパッチャ３から受信した下りパケットを集約する。下りハッシュ部４７は、集約した下りパケットに対しハッシュ計算を行う。これにより、この下りパケットに対応する上りパケットの送信先のディスパッチャ３が特定可能となる。更に下りハッシュ部４７は、この下りパケットの応答元と、この下りパケットに対応する上りパケットの送信先との関係を統計テーブル５３に記録する。パケット送信部４８は、下りパケットをクライアント端末６に送信する。
【００６１】
ディスパッチャ３−０は、上りパケットのためにパケット受信部３１と振分部３２とディスパッチャ振分テーブル３５−０（図６参照）とを備え、下りパケットのためにパケット集約部３３とパケット送信部３４とを備える。ディスパッチャ３−１は、ディスパッチャ振分テーブル３５−１（図７参照）を備え、ディスパッチャ３−０と同様に構成されている。ディスパッチャ３−２は、ディスパッチャ振分テーブル３５−２（図８参照）を備え、ディスパッチャ３−０と同様に構成されている。
【００６２】
パケット受信部３１は、バランサ４または他のディスパッチャ３−１，３−２から上りパケットを受信する。振分部３２は、ディスパッチャ振分テーブル３５−０を参照し、目的の仮想マシン２−０，２−１またはディスパッチャ３−１，３−２に上りパケットを送信する。
パケット集約部３３は、仮想マシン２−０，２−１から受信した下りパケットを集約する。パケット送信部３４は、集約した下りパケットをバランサ４に送信する。
【００６３】
仮想マシン２−０は、パケット受信部２１とパケット処理部２２とパケット送信部２３とを備える。他の仮想マシン２−１〜２−５も、仮想マシン２−０と同様に構成されている。仮想マシン２−２，２−３はディスパッチャ３−１に接続されている。仮想マシン２−４，２−５はディスパッチャ３−２に接続されている。
【００６４】
パケット受信部２１は、ディスパッチャ３−０から上りパケットを受信する。パケット処理部２２は、仮想マシン２−０のロジックに基づき上りパケットを処理し、下りパケットを生成する。パケット送信部２３は、パケット処理部２２が生成した下りパケットを自身が接続されているディスパッチャ３−０に送信する。
【００６５】
図３は、バランサ４のハッシュ関数変更処理を示すフローチャートである。
後記する図４のハッシュ関数変更処理（ステップＳ２０）において、図３に示したハッシュ関数変更処理が呼び出される。
ステップＳ１０において物理サーバ１のＣＰＵ（不図示）は、初期化時であるか否かを判定する。ここで初期化時とは、この負荷分散プログラムが起動した後の最初の処理のことをいう。物理サーバ１のＣＰＵ（不図示）は、初期化時ならば（Ｙｅｓ）ステップＳ１１に進み、初期化時で無いならば（Ｎｏ）ステップＳ１３の処理に進む。
【００６６】
《初期化時の処理》
ステップＳ１１において、物理サーバ１のＣＰＵ（不図示）は、予め仮想マシン２の数が判明している場合はそれを参考にしてハッシュ分割数を決定し、ハッシュ分割数に応じたハッシュ関数を決定する。
ステップＳ１２において、物理サーバ１のＣＰＵ（不図示）は、ハッシュ関数にハッシュパラメータがある場合はそれを決定し、ステップＳ１９の処理に進む。なお、初期化時におけるハッシュパラメータは、任意のものであってもよい。
【００６７】
《初期化時以外の処理》
ステップＳ１３において、物理サーバ１のＣＰＵ（不図示）は、現在の振分効率をパラメータリスト５４に記録する。その後、ＣＰＵは、このハッシュ関数に係る全てのハッシュパラメータを試行したか否かを判定する（ステップＳ１４）。物理サーバ１のＣＰＵ（不図示）は、全てのハッシュパラメータを試行していないならば（Ｎｏ）、未使用のハッシュパラメータを選択し（ステップＳ１５）、ステップＳ１９の処理に進む。物理サーバ１のＣＰＵ（不図示）は、全てのハッシュパラメータを試行したならば（Ｙｅｓ）、全てのハッシュ関数を試行したか否かを判定する（ステップＳ１６）。物理サーバ１のＣＰＵ（不図示）は、全てのハッシュ関数を試行していないならば（Ｎｏ）、未使用のハッシュ関数を選択し（ステップＳ１７）、ステップＳ１９の処理に進む。
物理サーバ１のＣＰＵ（不図示）は、全てのハッシュ関数を試行したならば（Ｙｅｓ）、パラメータリスト５４から最も振分効率の高いハッシュ関数とハッシュパラメータの組合せを選択し（ステップＳ１８）、ステップＳ１９の処理に進む。
【００６８】
《共通処理》
ステップＳ１９において、ＣＰＵは、ハッシュ値ごとに振分先のディスパッチャ３を決定したバランサ振分テーブル５１を作成し、図３の処理を終了する。振分先のディスパッチャ３は、図４に示したバランサ振分テーブル５１の修正処理（ステップＳ２４）で最適値に修正するので、この時点ではランダムであってもよい。
【００６９】
図４は、バランサ４の振分処理を示すフローチャートである。
ステップＳ２０において物理サーバ１のＣＰＵ（不図示）は、ハッシュ関数変更処理（図３参照）を実行する。このハッシュ関数変更処理は、ハッシュ関数を決定してバランサ振分テーブル５１を作成する処理である。その後、物理サーバ１のＣＰＵ（不図示）は、統計テーブル５３の値をリセットする（ステップＳ２１）。
【００７０】
ステップＳ２２において物理サーバ１のＣＰＵ（不図示）は、この統計テーブル５３を参照して、ディスパッチャ３からの全応答パケット数Ｒが閾値Ｔrを超えているならば、ステップＳ２３に進む。物理サーバ１のＣＰＵ（不図示）は、全応答パケット数Ｒが閾値Ｔrを超えていないならば、ステップＳ２２に戻る。
ステップＳ２３において物理サーバ１のＣＰＵ（不図示）は、統計テーブル５３とディスパッチャテーブル５２とを元に、ハッシュ値ごと且つ送信先ごとの振分効率ｅikを計算する。ハッシュ値ごと且つ送信先ごとの振分効率ｅikは、式（１）で算出される。
【００７１】
【数１】
2019071564.tif 000003
【００７２】
ステップＳ２４において物理サーバ１のＣＰＵ（不図示）は、振分効率ｅikを最大化するｋ（送信先のディスパッチャ３）を決定して、決定した送信先のディスパッチャ３を元にバランサ振分テーブル５１を修正する。ここでハッシュ値ごとに最大化した振分効率ｅiは、式（２）で算出される。
【００７３】
【数２】
2019071564.tif 000004
【００７４】
なお、ＮＵＭＡ構成を有さないサーバでは、異なるディスパッチャ３間を転送する効率はほぼ等しいと推定される。この場合、振分効率ｅikを最大化するｋ（送信先のディスパッチャ３）は、下りパケットの送信数が最も多いディスパッチャ３となる。
ステップＳ２５において物理サーバ１のＣＰＵ（不図示）は、ハッシュ値ごとの振分効率ｅiの平均値を算出し、全体の振分効率Ｅとする。全体の振分効率Ｅは、以下の式（３）で算出される。
【００７５】
【数３】
2019071564.tif 000005
【００７６】
次いでステップＳ２６において物理サーバ１のＣＰＵ（不図示）は、全体の振分効率Ｅが閾値Ｔeを超えている場合（Ｙｅｓ）にステップＳ２１に戻る。全体の振分効率Ｅが閾値Ｔeを超えていない場合（Ｎｏ）、物理サーバ１のＣＰＵ（不図示）は、ステップＳ２０に戻り、ハッシュ関数とハッシュパラメータの選びなおしを含むハッシュ関数変更処理を実施する。
【００７７】
図５は、バランサ振分テーブル５１を示す図である。
バランサ振分テーブル５１は、ハッシュ値欄と送信先欄とを含んで構成される。
ハッシュ値欄は、上りパケットの識別子のハッシュ値に対応している。送信先欄のＤ０〜Ｄ２は、ハッシュ値に対応する送信先のディスパッチャ３−０〜３−２を示している。負荷分散部４３は、上りパケットの識別子のハッシュ値とバランサ振分テーブル５１に基づいて送信先のディスパッチャ３を特定する。
【００７８】
図６は、ディスパッチャ３−０が備えるディスパッチャ振分テーブル３５−０を示す図である。
ディスパッチャ振分テーブル３５−０は、識別子欄と送信先欄とを含んで構成される。
識別子欄は、上りパケットの識別子に対応している。送信先欄のＶ０，Ｖ１は、この識別子に対応する送信先の仮想マシン２−０，２−１を示している。送信先欄のＤ１，Ｄ２は、この識別子に対応する転送先のディスパッチャ３−１，３−２を示している。
【００７９】
振分部３２は、このディスパッチャ振分テーブル３５−０と上りパケットの識別子に基づいて、目的の仮想マシン２−０，２−１またはディスパッチャ３−１，３−２を特定する。更に振分部３２は、目的の仮想マシン２−０，２−１またはディスパッチャ３−１，３−２に上りパケットを送信する。
【００８０】
図７は、ディスパッチャ３−１が備えるディスパッチャ振分テーブル３５−１を示す図である。
ディスパッチャ振分テーブル３５−１は、識別子欄と送信先欄とを含んで構成される。
識別子欄は、上りパケットの識別子に対応している。送信先欄のＶ２，Ｖ３は、この識別子に対応する送信先の仮想マシン２−２，２−３を示している。送信先欄のＤ０，Ｄ２は、この識別子に対応する転送先のディスパッチャ３−０，３−２を示している。
【００８１】
振分部３２は、このディスパッチャ振分テーブル３５−１と上りパケットの識別子に基づいて、目的の仮想マシン２−２，２−３またはディスパッチャ３−０，３−２を特定する。更に振分部３２は、目的の仮想マシン２−２，２−３またはディスパッチャ３−０，３−２に上りパケットを送信する。
【００８２】
図８は、ディスパッチャ３−２が備えるディスパッチャ振分テーブル３５−２を示す図である。
ディスパッチャ振分テーブル３５−２は、識別子欄と送信先欄とを含んで構成される。
識別子欄は、上りパケットの識別子に対応している。送信先欄のＶ４，Ｖ５は、この識別子に対応する送信先の仮想マシン２−４，２−５を示している。送信先欄のＤ０，Ｄ１は、この識別子に対応する転送先のディスパッチャ３−０，３−１を示している。
【００８３】
振分部３２は、このディスパッチャ振分テーブル３５−２と上りパケットの識別子に基づいて、目的の仮想マシン２−４，２−５またはディスパッチャ３−０，３−１を特定する。更に振分部３２は、目的の仮想マシン２−４，２−５またはディスパッチャ３−０，３−１に上りパケットを送信する。
【００８４】
図９は、統計テーブル５３を示す図である。
統計テーブル５３には、上りパケットのハッシュ値と、各ディスパッチャ３がこの上りパケットに対応した下りパケットを応答した数とが格納されている。
ハッシュ値０の上りパケットについては、ディスパッチャ３−０（Ｄ０）が、この上りパケットに対応した１００個の下りパケットを応答している。
ハッシュ値１の上りパケットについては、ディスパッチャ３−１（Ｄ１）が、この上りパケットに対応した１５０個の下りパケットを応答している。
ハッシュ値２の上りパケットについては、ディスパッチャ３−２（Ｄ２）が、この上りパケットに対応した５０個の下りパケットを応答している。
ハッシュ値３の上りパケットについては、ディスパッチャ３−１（Ｄ１）が、この上りパケットに対応した５０個の下りパケットを応答し、ディスパッチャ３−２（Ｄ２）が、この上りパケットに対応した１００個の下りパケットを応答している。
ハッシュ値４の上りパケットは送信されていない。また、ハッシュ値５の上りパケットについては、ディスパッチャ３−０（Ｄ０）が、この上りパケットに対応した１５０個の下りパケットを応答している。
【００８５】
図１０は、パラメータリスト５４を示す図である。
パラメータリスト５４は、ハッシュ関数欄と、ハッシュパラメータ欄と、振分効率欄を備える。このパラメータリスト５４には、ハッシュ関数およびハッシュパラメータを変更した場合の振分効率が記録される。図１０において、ハッシュ関数Ｂかつハッシュパラメータ２の場合の振分効率は、未だ記録されていない。なお、ハッシュ関数欄の括弧内の数字は、分割数を示している。このパラメータリスト５４を参照することにより、物理サーバ１のＣＰＵは、最も振分効率のよいハッシュ関数とハッシュパラメータの組合せを選択することができる。
【００８６】
図１１は、ディスパッチャテーブル５２を示す図である。
ディスパッチャテーブル５２には、転送元のディスパッチャ３から転送先のディスパッチャ３までの転送効率が予め記録されている。なお、転送効率の逆数が転送コストである。
【００８７】
図１１に示した例では、ＮＵＭＡノード７１，７２を跨ぐディスパッチャ３−０からディスパッチャ３−１，３−２への転送コストは、ディスパッチャ３を跨がない場合の転送コスト（例えば、ディスパッチャ３−０からディスパッチャ３−０の転送）に比べて１０倍である。
【００８８】
更に、ＮＵＭＡノードを跨がないディスパッチャ３−１からディスパッチャ３−２への転送コストは、ディスパッチャ３を跨がない場合の転送コスト（例えば、ディスパッチャ３−１からディスパッチャ３−１の転送）に比べて１．１１…倍（０．９の逆数）である。
【００８９】
図１２は、当初の振分動作を示す図である。
当初、バランサ４は、上りパケットに対して、ディスパッチャ３における振り分けの元になる識別子（宛先ＩＰアドレス等）でハッシュをかけ、バランサ振分テーブル５１に基づき複数のディスパッチャ３に振り分ける。上りハッシュ５５は、上りパケットの識別子から算出したハッシュ値である。
【００９０】
図１２に示した例において、バランサ４は、識別子ａの上りパケットをディスパッチャ３−０に振り分ける。ディスパッチャ３−０は、この識別子ａの上りパケットを仮想マシン２−０に振り分ける。このとき、上りパケットはディスパッチャ３を跨いでおらず、オーバヘッドは発生していない。
【００９１】
更にバランサ４は、識別子ｃの上りパケットをディスパッチャ３−０に振り分ける。ディスパッチャ３−０は、この識別子ｃの上りパケットをディスパッチャ３−１に振り分ける。これにより上りパケットはＮＵＭＡノード７１とＮＵＭＡノード７２との間を跨ぐため、所定のオーバヘッドが発生する。ディスパッチャ３−１は、この識別子ｃの上りパケットを仮想マシン２−２に振り分ける。この時点でディスパッチャ３間かつＮＵＭＡノード間の転送が発生し、性能劣化の原因となる。
【００９２】
図１３は、初期状態におけるバランサ振分テーブル５１と統計テーブル５３に識別子欄を設けたテーブルを示す図である。
テーブルの左端は識別子欄である。その右側２列はハッシュ値欄と送信先欄であり、バランサ振分テーブル５１の内容を示している。識別子欄の値に対してハッシュ計算を行うとハッシュ値欄に示された値が算出される。
更にハッシュ値欄と、Ｄ０応答数欄、Ｄ１応答数欄、Ｄ２応答数欄によって、統計テーブル５３の内容を示している。図１３に示した統計テーブル５３は初期状態なので、Ｄ０応答数欄、Ｄ１応答数欄、Ｄ２応答数欄は、全て０でクリアされている。
【００９３】
図１４は、振分後の応答を示す図である。
バランサ４は、ディスパッチャ３−０〜３−２から受信した下りパケットに対して、この下りパケットの応答元のディスパッチャ３とハッシュ値との対応を統計テーブル５３に記録する。上りパケットを送信したディスパッチャ３は、振分の元となる識別子（下りパケットの送信元ＩＰアドレス等）のハッシュ値とバランサ振分テーブル５１に基づいて判定することができる。なお、上りパケットの送信先ＩＰアドレスと、この上りパケットの応答である下りパケットの送信元ＩＰアドレスとは同一である。下りハッシュ５６は、下りパケットの識別子ａから算出したハッシュ値である。
【００９４】
具体的にいうと、バランサ４は、識別子ａの下りパケットをディスパッチャ３−０から受信すると、識別子ａのハッシュ値を０として算出する。このハッシュ値０とバランサ振分テーブル５１に基づいて、この下りパケットに対応する上りパケットの送信先がＤ０（ディスパッチャ３−０）であることが判定できる。
【００９５】
更にバランサ４は、識別子ｃの下りパケットをディスパッチャ３−１から受信すると、識別子ｃのハッシュ値を１として算出する。このハッシュ値１とバランサ振分テーブル５１に基づいて、この下りパケットに対応する上りパケットの送信先がＤ０（ディスパッチャ３−０）であることが判定できる。
【００９６】
図１５は、応答後におけるバランサ振分テーブル５１と統計テーブル５３に識別子欄を設けたテーブルを示す図である。
この統計テーブル５３は、ハッシュ値が０の行のＤ０応答数欄が１に設定される。これは、識別子ａの上りパケットおよび下りパケットによるものである。更にハッシュ値が１の行のＤ１応答数欄が１に設定される。これは、識別子ｃの上りパケットおよび下りパケットによるものである。
【００９７】
図１６は、集計後におけるバランサ振分テーブル５１と統計テーブル５３に識別子欄を設けたテーブルを示す図である。
この統計テーブル５３は、各識別子のパケットが１００個ずつ送受信されたときのものである。
【００９８】
識別子ａの１００個の上りパケットがディスパッチャ３−０に振り分けられ、これに対応する１００個の下りパケットがディスパッチャ３−０から送信される。このとき、オーバヘッドは無い。
【００９９】
識別子ｃの１００個の上りパケットがディスパッチャ３−０に振り分けられ、これに対応する１００個の下りパケットがディスパッチャ３−１から送信される。このとき、所定のオーバヘッドが発生するため、個数の“１００”を太字イタリック体で示している。
【０１００】
識別子ｆの１００個の上りパケットがディスパッチャ３−１に振り分けられ、これに対応する１００個の下りパケットがディスパッチャ３−２から送信される。このとき、所定のオーバヘッドが発生するため、個数の“１００”を太字イタリック体で示している。
【０１０１】
識別子ｄ，ｅの各１００個の上りパケットがディスパッチャ３−１に振り分けられ、これに対応する１００個の下りパケットがディスパッチャ３−１から送信され、１００個の下りパケットがディスパッチャ３−２から送信される。このとき、ディスパッチャ３−２から送信された１００個の下りパケットに対応する上りパケットには、幾らかのオーバヘッドが発生するため、個数の“１００”を太字イタリック体で示している。
【０１０２】
識別子ｂの１００個の上りパケットがディスパッチャ３−２に振り分けられ、これに対応する１００個の下りパケットがディスパッチャ３−０から送信される。このとき、所定のオーバヘッドが発生するため、個数の“１００”を太字イタリック体で示している。
【０１０３】
テーブル変更部４５は、統計テーブル５３を元に、バランサ振分テーブル５１の送信先を、ディスパッチャ３間のデータコピーのコストが小さく効率が高い送信先に変更する。単純にいうとテーブル変更部４５は、各ハッシュ値において応答数が最も多いディスパッチャ３を送信先とする。
【０１０４】
図１７は、修正後におけるバランサ振分テーブル５１と統計テーブル５３に識別子欄を設けたテーブルを示す図である。
識別子ｃの下りパケットは、全てディスパッチャ３−１から送信される。そのためテーブル変更部４５は、バランサ振分テーブル５１のうち、識別子ｃのハッシュ値＝１に対応する送信先を、Ｄ１（ディスパッチャ３−１）に変更している。これにより、上りパケットがディスパッチャ３を跨ぐことが無くなる。
【０１０５】
識別子ｆの下りパケットは、全てディスパッチャ３−２から送信される。そのためテーブル変更部４５は、バランサ振分テーブル５１のうち、識別子ｆのハッシュ値＝２に対応する送信先を、Ｄ２（ディスパッチャ３−２）に変更している。これにより、上りパケットがディスパッチャ３を跨ぐことが無くなる。
【０１０６】
識別子ｂの下りパケットは、全てディスパッチャ３−０から送信される。そのためテーブル変更部４５は、バランサ振分テーブル５１のうち、識別子ｂのハッシュ値＝５に対応する送信先を、Ｄ０（ディスパッチャ３−０）に変更している。これにより、上りパケットがディスパッチャ３を跨ぐことが無くなる。
【０１０７】
識別子ｄ，ｅの１００個の下りパケットがディスパッチャ３−１から送信され、１００個の下りパケットがディスパッチャ３−２から送信される。識別子ｄ，ｅのハッシュ値＝３に対応する送信先は、ディスパッチャ３−１，３−２のうちいずれかであればよい。
【０１０８】
《ハッシュ分散処理》
仮に最初のハッシュ関数の振り分け結果が分散されていない場合、所望の振分効率が得られないため、ハッシュ関数を組み直す。ハッシュ関数は必ずしも効率のいいものが見つかるとは限らないため、試行錯誤を繰り返すことで比較的分散されるものを見つけるとよい。
【０１０９】
図１８は、ハッシュ値が分散されていない場合のバランサ振分テーブル５１と統計テーブル５３に識別子欄を設けたテーブルを示す図である。
ここでは選択したハッシュ関数の振り分け結果が分散されておらず、複数の識別子から同一のハッシュ値が算出される。例えば識別子ａ，ｃ，ｅのハッシュ値は０であり、識別子ｂ，ｄ，ｆのハッシュ値は１である。このような場合、バランサ振分テーブル５１を修正しても多くのパケットでディスパッチャ３の跨ぎが発生する。
【０１１０】
図１８において、ハッシュ値ｉが０のとき、ハッシュ値ごとの振分効率ｅ0は式（４）で算出され、その値は０．４である。
【数４】
2019071564.tif 000006
【０１１１】
ハッシュ値ｉが１のとき、ハッシュ値ごとの振分効率ｅ1は式（５）で算出され、その値は０．６６６…である。
【数５】
2019071564.tif 000007
【０１１２】
全体の振分効率Ｅはこれらの平均値であり、０．５３３３…である。この全体の振分効率Ｅが閾値Ｔeを超えていない場合、ハッシュ関数変更処理において未使用のハッシュパラメータや未使用のハッシュ関数が選択され、試行錯誤が行われる。
【０１１３】
図１９は、ハッシュ値が分散されており、かつ修正後におけるバランサ振分テーブル５１と統計テーブル５３に識別子欄を設けたテーブルを示す図である。
選択したハッシュ関数が良くなればテーブル修正によりディスパッチャ３の跨ぎを抑えることが可能である。
【０１１４】
図１９において、ハッシュ値ｉが０のとき、ハッシュ値ごとの振分効率ｅ0は１．０である。ハッシュ値ｉが１のとき、ハッシュ値ごとの振分効率ｅ1は１．０である。ハッシュ値ｉが２のとき、ハッシュ値ごとの振分効率ｅ2＝１．０である。ハッシュ値ｉが３のとき、ハッシュ値ごとの振分効率ｅ3は式（６）で算出され、その値は０．９５である。
【数６】
2019071564.tif 000008
【０１１５】
ハッシュ値ｉが５のとき、ハッシュ値ごとの振分効率ｅ5は１．０である。
全体の振分効率Ｅはこれらの平均値であり、０．９９である。このように全体の振分効率Ｅが閾値Ｔeを超えると、ハッシュパラメータおよびハッシュ関数は変更されなくなる。
【０１１６】
《実施形態の効果》
仮想マシンへの接続を行う仮想パケット振り分け装置をスケールアウトする際、仮想マシンからの下りパケットの情報を元に負荷分散の振り分けテーブルを随時修正することで仮想パケット振り分け装置間のデータのコピーを減らし、性能劣化を防ぐことが可能になる。
【０１１７】
《変形例》
本発明は、上記実施形態に限定されることなく、本発明の趣旨を逸脱しない範囲で、変更実施が可能であり、例えば、次の（ａ）〜（ｅ）のようなものがある。
【０１１８】
（ａ）  上りパケットの識別子は、送信先アドレスに限定されず、送信元アドレスやＭＡＣ（Media Access Control）アドレスであってもよい。
（ｂ）  ハッシュ分散処理は、全体の振分効率を最大化することに限定されない。識別子リストをハッシュ演算して、ハッシュ値の重複が最小化されるように計算してもよく、限定されない。
（ｃ）  異なるディスパッチャ３間の転送効率の違いを無視してもよい。つまり、所定のハッシュ値を持つ下りパケットを最も多く送信したディスパッチャ３を、バランサ振分テーブル５１によって振り分けるディスパッチャとしてもよい。更に異なるディスパッチャ３を跨ぐパケットの割合を振分効率の近似値としてもよい。
（ｄ）  ディスパッチャ跨ぎによる振分効率を動的に算出し、パラメータリストを修正してもよい。
（ｅ）  バランサやディスパッチャは、単一の物理サーバ上に具現化されるだけではなく、複数の物理サーバ上に具現化された負荷分散システムであってもよい。
【符号の説明】
【０１１９】
１，１Ａ，１Ｂ  物理サーバ  （負荷分散装置・負荷分散システム）
２，２−０〜２−５  仮想マシン
２１  パケット受信部
２２  パケット処理部
２３  パケット送信部
３，３−０〜３−２  ディスパッチャ  （仮想パケット振り分け装置の一部）
３１  パケット受信部
３２  振分部
３３  パケット集約部
３４  パケット送信部
３５  ディスパッチャ振分テーブル
４  バランサ  （仮想パケット振り分け装置の一部）
４１  パケット受信部
４２  上りハッシュ部
４３  負荷分散部
４４  ハッシュ決定部
４５  テーブル変更部
４６  パケット集約部
４７  下りハッシュ部
４８  パケット送信部
５１  バランサ振分テーブル
５２  ディスパッチャテーブル
５３  統計テーブル
５４  パラメータリスト
５５  上りハッシュ
５６  下りハッシュ
６，６ａ〜６ｃ  クライアント端末
７  仮想パケット振り分け装置
７１，７２  ＮＵＭＡノード
９１  社内ネットワーク
９２  インターネット
【図１】
2019071564.tif 000009
【図２】
2019071564.tif 000010
【図３】
2019071564.tif 000011
【図４】
2019071564.tif 000012
【図５】
2019071564.tif 000013
【図６】
2019071564.tif 000014
【図７】
2019071564.tif 000015
【図８】
2019071564.tif 000016
【図９】
2019071564.tif 000017
【図１０】
2019071564.tif 000018
【図１１】
2019071564.tif 000019
【図１２】
2019071564.tif 000020
【図１３】
2019071564.tif 000021
【図１４】
2019071564.tif 000022
【図１５】
2019071564.tif 000023
【図１６】
2019071564.tif 000024
【図１７】
2019071564.tif 000025
【図１８】
2019071564.tif 000026
【図１９】
2019071564.tif 000027
【図２０】
2019071564.tif 000028
【図２１】
2019071564.tif 000029
【図２２】
2019071564.tif 000030
【図２３】
2019071564.tif 000031
【図２４】
2019071564.tif 000032
【図２５】
2019071564.tif 000033
【図２６】
2019071564.tif 000034