(57)【要約】【課題】  パケットの送受信処理の負荷を高精度に分散させることができる負荷分散装置及び負荷分散方法を提供する。【解決手段】  負荷分散装置は、複数のポートの各々のパケットの送受信処理の負荷を示す負荷値を保持する保持部と、前記複数のポートのうち、複数のプロセッサの各々が前記送受信処理を分担するポートを示すポート情報を取得し、前記負荷値及び前記ポート情報から前記複数のプロセッサの各々の前記送受信処理の負荷を算出する算出部と、前記算出部の算出結果に基づいて前記複数のプロセッサの間で前記送受信処理の負荷を分散させる前記分散処理部とを有する。【選択図】図５
2018181155.tif 000002
【特許請求の範囲】
【請求項１】
複数のポートの各々のパケットの送受信処理の負荷を示す負荷値を保持する保持部と、
前記複数のポートのうち、複数のプロセッサの各々が前記送受信処理を分担するポートを示すポート情報を取得し、前記負荷値及び前記ポート情報から前記複数のプロセッサの各々の前記送受信処理の負荷を算出する算出部と、
前記算出部の算出結果に基づいて前記複数のプロセッサの間で前記送受信処理の負荷を分散させる分散処理部とを有することを特徴とする負荷分散装置。
【請求項２】
前記複数のポートの各々を介し送受信されるパケットを計数する計数部を有し、
前記負荷値は、前記複数のポートの各々の前記送受信処理の負荷をパケット単位で示し、
前記算出部は、前記負荷値、前記ポート情報、及び前記計数部が計数したパケット数から前記複数のプロセッサの各々の前記送受信処理の負荷を算出することを特徴とする請求項１に記載の負荷分散装置。
【請求項３】
前記複数のプロセッサは、それぞれ、前記複数のポートのうち、前記ポート情報が示す第１ポートの受信処理と、前記第１ポートで受信したパケットの転送先の第２ポートの送信処理を分担し、
前記負荷値には、前記複数のポートの各々について、パケットの受信処理の負荷を示す受信負荷値と、パケットの送信処理の負荷を示す送信負荷値とが含まれ、
前記算出部は、
パケットの転送経路ごとの前記第１ポート及び前記第２ポートを示す経路情報を取得し、
前記経路情報と前記ポート情報から、前記複数のプロセッサの各々が前記受信処理を分担する前記第１ポートの前記受信負荷値と前記第２ポートの前記送信負荷値の合計を算出することを特徴とする請求項１または２に記載の負荷分散装置。
【請求項４】
前記負荷値には、前記複数のポートの各々について、パケットの受信処理の負荷を示す受信負荷値と、パケットの送信処理の負荷を示す送信負荷値とが含まれ、
前記算出部は、前記ポート情報から、前記複数のポートのうち、前記複数のプロセッサの各々が前記送受信処理を分担する１以上のポートの前記受信負荷値及び前記送信負荷値の合計を算出することを特徴とする請求項１または２に記載の負荷分散装置。
【請求項５】
前記分散処理部は、前記算出部の算出結果に基づいて、前記複数のポートのうち、前記複数のプロセッサの各々が前記送受信処理を分担するポートを、前記複数のプロセッサのうち、２つのプロセッサの間の負荷の大小関係が逆転するように変更することにより、前記複数のプロセッサの間で前記送受信処理の負荷を分散させることを特徴とする請求項１乃至４の何れかに記載の負荷分散装置。
【請求項６】
前記分散処理部は、前記複数のプロセッサの一方に対し前記複数のポートの少なくとも１つの前記送受信処理を停止させたときから一定の期間が経過した後、前記複数のプロセッサの他方に対し当該ポートの前記送受信処理を開始させることを特徴とする請求項５に記載の負荷分散装置。
【請求項７】
前記分散処理部は、前記複数のポートのうち、前記複数のプロセッサの各々が前記送受信処理を分担するポートを、該ポートのパケットの前記送受信処理が行われていないときに変更することを特徴とする請求項５に記載の負荷分散装置。
【請求項８】
前記算出部は、前記複数のポートの各々におけるパケットのロスの検出に応じて前記複数のプロセッサの各々の前記送受信処理の負荷を算出することを特徴とする請求項１乃至７の何れかに記載の負荷分散装置。
【請求項９】
前記算出部は、周期的に前記複数のプロセッサの各々の前記送受信処理の負荷を算出することを特徴とする請求項１乃至７の何れかに記載の負荷分散装置。
【請求項１０】
複数のポートの各々のパケットの送受信処理の負荷を示す負荷値と、前記複数のポートのうち、複数のプロセッサの各々が前記送受信処理を分担するポートを示すポート情報とから前記複数のプロセッサの各々の前記送受信処理の負荷を算出し、
該算出結果に基づいて前記複数のプロセッサの間で前記送受信処理の負荷を分散させることを特徴とする負荷分散方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本件は、負荷分散装置及び負荷分散方法に関する。
【背景技術】
【０００２】
各種のネットワーク機能を、アプリケーションを用いて汎用サーバなどに仮想的に形成するＮＦＶ（Network Function Virtualization）の技術が知られている。ＮＦＶの技術によると、専用のハードウェアを必要とせずに、Ｗｅｂプロキシやファイアウォールなどの各種のネットワーク機能を仮想マシンにより実現できるため、ネットワークシステムの低コスト化が期待される。
【０００３】
仮想マシン同士または仮想マシンと外部ネットワークの間の接続には、例えば、「Open vSwitch」（以下、「ＯＶＳ」と表記）などの仮想スイッチが用いられる。例えばＯＶＳのパケット処理を高速化するため、ＯＶＳに対しＤＰＤＫ（Data Plane Development Kit）などの高速化ライブラリが適用される。
【０００４】
ＤＰＤＫが適用されたＯＶＳ（以下、「ＤＰＤＫ適用ＯＶＳ」と表記）を用いると、ポートごとのパケットの送受信処理を複数のＣＰＵ（Central Processing Unit）に分担させることができるため、パケット処理の高速化が可能となる。なお、例えば特許文献１及び２には、複数のプロセッサがそれぞれポートを制御する点が記載されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００６−２０９２９４号公報
【特許文献２】特表２００３−５１５９７８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ＤＰＤＫ適用ＯＶＳのように複数のＣＰＵがパケットの送受信処理を分担する場合、特定のＣＰＵに送受信処理の負荷が偏ると、そのＣＰＵがパケットの受信処理を分担するポートにおいて受信バッファ内の未処理のパケットの格納量が増加する。この格納量が上限を超えると、受信バッファ内にパケットを格納することができなくなるため、パケットが廃棄される。
【０００７】
このため、複数のＣＰＵにパケットの送受信処理の負荷を分散させることが望ましい。負荷を分散させる手法としては、例えば各ＣＰＵの使用率が均等になるように各ＣＰＵに処理を割り当てることが挙げられる。
【０００８】
しかし、例えばＤＰＤＫ適用ＯＶＳを用いると、各ＣＰＵは、各ポートへのパケットの到着を監視するため、各ポートに対しポーリングを行うことにより、その使用率が、見かけ上、ほぼ１００（％）となる。つまり、各ＣＰＵは、パケットの送受信処理を行ったときに余ったＣＰＵパワーの全てをポーリングに用いるため、常にＣＰＵパワーに余裕がない状態に見える。
【０００９】
したがって、ＣＰＵの負荷の指標として使用率を用いた場合、負荷分散を高精度に行うことは難しい。
【００１０】
また、負荷を分散させる他の手法として、例えば各ＣＰＵが送受信処理を分担するポート数を均等とすることが挙げられる。
【００１１】
しかし、各ポートにおける送受信処理は、そのポートの通信先のネットワークデバイスの種類によって異なるため、送受信処理の負荷もポートごとに相違する。このため、ＣＰＵの負荷の指標としてポート数を用いた場合、負荷分散を高精度に行うことは難しい。なお、この問題は、ＣＰＵに限定されず、他の種類のプロセッサが用いられた場合にも同様に存在する。
【００１２】
そこで本件は、パケットの送受信処理の負荷を高精度に分散させることができる負荷分散装置及び負荷分散方法を提供することを目的とする。
【課題を解決するための手段】
【００１３】
１つの態様では、負荷分散装置は、複数のポートの各々のパケットの送受信処理の負荷を示す負荷値を保持する保持部と、前記複数のポートのうち、複数のプロセッサの各々が前記送受信処理を分担するポートを示すポート情報を取得し、前記負荷値及び前記ポート情報から前記複数のプロセッサの各々の前記送受信処理の負荷を算出する算出部と、前記算出部の算出結果に基づいて前記複数のプロセッサの間で前記送受信処理の負荷を分散させる前記分散処理部とを有する。
【００１４】
１つの態様では、負荷分散方法は、複数のポートの各々のパケットの送受信処理の負荷を示す負荷値と、前記複数のポートのうち、複数のプロセッサの各々が前記送受信処理を分担するポートを示すポート情報とから前記複数のプロセッサの各々の前記送受信処理の負荷を算出し、該算出結果に基づいて前記複数のプロセッサの間で前記送受信処理の負荷を分散させる方法である。
【発明の効果】
【００１５】
１つの側面として、パケットの送受信処理の負荷を高精度に分散させることができる。
【図面の簡単な説明】
【００１６】
【図１】ネットワークシステムの一例を示す構成図である。
【図２】ポートの受信処理及び送信処理の一例を示すフローチャートである。
【図３】ポートの受信処理及び送信処理の他の例を示すフローチャートである。
【図４】中継サーバのハードウェア構成の一例を示す図である。
【図５】中継サーバの機能構成の一例を示す図である。
【図６】ポートリスト、フローテーブル、及び負荷値テーブルの例を示す図である。
【図７】仮想スイッチの転送経路の一例を示す図である。
【図８】負荷分散処理の第１実施例を示す図（その１）である。
【図９】負荷分散処理の第１実施例を示す図（その２）である。
【図１０】負荷分散処理の第２実施例を示す図（その１）である。
【図１１】負荷分散処理の第２実施例を示す図（その２）である。
【図１２】負荷分散処理の第３実施例を示す図（その１）である。
【図１３】負荷分散処理の第３実施例を示す図（その２）である。
【図１４】負荷処理機能部の処理の一例を示すフローチャートである。
【図１５】負荷分散処理の一例を示すフローチャートである。
【図１６】負荷処理機能部の処理の他の例を示すフローチャートである。
【図１７】負荷処理機能部の処理の他の例を示すフローチャートである。
【図１８】負荷処理機能部の処理の他の例を示すフローチャートである。
【発明を実施するための形態】
【００１７】
図１は、ネットワークシステムの一例を示す構成図である。ネットワークシステムは、クライアントの端末９０と、ＩＳＰ（Internet Service Provider）ネットワーク９１に接続された複数の中継サーバ１と、インターネット９２に接続されたＷｅｂサーバ９３とを含む。
【００１８】
端末９０は、ＩＳＰネットワーク９１を介してインターネット９２上のＷｅｂサーバ９３にアクセスする。端末９０としては、例えばスマートフォン、パーソナルコンピュータなどが挙げられるが、これに限定されず、他の通信機器であってもよい。
【００１９】
ＩＳＰネットワーク９１は、インターネット９２への接続サービスを提供するＩＳＰにより運用される。複数の中継サーバ１は、ＩＳＰネットワーク９１を構成し、端末９０とインターネット９２の間に通信を中継する。
【００２０】
中継サーバ１は、例えばＮＦＶの技術により構成された仮想スイッチ８１及び仮想マシン（VM: Virtual Machine）８０により端末９０及びＷｅｂサーバ９３のパケット（例えばイーサネット（登録商標）フレーム）の中継処理を行う。中継サーバ１は、一例として２つのＣＰＵにより中継処理を実行する。なお、中継サーバ１は、ＣＰＵに限定されず、他のプロセッサにより中継処理を実行してもよい。また、ＣＰＵの個数に限定はない。
【００２１】
中継サーバ１には、２つのＣＰＵを駆動するソフトウェアにより、複数のＶＭ８０と、仮想スイッチ８１と、ホストＯＳ（Operating System）８２とが機能として形成される。ホストＯＳ８２は、複数のＶＭ８０と仮想スイッチ８１の動作基盤となる。また、ホストＯＳ８２は、複数の物理的なＮＩＣ（Network Interface Card）８２０を駆動する。中継サーバ１は、ＮＩＣ８２０により端末９０、他の中継サーバ、及びインターネット９２と通信する。
【００２２】
仮想スイッチ８１は、例えばＤＰＤＫ適用ＯＶＳであり、複数のＮＩＣ８２０と複数のＶＭ８０の間でパケットの転送処理（つまり交換）を行う。各ＶＭ８０は、例えばファイアウォールやＷｅｂプロキシなどのネットワーク機能を有しており、そのネットワーク機能に応じたパケット処理を実行する。各ＶＭ８０には、仮想スイッチ８１との間でパケットを送受信するための仮想ＮＩＣ８００が設けられている。なお、本例において、仮想スイッチ８１には、４つのＶＭ８０と２つの物理的なＮＩＣ８２０が接続されているが、ＶＭ８０及びＮＩＣ８２０の接続数に限定はない。
【００２３】
仮想スイッチ８１には、２つのＮＩＣ８２０とそれぞれ接続されたポート（＃１，＃２）８１０と、４つのＶＭ８０とそれぞれ接続されたポート（＃３〜＃６）８１０とを有する。仮想スイッチ８１は、ポート（＃１，＃２）８１０を介して２つのＮＩＣ８２０とパケット（ＰＫＴ）を送受信し、ポート（＃３〜＃６）８１０を介して４つのＶＭ８０とパケットを送受信する。
【００２４】
より具体的には、ＮＩＣ８２０側のポート（＃１，＃２）８１０は、ＮＩＣ８２０からパケットを受信して、ＶＭ８０側のポート（＃３〜＃６）８１０に転送する。ＶＭ８０側のポート（＃３〜＃６）８１０は、その転送されたパケットをＶＭ８０に送信する。
【００２５】
また、ＶＭ８０側のポート（＃３〜＃６）８１０は、ＶＭ８０からパケットを受信して、ＮＩＣ８２０側のポート（＃１，＃２）８１０に転送する。ＮＩＣ８２０側のポート（＃１，＃２）８１０は、その転送されたパケットをＮＩＣ８２０に送信する。なお、各ポート８１０間の転送経路は、後述するフローテーブルに基づき設定される。
【００２６】
このように、ポート（＃１，＃２）８１０は、ＮＩＣ８２０に対するパケットの送信処理及び受信処理を行い、ポート（＃３〜＃６）８１０は、ＶＭ８０に対するパケットの送信処理及び受信処理を行う。
【００２７】
各ポート８１０には、符号Ｇａで示されるように、パケットを格納する受信バッファＢｒ及び送信バッファＢｓ（キュー）が設けられている。受信バッファＢｒには、ＶＭ８０またはＮＩＣ８２０から受信されて仮想スイッチ８１に出力されるパケットが格納される。送信バッファＢｓには、仮想スイッチ８１から入力されてＶＭ８０またはＮＩＣ８２０に送信されるパケットが格納される。なお、符号Ｇａは、ポート（＃６）８１０の受信バッファＢｒ及び送信バッファＢｓを例示するが、他のポート（＃１〜＃５）８１０の受信バッファＢｒ及び送信バッファＢｓも、これと同様に構成される。
【００２８】
中継サーバ１は、各ポート８１０のパケットの送受信処理を、２つのＣＰＵにポート８１０ごとにそれぞれ分担させる。このため、中継サーバ１は、高速なパケット処理が可能である。
【００２９】
しかし、一方のＣＰＵに送受信処理の負荷が偏った場合、符号Ｇａの点線枠（ＰＫＴ）で示されるように、そのＣＰＵがパケットの受信処理を分担するポート８１０において受信バッファＢｒ内の未処理のパケットの格納量が増加する。この格納量が上限を超えると、受信バッファＢｒ内にパケットを蓄積することができなくなるため、パケットが廃棄される。
【００３０】
そこで、中継サーバ１は、負荷分散装置の一例として、２つのＣＰＵの間でパケットの送受信処理の負荷を分散させる。なお、後述するように、中継サーバ１とは別に、中継サーバ１のＣＰＵの負荷を分散させる負荷分散装置が設けられてもよい。
【００３１】
中継サーバ１は、仮に、各ＣＰＵの使用率が均等になるように各ＣＰＵに処理を割り当てれば、使用率を指標として各ＣＰＵ間の負荷のバランスをとることができる。
【００３２】
しかし、例えばＤＰＤＫ適用ＯＶＳを用いると、各ＣＰＵは、各ポート８１０へのパケットの到着を監視するため、各ポート８１０に対しポーリングを行うことにより、その使用率が、見かけ上、ほぼ１００（％）となる。つまり、各ＣＰＵは、パケットの送受信処理を行ったときに余ったＣＰＵパワーの全てをポーリングに用いるため、常にＣＰＵパワーに余裕がない状態に見える。
【００３３】
したがって、ＣＰＵの負荷の指標として使用率を用いた場合、負荷分散を高精度に行うことは難しい。
【００３４】
また、中継サーバ１は、仮に、各ＣＰＵが送受信処理を分担するポート数を均等とすれば、ポート数を指標として各ＣＰＵ間の負荷のバランスをとることができる。しかし、各ポート８１０における送受信処理は、そのポート８１０の通信先のネットワークデバイスの種類、つまりＮＩＣ８２０やＶＭ８０（仮想ＮＩＣ８００）によって異なるため、送受信処理の負荷もポート８１０ごとに相違する。以下にポート８１０の送受信処理の例を挙げる。
【００３５】
図２は、ポート８１０の受信処理及び送信処理の一例を示すフローチャートである。本例では、ポート（＃３〜＃６）８１０によるＶＭ８０からのパケットの受信処理Ｒａと、ポート（＃３〜＃６）８１０から転送されたパケットのポート（＃１，＃２）８１０によるＮＩＣ８２０への送信処理Ｓａとを挙げる。なお、受信処理Ｒａには、以下のステップＳｔ５１〜Ｓｔ５８の各処理が含まれ、送信処理Ｓａには、以下のステップＳｔ５９〜Ｓｔ６２の各処理が含まれている。
【００３６】
ＶＭ８０側のポート（＃３〜＃６）８１０は、ＶＭ８０からのパケットを受信する（ステップＳｔ５１）。このとき、パケットは受信バッファＢｒに格納される。
【００３７】
次に、ポート８１０は、受信バッファＢｒ内のパケットの格納位置をチェックする（ステップＳｔ５２）。次に、ポート８１０は、パケットからバッファヘッダを削除する（ステップＳｔ５３）。次に、ポート８１０は、バッファアドレスをＶＭ８０のアドレスからホストＯＳ８２のアドレスに変換する（ステップＳｔ５４）。次に、ポート８１０は、変換後のバッファアドレスを取得する（ステップＳｔ５５）。
【００３８】
次に、ポート８１０は、受信バッファＢｒを確保する（ステップＳｔ５６）。次に、ポート８１０は、受信バッファＢｒからパケットを取り出し（ステップＳｔ５７）、ＮＩＣ８００側のポート（＃１，＃２）８１０に出力する（ステップＳｔ５８）。
【００３９】
ＮＩＣ８２０側のポート（＃１，＃２）８１０は、パケットが入力されると（ステップＳｔ５９）、送信バッファＢｓ内のパケットの格納位置をチェックする（ステップＳｔ６０）。次に、ポート８１０は、送信バッファＢｓにパケットを格納する（ステップＳｔ６１）。次に、ポート８１０は、パケットを送信する（ステップＳｔ６２）。このようにして、ポート８１０の受信処理及び送信処理は実行される。
【００４０】
図３は、ポート８１０の受信処理及び送信処理の他の例を示すフローチャートである。本例では、ポート（＃１，＃２）８１０によるＮＩＣ８２０からのパケットの受信処理Ｒｂと、ポート（＃１，＃２）８１０から転送されたパケットのポート（＃３〜＃６）８１０によるＶＭ８０への送信処理Ｓｂとを挙げる。なお、受信処理Ｒｂには、以下のステップＳｔ７１〜Ｓｔ７４の各処理が含まれ、送信処理Ｓｂには、以下のステップＳｔ７５〜Ｓｔ８２の各処理が含まれている。
【００４１】
ＮＩＣ８２０側のポート（＃１，＃２）８１０は、ＮＩＣ８２０からパケットを受信し（ステップＳｔ７１）、受信バッファＢｒ内のパケットの格納位置をチェックする（ステップＳｔ７２）。次に、ポート８１０は、受信バッファＢｒからパケットを取り出し（ステップＳｔ７３）、ＶＭ８０側のポート（＃３〜＃６）８１０に出力する（ステップＳｔ７４）。
【００４２】
次に、ＶＭ８０側のポート（＃３〜＃６）８１０は、パケットが入力されると（ステップＳｔ７５）、送信バッファＢｓ内のパケットの格納位置をチェックする（ステップＳｔ７６）。次に、ポート８１０は、送信バッファＢｓ内の空き容量をチェックする（ステップＳｔ７７）。
【００４３】
次に、ポート８１０は、バッファアドレスをホストＯＳ８２のアドレスからＶＭ８０のアドレスに変換する（ステップＳｔ７８）。次に、ポート８１０は、変換後のバッファアドレスを取得する（ステップＳｔ７９）。次に、ポート８１０は、パケットにバッファヘッダを付与する（ステップＳｔ８０）。
【００４４】
次に、ポート８１０は、送信バッファＢｓにパケットを格納し（ステップＳｔ８１）、ＶＭ８０に送信する（ステップＳｔ８２）。このようにして、ポート８１０の受信処理及び送信処理は実行される。
【００４５】
このように、各ポート８１０における送受信処理は、そのポート８１０の通信先のネットワークデバイスの種類によって異なるため、送受信処理の負荷もポート８１０ごとに相違する。このため、ＣＰＵの負荷の指標としてポート数を用いた場合、負荷分散を高精度に行うことは難しい。
【００４６】
そこで、中継サーバ１は、各ポート８１０のパケットの送受信処理の負荷を示す負荷値を保持しておき、各ＣＰＵへのポート８１０ごとの送受信処理の割り当て状態と負荷値から各ＣＰＵの負荷を算出し、その算出結果に基づいてＣＰＵ間で送受信処理の負荷を分散させる。このため、中継サーバ１は、使用率やポート数ではなく、ポート８１０ごとの負荷値に基づき正確に各ＣＰＵの負荷を算出することにより、パケットの送受信処理の負荷を高精度に分散させることができる。以下に中継サーバ１の構成について述べる。
【００４７】
図４は、中継サーバ１のハードウェア構成の一例を示す図である。中継サーバ１は、ＶＭ８０、仮想スイッチ８１、及びホストＯＳ８２を形成するためのＣＰＵ回路７と、負荷分散処理を行うＣＰＵ回路１０とを有する。
【００４８】
ＣＰＵ回路７には、ＣＰＵ（＃１）７０と、ＣＰＵ（＃２）７０と、キャッシュメモリ７２，７３と、メモリコントローラ７４と、メモリ７５と、ＩＯ（Input Output）バスコントローラ７６，７８と、ネットワークインターフェース（ＮＷ−ＩＦ）７７とが含まれる。ＣＰＵ（＃１）７０とＣＰＵ（＃２）７０は、プロセッサ（第１プロセッサ）の一例であり、メモリ７５に記憶されたプログラムに従って協働する。
【００４９】
ＣＰＵ（＃１）７０とＣＰＵ（＃２）７０には、ＶＭ８０、仮想スイッチ８１、及びホストＯＳ８２がプログラムにより形成される。ＣＰＵ（＃１）７０とＣＰＵ（＃２）７０は、ポート（＃１〜＃６）８１０のパケットの送受信処理をポート８１０ごとにそれぞれ分担する。また、ＣＰＵ（＃１）７０とＣＰＵ（＃２）７０には、一時的にデータを格納するためのキャッシュメモリ７２，７３がそれぞれ接続されている。
【００５０】
ＣＰＵ（＃１）７０、ＣＰＵ（＃２）７０、メモリコントローラ７４、及びＩＯバスコントローラ７６は、バス７９に接続されている。メモリコントローラ７４は、ＣＰＵ（＃１）７０及びＣＰＵ（＃２）７０からメモリ７５へのアクセスを制御する。また、ＩＯバスコントローラ７６は、ＣＰＵ（＃１）７０及びＣＰＵ（＃２）７０からＮＷ−ＩＦ７７へのアクセスを制御する。ＮＷ−ＩＦ７７には、例えばＮＩＣ８２０などが含まれる。
【００５１】
また、ＩＯバスコントローラ７８は、ＣＰＵ回路７，１０の間の通信を制御する。
【００５２】
ＣＰＵ回路１０は、ＣＰＵ（＃０）１１、ＲＯＭ（Read Only Memory）１２、ＲＡＭ（Random Access Memory）１３、及びＨＤＤ（Hard Disk Drive）などのストレージ１４を有する。ＣＰＵ（＃０）１１は、互いに信号の入出力ができるように、ＲＯＭ１２、ＲＡＭ１３、及びストレージ１４と、バス１５を介して接続されている。ＣＰＵ（＃０）１１は第２プロセッサの一例である。
【００５３】
ＲＯＭ１２は、ＣＰＵ（＃０）１１を駆動するプログラムが格納されている。ＲＡＭ１３は、ＣＰＵ１１のワーキングメモリとして機能する。ＣＰＵ（＃０）１１は、ＩＯバスコントローラ７８を介して、ＣＰＵ（＃１）７０、ＣＰＵ（＃２）７０、及びメモリ７５にアクセスする。
【００５４】
図５は、中継サーバ１の機能構成の一例を示す図である。中継サーバ１は、ＣＰＵ回路７の各ＣＰＵ７０を駆動するプログラムによりソフトウェアの機能として形成される仮想スイッチ８１と、ＣＰＵ回路１０のＣＰＵ１１を駆動するプログラムによりソフトウェアの機能として形成される負荷処理機能部１００とを有する。なお、負荷処理機能部１００は、ソフトウェアに限定されず、ＡＳＩＣ（Application Specified Integrated Circuit）やＦＰＧＡ（Field Programmable Gate Array）などの論理回路によりハードウェアの機能として構成されてもよい。
【００５５】
仮想スイッチ８１は、ポート（＃１〜＃５）８１０と、転送処理部８３と、フローテーブル８４とを有する。転送処理部８３は、ＮＩＣ８２０とＶＭ８０の間で各ポート８１０を介したパケットの転送処理を実行する。転送処理部８３は、ＣＰＵ（＃１）７０が生成したＰＭＤ（Pull Mode Driver）スレッド（＃１）８３０と、ＣＰＵ（＃２）７０が生成したＰＭＤスレッド（＃２）８３０とにより構成される。
【００５６】
ＰＭＤスレッド（＃１）８３０には、ＰＭＤスレッド（＃１）８３０によるパケットの送受信処理の対象のポート８１０を示すポートリスト（＃１）８３１が設けられている。また、ＰＭＤスレッド（＃２）８３０には、ＰＭＤスレッド（＃２）８３０によるパケットの送受信処理の対象のポート８１０を示すポートリスト（＃２）８３１が設けられている。
【００５７】
すなわち、ポートリスト８３１は、各ＣＰＵ７０が送受信処理を分担するポート８１０を示すポート情報の一例である。
【００５８】
図６には、ポートリスト（＃１）８３１及びポートリスト（＃２）８３１の一例が示されている。ポートリスト（＃１）８３１には、ＰＭＤスレッド（＃１）８３０が受信処理を実行するポート（＃１）８１０、ポート（＃３）８１０、及びポート（＃４）８１０と、各ポート８１０の処理フラグが登録されている。ポートリスト（＃２）８３１には、ＰＭＤスレッド（＃２）８３０が受信処理を実行するポート（＃２）８１０、ポート（＃５）８１０、及びポート（＃６）８１０と、各ポート８１０の処理フラグが登録されている。
【００５９】
各ＰＭＤスレッド８３０は、ポートリスト８３１に登録された各ポート８１０に順次にアクセスすることにより、そのポート８１０にパケットが到着したか否かを判定する。つまり、各ＰＭＤスレッド８３０は、ポートリスト８３１に登録された各ポート８１０をポーリングする。
【００６０】
各ＰＭＤスレッド８３０は、パケットが到着しているポート８１０を検出すると、そのポート８１０の処理フラグを「１」に更新し、到着したパケットの転送処理を実行する。転送処理には、上記の送信処理Ｓａ，Ｓｂ及び受信処理Ｒａ，Ｒｂが含まれる。各ＰＭＤスレッド８３０は、中継処理の終了後、該当ポート８１０の処理フラグを「０」に更新する。なお、各ポートリスト８３１に登録された複数のポート８１０のうち、１つのポート８１０の処理フラグだけが「１」を示し、他のポート８１０の処理フラグは「０」を示す。
【００６１】
再び図５を参照すると、転送処理部８３は、フローテーブル（フローＴＢＬ）８４からパケットの転送経路の始点及び終点の各ポート８１０を検索し、その検索結果に基づいてパケットの転送処理を実行する。なお、パケットの転送経路の始点は、ＶＭ８０またはＮＩＣ８２０からパケットを受信する受信ポート８１０であり、パケットの転送経路の始点は、ＶＭ８０またはＮＩＣ８２０にパケットを送信する送信ポート８１０である。
【００６２】
図６には、フローテーブル８４の一例が示されている。フローテーブル８４には、パケットの転送条件、転送先、パケット数、及びロス数が登録されている。転送条件には、転送対象のパケットの条件として、例えば、パケットに関するイベント、そのイベントが発生したポート８１０の識別番号（＃１〜＃６）、及びパケットのＶＩＤ（Virtual local area network Identifier）が登録されている。また、転送先には、パケットの転送先のポート８１０の識別番号が登録されている。
【００６３】
例えば、ポート（＃１）８１０で受信されたＶＩＤ＝２のパケットは、ポート（＃４）８１０に転送される。また、ポート（＃２）８１０で受信されたパケットは、ポート（＃３）８１０に転送される。
【００６４】
このように、パケットの転送条件及び転送先は、パケットのフローごとに、その転送経路の始点及び終点のポート８１０を示す。すなわち、パケットの転送条件及び転送先は、パケットの転送経路ごとの受信ポート８１０及び送信ポート８１０を示す経路情報の一例である。なお、受信ポート８１０及び送信ポート８１０は、それぞれ、第１ポート及び第２ポートの一例である。
【００６５】
また、パケット数は、パケットの転送経路により送受信されたパケットの数を示す。また、ロス数は、パケットの転送経路において損失したパケットの数を示す。
【００６６】
フローテーブル８４のうち、パケットの転送条件及び転送先は、予めユーザにより登録され、パケット数及びロス数は、後述するように、負荷処理機能部１００により登録される。
【００６７】
再び図５を参照すると、転送処理部８３は、上述したように、フローテーブル８４及び各ポートリスト８３１に従って各ポート８１０間のパケットの転送処理を行う。フローテーブル８４及び各ポートリスト８３１は、メモリ７５に格納されている。
【００６８】
また、負荷処理機能部１００は、パケットカウンタ部１０１、負荷算出部１０２、ポート割り当て部１０３、負荷値テーブル（負荷値ＴＢＬ）１０４、及び実行指示部１０５を有する。パケットカウンタ部１０１、負荷算出部１０２、ポート割り当て部１０３、及び実行指示部１０５は、ＣＰＵ１１の機能として形成される。なお、負荷処理機能部１００は、中継サーバ１から独立した負荷分散装置として構成されてもよい。この場合、負荷処理機能部１００は、中継サーバ１と通信することにより、中継サーバ１の各ＣＰＵ７０の負荷を分散する。
【００６９】
パケットカウンタ部１０１は、計数部の一例であり、各ポート８１０を介し送受信されるパケットを計数する。パケットカウンタ部１０１は、計数処理により得たパケット数をフローテーブル８４に登録する。
【００７０】
また、パケットカウンタ部１０１は、各ポート８１０を介し送受信されるパケットの損失を転送経路ごとに計数する。パケットカウンタ部１０１は、計数処理により得たロス数をフローテーブル８４に登録する。
【００７１】
実行指示部１０５は、パケットカウンタ部１０１にパケットの計数の開始を指示するとともに負荷算出部１０２に各ＣＰＵ７０の負荷の算出を指示する。実行指示部１０５は、例えばタイマに基づき周期的に指示を行ってもよいし、フローテーブル８４のロス数に基づきパケットのロスの検出に応じて指示を行ってもよい。
【００７２】
負荷算出部１０２は、実行指示部１０５の指示に従い各ＣＰＵ７０の負荷を算出する。負荷算出部１０２は、算出部の一例であり、各ＰＭＤスレッド８３０からポートリスト８３１を取得し、負荷値テーブル１０４の負荷値及びポート情報から各ＣＰＵ７０の送受信処理の負荷を算出する。
【００７３】
負荷値テーブル１０４には、各ポート８１０の送受信処理の負荷を示す負荷値が登録されている。負荷値テーブル１０４は、保持部の一例であるストレージ１４に保持されている。
【００７４】
図６には、負荷値テーブル１０４の一例が示されている。負荷値テーブル１０４には、ポート番号、受信負荷値Ｔｒ、及び送信負荷値Ｔｓが登録されている。受信負荷値Ｔｒ及び送信負荷値Ｔｓは、ユーザにより予め負荷値テーブル１０４に登録されている。
【００７５】
受信負荷値Ｔｒはパケットの受信処理の負荷を示し、送信負荷値Ｔｓはパケットの送信処理の負荷を示す。より具体的には、受信負荷値Ｔｒは、例えば１個のパケットの受信処理の所要時間を示し、送信負荷値Ｔｓは、例えば１個のパケットの送信処理の所要時間を示す。なお、本実施例において、パケット長による送信処理及び受信処理の所要時間の差分はないと仮定する。
【００７６】
負荷算出部１０２は、ポートリスト８３１から各ＣＰＵ７０が送受信処理を分担するポート８１０を判定し、ポート８１０ごとの受信負荷値Ｔｒ及び送信負荷値Ｔｓから各ＣＰＵ７０の負荷を算出する。
【００７７】
再び図５を参照すると、ポート割り当て部１０３は、分散処理部の一例であり、負荷算出部１０２の算出結果に基づいて各ＣＰＵ７０の間でパケットの送受信処理の負荷を分散させる。このため、中継サーバ１は、使用率やポート数ではなく、ポート８１０ごとの負荷値に基づき正確に各ＣＰＵの負荷を算出することにより、パケットの送受信処理の負荷を高精度に分散させることができる。
【００７８】
より具体的には、ポート割り当て部１０３は、各ＣＰＵ７０に対するポート８１０の割り当てを決定し、その割り当てに従い各ポートリスト８３１を更新する。ポート割り当て部１０３は、例えば、負荷の高いＣＰＵ７０が送受信処理を分担するポート８１０のうち、受信負荷値Ｔｒと送信負荷値Ｔｓから算出される負荷値が最も低いポート８１０を、負荷の低いＣＰＵ７０に割り当てる。
【００７９】
ポート割り当て部１０３は、各ＣＰＵ７０の間の負荷の大小関係が逆転するまで、上記のポート８１０の割り当てを繰り返す。このため、ポート割り当て部１０３は、複雑な計算を行うことなく、各ＣＰＵ７０の間でパケットの送受信処理の負荷を分散させることができる。
【００８０】
なお、ＣＰＵ７０の数が３つ以上である場合、ポート割り当て部１０３は、全ての２つのＣＰＵ７０の組み合わせを選択し、各組み合わせについて上記の負荷分散処理を実行する。また、ポート割り当て部１０３は、上記の負荷分散処理に限定されず、例えば各ＣＰＵ７０の間の負荷の差分が所定値以下となるまでの上記のポート８１０の割り当てを繰り返してもよい。
【００８１】
次に、負荷算出部１０２による負荷の算出手法を説明する。以下の算出例（１）〜（３）では、図６に示されたポートリスト８３１及びフローテーブル８４が用いられる。
【００８２】
図７は、図６に示されたポートリスト８３１及びフローテーブル８４に基づく仮想スイッチ８１の転送経路の一例を示す図である。仮想スイッチ８１の転送経路は符号ＲｔＸ−Ｙ（Ｘ，Ｙ＝１，２，・・・，６）で示されている。例えば、ポート（＃３）８１０からポート（＃１）８１０へのパケットの転送経路は符号Ｒｔ３−１で示され、ポート（＃１）８１０からポート（＃４）８１０へのパケットの転送経路は符号Ｒｔ１−４で示される。
【００８３】
（算出例（１））
本例において、各ＣＰＵ７０は、自己のポートリスト８３１が示すポート８１０の受信処理と、そのポート８１０で受信したパケットの転送先のポート８１０の送信処理とを分担する。つまり、各ＣＰＵ７０は、ポートリスト８３１上で割り当てられたＣＰＵ７０の受信ポート８１０の受信処理と、その受信ポート８１０を始点とする転送経路の転送先の送信ポート８１０の送信処理とを分担する。
【００８４】
このため、各ＣＰＵ７０は、受信ポート８１０を始点するパケットの転送経路ごとにその転送処理を分担することができる。したがって、例えば転送経路の数が多い場合、パケットの送受信処理の分担するＣＰＵ７０を決定する際、利便性が向上する。
【００８５】
図７において、ＣＰＵ（＃１）７０には、点線枠（「ＣＰＵ＃１」参照）で示されるように、ポートリスト（＃１）８３１に従いポート（＃１，＃３，＃４）８１０が割り当てられている。このポート（＃１，＃３，＃４）８１０を始点とする転送経路は、フローテーブル８４から転送経路Ｒｔ１−４，Ｒｔ１−５，Ｒｔ１−６，Ｒｔ３−１，Ｒｔ４−２と判定される。このため、ＣＰＵ（＃１）７０は、ポート（＃１，＃３，＃４）８１０の受信処理と、ポート（＃１，＃２，＃４〜＃６）８１０の送信処理とを分担する。
【００８６】
また、ＣＰＵ（＃２）７０には、点線枠（「ＣＰＵ＃２」参照）で示されるように、ポートリスト（＃２）８３１に従いポート（＃２，＃５，＃６）８１０が割り当てられている。このポート（＃２，＃５，＃６）８１０を始点とする転送経路は、フローテーブル８４から転送経路Ｒｔ２−３，Ｒｔ５−２，Ｒｔ６−２と判定される。このため、ＣＰＵ（＃２）７０は、ポート（＃２，＃５，＃６）８１０の受信処理と、ポート（＃２，＃３）８１０の送信処理とを分担する。
【００８７】
負荷算出部１０２は、フローテーブル８４を取得し、フローテーブル８４と各ＣＰＵ７０のポートリスト８３１から、各ＣＰＵ７０が受信処理を分担する受信ポート８１０の受信負荷値Ｔｒとび送信ポート８１０の送信負荷値Ｔｓの合計を算出する。より具体的には、負荷算出部１０２は、ＣＰＵ７０に割り当てられている受信ポート８１０の受信負荷値Ｔｒと、その受信ポート８１０からのパケットの転送先の送信ポート８１０の送信負荷値Ｔｓとの合計を算出する。
【００８８】
例えば、転送経路Ｒｔ３−１のパケットの送受信処理の負荷は、受信ポート（＃３）８１０の受信負荷値Ｔｒが５であり、そのパケットの転送先である送信ポート（＃１）８１０の送信負荷値Ｔｓが５であるため、１０（＝５＋５）となる。また、転送経路Ｒｔ１−４のパケットの送受信処理の負荷は、受信ポート（＃１）８１０の受信負荷値Ｔｒが５であり、そのパケットの転送先である送信ポート（＃４）８１０の送信負荷値Ｔｓが２０であるため、２５（＝５＋２０）となる。
【００８９】
負荷算出部１０２は、ＣＰＵ７０ごとに、その割り当てられている受信ポート８１０を始点とする全ての転送経路についてパケットの送受信処理の負荷を算出する。
【００９０】
【数１】
2018181155.tif 000003
【００９１】
より具体的には、負荷算出部１０２は、上記の式（１）からＣＰＵ７０ごとのパケットの送受信処理の負荷を算出する。式（１）において、Ｔｒ（ｉ）は、ＣＰＵ７０に割り当てられている受信ポート（＃ｉ）（ｉ：正の整数）８１０の受信負荷値Ｔｒであり、Ｔｓ（ｊ）は、その受信ポート（＃ｉ）のパケットの転送先である送信ポート（＃ｊ）（ｊ：正の整数）８１０の送信負荷値Ｔｓである。
【００９２】
Ｌ１＝（１＋２０）＋（１＋２０）＋（１＋２０）＋（５＋５）＋（５＋５）
＝８３       ・・・（２）
【００９３】
したがって、負荷算出部１０２は、上記の式（２）に示されるように、ＣＰＵ（＃１）７０の負荷Ｌ１を式（１）に基づいて転送経路Ｒｔ１−４，Ｒｔ１−５，Ｒｔ１−６，Ｒｔ３−１，Ｒｔ４−２についてのパケットの送受信処理の負荷の合計から算出する。なお、式（２）の各括弧内には、転送経路ごとの受信負荷値Ｔｒと送信負荷値Ｔｓの加算式が記載されている。
【００９４】
Ｌ２＝（５＋２０）＋（５＋５）＋（５＋５）＝４５  ・・・（３）
【００９５】
また、負荷算出部１０２は、上記の式（３）に示されるように、ＣＰＵ（＃２）７０の負荷Ｌ２を式（１）に基づいて転送経路Ｒｔ２−３，Ｒｔ５−２，Ｒｔ６−２についてのパケットの送受信処理の負荷の合計から算出する。なお、式（３）の各括弧内には、転送経路ごとの受信負荷値Ｔｒと送信負荷値Ｔｓの加算式が記載されている。
【００９６】
本例において、ポート割り当て部１０３は、ＣＰＵ（＃１）７０の負荷Ｌ１とＣＰＵ（＃２）７０の負荷Ｌ２を比較し、ＣＰＵ（＃１）７０の負荷がＣＰＵ（＃２）７０の負荷Ｌ２より高いと判定する。このため、ポート割り当て部１０３は、負荷の高いＣＰＵ（＃１）７０に割り当てられたポート（＃１〜＃３）８１０のうち、最も小さい負荷値（５＋５＝１０）であるポート（＃３，＃４）８１０を負荷の低いＣＰＵ（＃２）８１０に割り当てる。このとき、ポート割り当て部１０３は、各ポートリスト８３１を更新する。
【００９７】
これにより、ＣＰＵ（＃１）７０の負荷Ｌ１は６３（＝８３−１０−１０）となり、ＣＰＵ（＃２）７０の負荷Ｌ２は６５（＝４５＋１０＋１０）となるため、各ＣＰＵ７０の間の負荷の大小関係が逆転する。このようにして、ポート割り当て部１０３は、負荷分散処理を実行する。
【００９８】
（算出例（２））
本例において、負荷算出部１０２は、算出例（１）の算出手法において、パケットカウンタ部１０１により取得されるパケット数を用いる。パケットカウンタ部１０１は、実行指示部１０５からの指示を受けるとパケットの計数を開始する。
【００９９】
負荷算出部１０２は、実行指示部１０５からの指示を受けた後、タイマにより所定時間を計時した後にフローテーブル８４から転送経路ごとのパケット数を取得する。負荷算出部１０２は、各転送経路の受信負荷値Ｔｒと送信負荷値Ｔｓの合計に該当パケット数を乗ずることにより、各ＣＰＵ７０の負荷を算出する。
【０１００】
【数２】
2018181155.tif 000004
【０１０１】
より具体的には、負荷算出部１０２は、上記の式（４）からＣＰＵ７０ごとのパケットの送受信処理の負荷を算出する。式（４）において、Ｎ（ｉ，ｊ）は、受信ポート（＃ｉ）８１０から送信ポート（＃ｊ）８１０に転送されるパケット数を示す。
【０１０２】
Ｌ１＝（１＋２０）×１０００＋（１＋２０）×１０００＋（１＋２０）×１０００
＋（５＋５）×１０００＋（５＋５）×１０００
＝８３０００      ・・・（５）
【０１０３】
したがって、負荷算出部１０２は、上記の式（２）に示されるように、ＣＰＵ（＃１）７０の負荷Ｌ１を式（５）に基づいて各転送経路Ｒｔ１−４，Ｒｔ１−５，Ｒｔ１−６，Ｒｔ３−１，Ｒｔ４−２についてのパケットの受信負荷値Ｔｒ及び送信負荷値Ｔｓの和とパケット数（一例として１０００とする。）の積の合計から算出する。なお、式（５）の各括弧内には、転送経路ごとの受信負荷値Ｔｒと送信負荷値Ｔｓの加算式が記載されている。
【０１０４】
Ｌ２＝（５＋２０）×１０００＋（５＋５）×１０００＋（５＋５）×１０００
＝４５０００      ・・・（６）
【０１０５】
また、負荷算出部１０２は、上記の式（６）に示されるように、ＣＰＵ（＃２）７０の負荷Ｌ２を式（５）に基づいて転送経路Ｒｔ２−３，Ｒｔ５−２，Ｒｔ６−２についてのパケットの受信負荷値Ｔｒ及び送信負荷値Ｔｓの和とパケット数（一例として１０００とする。）の積の合計から算出する。なお、式（６）の各括弧内には、転送経路ごとの受信負荷値Ｔｒと送信負荷値Ｔｓの加算式が記載されている。
【０１０６】
このように、負荷算出部１０２は、負荷値、ポートリスト８３１、及びパケットカウンタ部１０１が計数したパケット数から各ＣＰＵ７０の送受信処理の負荷を算出する。このため、負荷算出部１０２は、転送経路ごとのパケット数に応じて高精度に各ＣＰＵ７０の負荷を算出することができる。したがって。負荷分散処理の精度も向上する。
【０１０７】
（算出例（３））
本例において、各ＣＰＵ７０は、ポートリスト８３１に基づき割り当てられた各ポート８１０の送信処理及び受信処理を分担する。このため、ポート割り当て部１０３は、１つの中継処理を２つのＣＰＵ７０に分担させることができる。
【０１０８】
負荷算出部１０２は、各ポートリスト８３１から、各ＣＰＵ７０が送受信処理を分担する１以上のポート８１０の受信負荷値Ｔｒ及び送信負荷値Ｔｓの合計を算出する。より具体的には、負荷算出部１０２は、各ＣＰＵ７０について、ポートリスト８３１に登録された各ポート８１０の受信負荷値Ｔｒ及び送信負荷値Ｔｓの合計を算出する。
【０１０９】
【数３】
2018181155.tif 000005
【０１１０】
より具体的には、負荷算出部１０２は、上記の式（７）からＣＰＵ７０ごとの負荷を算出する。
【０１１１】
さらに、負荷算出部１０２は、算出例（２）の算出手法と同様に、パケットカウンタ部１０１により取得されるパケット数を用いてもよい。この場合、負荷算出部１０２は、割り当てられた各ポート８１０について、受信したパケット数と受信負荷値Ｔｒの積と、送信したパケット数と送信負荷値Ｔｓの積の和を合計を算出することにより、各ＣＰＵ７０の負荷を算出する。
【０１１２】
【数４】
2018181155.tif 000006
【０１１３】
より具体的には、負荷算出部１０２は、上記の式（８）からＣＰＵ７０ごとの負荷を算出する。式（８）において、Ｎｒは、ＣＰＵ７０に割り当てられたポート（＃ｉ）８１０で受信されたパケット数（以下、「受信パケット数」と表記）を示す。また、Ｎｓは、ＣＰＵ７０に割り当てられたポート（＃ｉ）８１０から送信されたパケット数（以下、「送信パケット数」と表記）を示す。負荷算出部１０２は、パケット数Ｎｒ，Ｎｓをフローテーブル８４から取得する。
【０１１４】
以下に、転送経路Ｒｔ３−１，Ｒｔ４−２，Ｒｔ５−２，Ｒｔ６−２により転送されるパケット数を５００とし、他の転送経路により転送されるパケット数を１０００とした場合の各ＣＰＵ７０の負荷Ｌ１，Ｌ２の算出例を示す。
【０１１５】
Ｌ１＝１×（１０００×３）＋５×５００ ［ポート（＃１）８１０の負荷］
＋５×５００＋５×１０００  ［ポート（＃３）８１０の負荷］
＋５×５００＋２０×１０００  ［ポート（＃４）８１０の負荷］
＝３５５００      ・・・（９）
【０１１６】
負荷算出部１０２は、上記の式（９）に示されるように、式（８）に基づいて、ポート（＃１，＃３，＃４）８１０の受信負荷値Ｔｒ及び受信パケット数Ｎｒの積と送信負荷値Ｔｓ及び送信パケット数Ｎｓの積の和を合計することによりＣＰＵ（＃１）７０の負荷Ｌ１を算出する。
【０１１７】
Ｌ２＝５×１０００＋５×（５００×３） ［ポート（＃２）８１０の負荷］
＋５×５００＋２０×１０００  ［ポート（＃５）８１０の負荷］
＋５×５００＋２０×１０００  ［ポート（＃６）８１０の負荷］
＝５７５００      ・・・（１０）
【０１１８】
このように、負荷算出部１０２は、各ＣＰＵ７０の間のパケットの送信処理の分担の形態に応じて、ポート８１０ごとの負荷値から各ＣＰＵ７０の負荷を算出することができる。
【０１１９】
次に、上記の算出例（１）〜（３）の算出手法に基づく負荷分散処理の例を説明する。
【０１２０】
（第１実施例）
図８及び図９は、負荷分散処理の第１実施例を示す図である。本実施例において、負荷算出部１０２は、算出例（１）の算出手法により各ＣＰＵ７０の負荷を算出する。
【０１２１】
図８及び図９において、点線枠内には、その引き出し元のポート８１０の受信負荷値Ｔｒ及び送信負荷値Ｔｓの少なくとも一方が示されている。また、図示は省略するが、以降の説明では、受信ポート（＃ｉ）８１０と送信ポート（＃ｊ）８１０の間の転送経路を「Ｒｔ（ｉ）−（ｊ）」と表記する。
【０１２２】
図８において、符号Ｇ１は負荷分散前のポート８１０の割り当て状態及び各ＣＰＵ７０の負荷を示す。ＣＰＵ（＃１）７０には、ポートリスト（＃１）８３１に従いポート（＃１，＃３，＃４）８１０が割り当てられ、ＣＰＵ（＃２）７０には、ポートリスト（＃２）８３１に従いポート（＃２，＃５，＃６）８１０が割り当てられている。また、仮想スイッチ８１には、フローテーブル８４に従い転送経路Ｒｔ１−４，Ｒｔ１−６，Ｒｔ４−２，Ｒｔ６−２が設けられている。
【０１２３】
ＣＰＵ（＃１）７０の負荷は、受信ポート（＃１，＃４）８１０の転送経路Ｒｔ１−４，Ｒｔ１−６，Ｒｔ４−２について式（１）を用いることにより５２となる。また、ＣＰＵ（＃２）７０の負荷は、受信ポート（＃６）８１０の転送経路Ｒｔ６−２について式（１）を用いることにより１０となる。このため、ポート割り当て部１０３は、ＣＰＵ（＃１）７０の負荷がＣＰＵ（＃２）７０の負荷より高いと判定する。
【０１２４】
ポート割り当て部１０３は、負荷が高いＣＰＵ（＃１）７０に割り当てられたポート８１０のうち、負荷が最も低いポート８１０を検出する。本例では、ポート（＃４）８１０の負荷は１０（＝５＋５）であり、ポート（＃１）８１０の負荷は４２（＝１＋２０＋１＋２０）である。このため、ポート割り当て部１０３は、ポート（＃４）８１０を最も負荷の低いポート８１０として検出する。
【０１２５】
したがって、ポート割り当て部１０３は、ポート（＃４）８１０の割り当てをＣＰＵ（＃１）７０からＣＰＵ（＃２）７０に変更する。このとき、ポート割り当て部１０３は、ポートリスト（＃２）８３１からポート（＃４）８１を削除し、ポートリスト（＃１）８３１に追加する。これにより、各ＣＰＵ７０の間で負荷が分散される。
【０１２６】
図８において、符号Ｇ２は負荷分散後のポート８１０の割り当て状態及び各ＣＰＵ７０の負荷を示す。ＣＰＵ（＃１）７０には、ポートリスト（＃１）８３１に従いポート（＃１，＃３）８１０が割り当てられ、ＣＰＵ（＃２）７０には、ポートリスト（＃２）８３１に従いポート（＃２，＃４，＃５，＃６）８１０が割り当てられている。
【０１２７】
ＣＰＵ（＃１）７０の負荷は、受信ポート（＃１）８１０の転送経路Ｒｔ１−４，Ｒｔ１−６について式（１）を用いることにより４２となる。また、ＣＰＵ（＃２）７０の負荷は、受信ポート（＃２，＃４，＃６）８１０の転送経路Ｒｔ６−２，Ｒｔ４−２について式（１）を用いることにより２０となる。
【０１２８】
このように、各ＣＰＵ７０の間の負荷の差分は、負荷分散前、４２（＝５２−１０）であったが、負荷分散後、２２（＝４２−２０）に低減される。この後、フローテーブル８４に新たな転送経路の設定が追加され、さらに負荷分散処理が実行される。
【０１２９】
図９において、符号Ｇ３は負荷分散前のポート８１０の割り当て状態及び各ＣＰＵ７０の負荷を示す。仮想スイッチ８１には、転送経路Ｒｔ２−３，Ｒｔ３−１が追加されている。
【０１３０】
ＣＰＵ（＃１）７０の負荷は、受信ポート（＃１，＃３）８１０の転送経路Ｒｔ１−４，Ｒｔ１−６，Ｒｔ３−１について式（１）を用いることにより５２となる。また、ＣＰＵ（＃２）７０の負荷は、受信ポート（＃２，＃４，＃６）８１０の転送経路Ｒｔ６−２，Ｒｔ４−２，Ｒｔ２−３について式（１）を用いることにより４１となる。このため、ポート割り当て部１０３は、ＣＰＵ（＃１）７０の負荷がＣＰＵ（＃２）７０の負荷より高いと判定する。
【０１３１】
ポート割り当て部１０３は、負荷が高いＣＰＵ（＃１）７０に割り当てられたポート８１０のうち、負荷が最も低いポート８１０を検出する。本例では、ポート（＃３）８１０の負荷は１０（＝５＋５）であり、ポート（＃１）８１０の負荷は４２（＝１＋２０＋１＋２０）である。このため、ポート割り当て部１０３は、ポート（＃３）８１０を最も負荷の低いポート８１０として検出する。
【０１３２】
したがって、ポート割り当て部１０３は、ポート（＃３）８１０の割り当てをＣＰＵ（＃１）７０からＣＰＵ（＃２）７０に変更する。このとき、ポート割り当て部１０３は、ポートリスト（＃２）８３１からポート（＃３）８１０を削除し、ポートリスト（＃１）８３１に追加する。これにより、各ＣＰＵ７０の間で負荷が分散される。
【０１３３】
図９において、符号Ｇ４は負荷分散後のポート８１０の割り当て状態及び各ＣＰＵ７０の負荷を示す。ＣＰＵ（＃１）７０の負荷は、受信ポート（＃１）８１０の転送経路Ｒｔ１−４，Ｒｔ１−６について式（１）を用いることにより４２となる。また、ＣＰＵ（＃２）７０の負荷は、受信ポート（＃２〜＃４，＃６）８１０の転送経路Ｒｔ６−２，Ｒｔ４−２，Ｒｔ２−３，Ｒｔ３−１について式（１）を用いることにより５１となる。ポート割り当て部１０３は、ＣＰＵ７０の間の負荷の大小関係が逆転したため、負荷分散処理を終了する。
【０１３４】
このように、各ＣＰＵ７０の間の負荷の差分は、負荷分散前、１１（＝５２−４１）であったが、負荷分散後、９（＝５１−４２）に低減される。
【０１３５】
（第２実施例）
図１０及び図１１は、負荷分散処理の第２実施例を示す図である。本実施例において、負荷算出部１０２は、算出例（２）の算出手法により各ＣＰＵ７０の負荷を算出する。図１０及び図１１において、ポート８１０から引き出された点線枠内には、その引き出し元のポート８１０の受信負荷値Ｔｒ及び送信負荷値Ｔｓの少なくとも一方が示されている。また、転送経路の矢印から引き出された点線枠内には、その引き出し元の転送経路に沿って転送されるパケット数Ｎが示されている。
【０１３６】
図１０において、符号Ｇ１１は負荷分散前のポート８１０の割り当て状態及び各ＣＰＵ７０の負荷を示す。ＣＰＵ（＃１）７０には、ポートリスト（＃１）８３１に従いポート（＃１，＃３，＃４）８１０が割り当てられ、ＣＰＵ（＃２）７０には、ポートリスト（＃２）８３１に従いポート（＃２，＃５，＃６）８１０が割り当てられている。また、仮想スイッチ８１には、フローテーブル８４に従い転送経路Ｒｔ１−４，Ｒｔ１−６，Ｒｔ４−２，Ｒｔ６−２が設けられている。
【０１３７】
ＣＰＵ（＃１）７０の負荷は、受信ポート（＃１，＃４）８１０の転送経路Ｒｔ１−４，Ｒｔ１−６，Ｒｔ４−２について式（４）を用いることにより９４０となる。また、ＣＰＵ（＃２）７０の負荷は、受信ポート（＃６）８１０の転送経路Ｒｔ６−２について式（４）を用いることにより３００となる。このため、ポート割り当て部１０３は、ＣＰＵ（＃１）７０の負荷がＣＰＵ（＃２）７０の負荷より高いと判定する。
【０１３８】
ポート割り当て部１０３は、負荷が高いＣＰＵ（＃１）７０に割り当てられたポート８１０のうち、負荷が最も低いポート８１０を検出する。本例では、ポート（＃４）８１０の負荷は１００（＝（５＋５）×１０）であり、ポート（＃１）８１０の負荷は８４０（＝（１＋２０）×１０＋（１＋２０）×３０）である。このため、ポート割り当て部１０３は、ポート（＃４）８１０を最も負荷の低いポート８１０として検出する。
【０１３９】
したがって、ポート割り当て部１０３は、ポート（＃４）８１０の割り当てをＣＰＵ（＃１）７０からＣＰＵ（＃２）７０に変更する。このとき、ポート割り当て部１０３は、ポートリスト（＃１）８３１からポート（＃４）８１０を削除し、ポートリスト（＃２）８３１に追加する。これにより、各ＣＰＵ７０の間で負荷が分散される。
【０１４０】
図１０において、符号Ｇ１２は負荷分散後のポート８１０の割り当て状態及び各ＣＰＵ７０の負荷を示す。ＣＰＵ（＃１）７０には、ポートリスト（＃１）８３１に従いポート（＃１，＃３）８１０が割り当てられ、ＣＰＵ（＃２）７０には、ポートリスト（＃２）８３１に従いポート（＃２，＃４〜＃６）８１０が割り当てられている。
【０１４１】
ＣＰＵ（＃１）７０の負荷は、受信ポート（＃１）８１０の転送経路Ｒｔ１−４，Ｒｔ１−６について式（４）を用いることにより８４０となる。また、ＣＰＵ（＃２）７０の負荷は、受信ポート（＃２，＃４，＃６）８１０の転送経路Ｒｔ６−２，Ｒｔ４−２について式（４）を用いることにより４００となる。
【０１４２】
このように、各ＣＰＵ７０の間の負荷の差分は、負荷分散前、６４０（＝９４０−３００）であったが、負荷分散後、４４０（＝８４０−４００）に低減される。この後、フローテーブル８４に新たな転送経路の設定が追加され、さらに負荷分散処理が実行される。
【０１４３】
図１１において、符号Ｇ１３は負荷分散前のポート８１０の割り当て状態及び各ＣＰＵ７０の負荷を示す。仮想スイッチ８１には、転送経路Ｒｔ２−５，Ｒｔ５−１が追加されている。
【０１４４】
ＣＰＵ（＃１）７０の負荷は、受信ポート（＃１，＃３）８１０の転送経路Ｒｔ１−４，Ｒｔ１−６について式（４）を用いることにより８４０となる。また、ＣＰＵ（＃２）７０の負荷は、受信ポート（＃２，＃４〜＃６）８１０の転送経路Ｒｔ６−２，Ｒｔ４−２，Ｒｔ２−５，Ｒｔ５−１について式（４）を用いることにより１２３０となる。このため、ポート割り当て部１０３は、ＣＰＵ（＃２）７０の負荷がＣＰＵ（＃１）７０の負荷より高いと判定する。
【０１４５】
ポート割り当て部１０３は、負荷が高いＣＰＵ（＃２）７０に割り当てられたポート８１０のうち、負荷が最も低いポート８１０を検出する。本例では、ポート（＃２）の負荷は６３０（＝（１＋２０）×３０）であり、ポート（＃４）８１０の負荷は１００（＝（５＋５）×１０）である。また、ポート（＃５）８１０の負荷は２００（＝（５＋５）×２０）であり、ポート（＃６）８１０の負荷は３００（＝（５＋５）×３０）である。このため、ポート割り当て部１０３は、最も負荷の低いポート８１０として、最初にポート（＃４）８１０を検出し、次にポート（＃５）８１０を検出する。
【０１４６】
したがって、ポート割り当て部１０３は、ポート（＃４，＃５）８１０の割り当てを順次にＣＰＵ（＃１）７０からＣＰＵ（＃２）７０に変更する。このとき、ポート割り当て部１０３は、ポートリスト（＃２）８３１からポート（＃４，＃５）８１０を削除し、ポートリスト（＃４，＃５）８３１に追加する。これにより、各ＣＰＵ７０の間で負荷が分散される。
【０１４７】
図１１において、符号Ｇ１４は負荷分散後のポート８１０の割り当て状態及び各ＣＰＵ７０の負荷を示す。ＣＰＵ（＃１）７０の負荷は、受信ポート（＃１，＃３〜＃５）８１０の転送経路Ｒｔ１−４，Ｒｔ１−６，Ｒｔ４−２，Ｒｔ５−１について式（４）を用いることにより１１４０となる。また、ＣＰＵ（＃２）７０の負荷は、受信ポート（＃２，＃６）８１０の転送経路Ｒｔ６−２，Ｒｔ２−５について式（４）を用いることにより９３０となる。ポート割り当て部１０３は、ＣＰＵ７０の間の負荷の大小関係が逆転したため、負荷分散処理を終了する。
【０１４８】
このように、各ＣＰＵ７０の間の負荷の差分は、負荷分散前、３９０（＝１２３０−８４０）であったが、負荷分散後、２１０（＝１１４０−９３０）に低減される。
【０１４９】
（第３実施例）
図１２及び図１３は、負荷分散処理の第３実施例を示す図である。本実施例において、負荷算出部１０２は、算出例（３）の算出手法により各ＣＰＵ７０の負荷を算出する。なお、本実施例において、負荷算出部１０２は、パケット数を用いた式（８）を用いて負荷を算出するが、式（７）を用いた場合の負荷は、以下の算出例で各転送経路のパケット数を１とすることにより得られる。
【０１５０】
図１２及び図１３において、ポート８１０から引き出された点線枠内には、その引き出し元のポート８１０の受信負荷値Ｔｒ及び送信負荷値Ｔｓの少なくとも一方が示されている。また、転送経路の矢印から引き出された点線枠内には、その引き出し元の転送経路に沿って転送されるパケット数Ｎ（Ｎｒ，Ｎｓ）が示されている。
【０１５１】
図１２において、符号Ｇ２１は負荷分散前のポート８１０の割り当て状態及び各ＣＰＵ７０の負荷を示す。ＣＰＵ（＃１）７０には、ポートリスト（＃１）８３１に従いポート（＃１，＃３，＃４）８１０が割り当てられ、ＣＰＵ（＃２）７０には、ポートリスト（＃２）８３１に従いポート（＃２，＃５，＃６）８１０が割り当てられている。また、仮想スイッチ８１には、フローテーブル８４に従い転送経路Ｒｔ１−４，Ｒｔ１−６，Ｒｔ４−２，Ｒｔ６−２が設けられている。
【０１５２】
ＣＰＵ（＃１）７０の負荷は、ポート（＃１，＃４）８１０について式（８）を用いることにより２９０となる。また、ＣＰＵ（＃２）７０の負荷は、ポート（＃２，＃６）８１０について式（８）を用いることにより９５０となる。このため、ポート割り当て部１０３は、ＣＰＵ（＃２）７０の負荷がＣＰＵ（＃１）７０の負荷より高いと判定する。
【０１５３】
ポート割り当て部１０３は、負荷が高いＣＰＵ（＃２）７０に割り当てられたポート８１０のうち、負荷が最も低いポート８１０を検出する。本例では、ポート（＃２）の負荷は２００（＝５×（１０＋３０））であり、ポート（＃６）８１０の負荷は７５０（＝２０×３０＋５×３０）である。このため、ポート割り当て部１０３は、最も負荷の低いポート８１０としてポート（＃２）８１０を検出する。
【０１５４】
したがって、ポート割り当て部１０３は、ポート（＃２）８１０の割り当てをＣＰＵ（＃２）７０からＣＰＵ（＃１）７０に変更する。このとき、ポート割り当て部１０３は、ポートリスト（＃２）８３１からポート（＃２）８１０を削除し、ポートリスト（＃１）８３１に追加する。これにより、各ＣＰＵ７０の間で負荷が分散される。
【０１５５】
図１２において、符号Ｇ２２は負荷分散後のポート８１０の割り当て状態及び各ＣＰＵ７０の負荷を示す。ＣＰＵ（＃１）７０には、ポートリスト（＃１）８３１に従いポート（＃１〜＃４）８１０が割り当てられ、ＣＰＵ（＃２）７０には、ポートリスト（＃２）８３１に従いポート（＃５，＃６）８１０が割り当てられている。
【０１５６】
ＣＰＵ（＃１）７０の負荷は、ポート（＃１〜＃４）８１０について式（８）を用いることにより４９０となる。また、ＣＰＵ（＃２）７０の負荷は、ポート（＃５，＃６）８１０について式（８）を用いることにより７５０となる。
【０１５７】
このように、各ＣＰＵ７０の間の負荷の差分は、負荷分散前、６６０（＝９５０−２９００）であったが、負荷分散後、２６０（＝７５０−４９０）に低減される。この後、フローテーブル８４に新たな転送経路の設定が追加され、さらに負荷分散処理が実行される。
【０１５８】
図１３において、符号Ｇ２３は負荷分散前のポート８１０の割り当て状態及び各ＣＰＵ７０の負荷を示す。仮想スイッチ８１には、転送経路Ｒｔ２−５，Ｒｔ５−１が追加されている。
【０１５９】
ＣＰＵ（＃１）７０の負荷は、ポート（＃１，＃２，＃４）８１０について式（８）を用いることにより５５０となる。また、ＣＰＵ（＃２）７０の負荷は、ポート（＃５，＃６）８１０について式（８）を用いることにより１０００となる。このため、ポート割り当て部１０３は、ＣＰＵ（＃２）７０の負荷がＣＰＵ（＃１）７０の負荷より高いと判定する。
【０１６０】
ポート割り当て部１０３は、負荷が高いＣＰＵ（＃２）７０に割り当てられたポート８１０のうち、負荷が最も低いポート８１０を検出する。本例では、ポート（＃５）の負荷は２５０（＝（５＋２０）×１０）であり、ポート（＃６）８１０の負荷は７５０（＝２０×３０＋５×３０）である。このため、ポート割り当て部１０３は、最も負荷の低いポート８１０として、ポート（＃５）８１０を検出する。
【０１６１】
したがって、ポート割り当て部１０３は、ポート（＃５）８１０の割り当てをＣＰＵ（＃２）７０からＣＰＵ（＃１）７０に変更する。このとき、ポート割り当て部１０３は、ポートリスト（＃２）８３１からポート（＃５）８１０を削除し、ポートリスト（＃１）８３１に追加する。これにより、各ＣＰＵ７０の間で負荷が分散される。
【０１６２】
図１３において、符号Ｇ２４は負荷分散後のポート８１０の割り当て状態及び各ＣＰＵ７０の負荷を示す。ＣＰＵ（＃１）７０の負荷は、ポート（＃１，＃２，＃４，＃５）８１０について式（８）を用いることにより８００となる。また、ＣＰＵ（＃２）７０の負荷は、ポート（＃６）８１０について式（８）を用いることにより７５０となる。ポート割り当て部１０３は、ＣＰＵ７０の間の負荷の大小関係が逆転したため、負荷分散処理を終了する。
【０１６３】
このように、各ＣＰＵ７０の間の負荷の差分は、負荷分散前、４５０（＝１０００−５５０）であったが、負荷分散後、５０（＝８００−７５０）に低減される。
【０１６４】
次に、負荷処理機能部１００の処理について述べる。
【０１６５】
図１４は、負荷処理機能部１００の処理の一例を示すフローチャートである。なお、本処理は負荷分散方法の一例である。
【０１６６】
実行指示部１０５は、監視タイマなどによりＣＰＵ７０の負荷の算出周期が到来したか否かを判定する（ステップＳｔ１）。実行指示部１０５は、算出周期が到来していない場合（ステップＳｔ１のＮｏ）、再びステップＳｔ１の処理を実行する。また、算出周期が到来した場合（ステップＳｔ１のＹｅｓ）、パケットカウンタ部１０１及び負荷算出部１０２に各々の処理の実行を指示する（ステップＳｔ１ｓ）。
【０１６７】
このため、負荷算出部１０２は、周期的に各ＣＰＵ７０の送受信処理の負荷を算出する。したがって、負荷算出部１０２は、上述した例のように、仮想スイッチ８１に転送経路が追加された場合でも、各ＣＰＵ７０の負荷を算出しなおすことができる。
【０１６８】
パケットカウンタ部１０１は、実行指示部１０５の指示に従い、パケットの計数を開始する（ステップＳｔ２）。パケットカウンタ部１０１は、各ポート８１０にアクセスすることにより転送経路ごとにパケットを計数する。パケットカウンタ部１０１は、パケット数をフローテーブル８４に登録する。
【０１６９】
また、負荷算出部１０２は、実行指示部１０５の指示に従い、パケットの計数時間を計時するタイマをスタートさせる（ステップＳｔ３）。なお、ステップＳｔ２とステップＳｔ３の各処理は実質的に同時に実行される。
【０１７０】
次に、負荷算出部１０２は、タイマが満了したか否かを判定する（ステップＳｔ４）。負荷算出部１０２は、タイマが満了していない場合（ステップＳｔ４のＮｏ）、再びステップＳｔ４の処理を実行する。負荷算出部１０２は、タイマが満了した場合（ステップＳｔ４のＹｅｓ）、フローテーブル８４からパケット数を取得する（ステップＳｔ５）。
【０１７１】
次に、負荷算出部１０２は、負荷値テーブル１０４からポート８１０ごとの受信負荷値Ｔｒ及び送信負荷値Ｔｓを取得する（ステップＳｔ６）。次に、負荷算出部１０２は、各ＣＰＵ７０のポートリスト８３１を取得する（ステップＳｔ７）。負荷算出部１０２は、ポートリスト８３１から各ＣＰＵ７０に割り当てられているポート８１０を判別する。なお、ステップＳｔ５〜Ｓｔ７の各処理の実行順序に限定はない。
【０１７２】
次に、負荷算出部１０２は、受信負荷値Ｔｒ及び送信負荷値Ｔｓ、パケット数、ポート８１０の割り当てから各ＣＰＵ７０の負荷を算出する（ステップＳｔ８）。負荷の算出手法については、上述したとおりである。なお、負荷算出部１０２は、上記の式（１）または式（７）を用いる場合、パケット数の取得（ステップＳｔ５）は不要である。負荷算出部１０２は、算出した各ＣＰＵ７０の負荷をポート割り当て部１０３に通知する。
【０１７３】
次に、ポート割り当て部１０３は、負荷分散処理の可否を示す実行フラグ（０：不可、１：可能）が「１」であるか否かを判定する（ステップＳｔ９）。ここで、実行フラグの初期値は「０」である。ポート割り当て部１０３は、実行フラグが「１」を示す場合（ステップＳｔ９のＹｅｓ）、負荷分散処理を実行する（ステップＳｔ１０）。なお、負荷分散処理については後述する。
【０１７４】
次に、ポート割り当て部１０３は、負荷分散処理の結果に基づき各ＣＰＵ７０のポートリスト８３１を更新する（ステップＳｔ１１）。その後、再びステップＳｔ１以降の各処理が実行される。
【０１７５】
また、ポート割り当て部１０３は、実行フラグが「０」を示す場合（ステップＳｔ９のＮｏ）、各ＣＰＵ７０の負荷の差分と閾値ＴＨを比較する（ステップＳｔ１２）。ポート割り当て部１０３は、各ＣＰＵ７０の負荷の差分が閾値ＴＨより大きい場合（ステップＳｔ１２のＹｅｓ）、実行フラグを「１」に更新し（ステップＳｔ１３）、各ＣＰＵ７０の負荷の差分が閾値ＴＨ以下である場合（ステップＳｔ１２のＮｏ）、実行フラグを更新しない。その後、再びステップＳｔ１以降の各処理が実行される。このようにして、負荷処理機能部１００は処理を実行する。
【０１７６】
図１５は、負荷分散処理の一例を示すフローチャートである。本処理は、図１４のステップＳｔ１０において実行される。
【０１７７】
ポート割り当て部１０３は、負荷が高いＣＰＵ７０に割り当てられたポート８１０から、最小の負荷のポート８１０を選択する（ステップＳｔ２１）。次に、ポート割り当て部１０３は、選択したポート８１０の割り当てを他方のＣＰＵ７０に変更した場合の各ＣＰＵ７０の負荷を算出する（ステップＳｔ２２）。このとき、ポート割り当て部１０３は、負荷算出部１０２からポート８１０ごとの負荷を取得して各ＣＰＵ７０の負荷を算出する。
【０１７８】
次に、ポート割り当て部１０３は、各ＣＰＵ７０の間の負荷の大小関係が逆転したか否かを判定する（ステップＳｔ２３）。ポート割り当て部１０３は、各ＣＰＵ７０の間の負荷の大小関係が逆転した場合（ステップＳｔ２３のＹｅｓ）、実行フラグを「０」に更新し（ステップＳｔ２４）、各ＣＰＵ７０の間の負荷の大小関係が逆転した場合（ステップＳｔ２３のＮｏ）、実行フラグを更新しない。
【０１７９】
次に、ポート割り当て部１０３は、選択したポート８１０の割り当ての変更を決定する（ステップＳｔ２５）。ポート割り当て部１０３は、上記のステップＳｔ１１において、その決定に従い各ポートリスト８３１を更新する。
【０１８０】
このように、ポート割り当て部１０３は、負荷算出部１０２の算出結果に基づいて、各ＣＰＵ７０が送受信処理を分担するポート８１０を、各ＣＰＵ７０の間の負荷の大小関係が逆転するように変更することにより、各ＣＰＵ７０の間で送受信処理の負荷を分散させる。このため、ポート割り当て部１０３は、複雑な計算を行うことなく、各ＣＰＵ７０の間でパケットの送受信処理の負荷を分散させることができる。
【０１８１】
また、本例において、実行指示部１０５は、周期的に実行指示を行ったが、これに限定されず、パケットのロスが検出されたときに実行指示を行ってもよい。
【０１８２】
図１６は、負荷処理機能部１００の処理の他の例を示すフローチャートである。図１６において、図１４と共通する処理には同一の符号を付し、その説明は省略する。
【０１８３】
実行指示部１０５は、フローテーブル８４のロス数に基づき、所定数以上のパケットのロス（ＰＫＴロス）の有無を判定する（ステップＳｔ１ａ）。実行指示部１０５は、所定数以上のＰＫＴロスがない場合（ステップＳｔ１ａのＮｏ）、再びステップＳｔ１ａの処理を実行し、所定数以上のＰＫＴロスがある場合（ステップＳｔ１ａのＹｅｓ）、実行指示を行う（ステップＳｔ１ｓ）。なお、パケットカウンタ部１０１は、実行指示部１０５の指示がなくても、常時、各ポート８１０からＰＫＴロス数を収集する。
【０１８４】
このため、負荷算出部１０２は、各ポート８１０におけるＰＫＴロスの検出に応じて各ＣＰＵ７０の送受信処理の負荷を算出する。したがって、ポート割り当て部１０３は、図１を参照して述べたようなパケットの廃棄が発生したとき、適時に負荷分散処理を実行することができる。
【０１８５】
また、ポート割り当て部１０３は、各ポートリスト８３１の更新タイミングをポートリスト８３１内の処理フラグに基づき制御してもよい。
【０１８６】
図１７は、負荷処理機能部１００の処理の他の例を示すフローチャートである。図１７において、図１４と共通する処理には同一の符号を付し、その説明は省略する。
【０１８７】
ポート割り当て部１０３は、ポートリスト８３１の更新処理（ステップＳｔ１１）に先立って、フローテーブル８４を参照することにより、割り当ての変更対象のポート８１０の処理フラグが「１」であるか否かを判定する（ステップＳｔ１０ａ）。ポート割り当て部１０３は、処理フラグが「０」である場合（ステップＳｔ１０ａのＮｏ）、該当ＰＭＤスレッド８３０がそのポート８１０を処理中であるため、各ポートリスト８３１の更新を見合わせ、再びステップＳｔ１０ａの処理を実行する。
【０１８８】
また、ポート割り当て部１０３は、処理フラグが「１」である場合（ステップＳｔ１０ａのＹｅｓ）、該当ＰＭＤスレッド８３０がそのポート８１０を処理中ではないため、各ポートリスト８３１を更新する（ステップＳｔ１１）。
【０１８９】
このように、ポート割り当て部１０３は、各ＣＰＵ７０が送受信処理を分担するポート８１０を、そのポート８１０のパケットの送受信処理が行われていないときに変更する。このため、例えばパケットの廃棄の発生を抑制することができる。
【０１９０】
また、ポート割り当て部１０３は、一方のポートリスト８３１からポート８１０の登録を削除した後、所定時間だけ待機し、その後、他方のポートリスト８３１に該当ポート８１０の登録を追加してもよい。
【０１９１】
図１８は、負荷処理機能部１００の処理の他の例を示すフローチャートである。図１８において、図１４と共通する処理には同一の符号を付し、その説明は省略する。
【０１９２】
ポート割り当て部１０３は、負荷分散処理（ステップＳｔ１０）の実行後、一方のポートリスト８３１から該当ポート８１０の登録を削除する（ステップＳｔ１１ａ）。次に、ポート割り当て部１０３は、所定時間だけ待機処理を行う（ステップＳｔ１１ｂ）。待機する時間としては、例えば、ＰＭＤスレッド８３０が１つのポート８１０のパケットの送受信処理に要する最長時間が挙げられる。その後、ポート割り当て部１０３は、他方のポートリスト８３１に該当ポート８１０の登録を追加する（ステップＳｔ１１ｃ）。
【０１９３】
このように、ポート割り当て部１０３は、一方のＣＰＵ７０に対し、少なくとも１つのポート８１０の送受信処理を停止させたときから一定の期間が経過した後、他方のＣＰＵ７０に対し当該ポート８１０の送受信処理を開始させる。このため、例えばパケットの廃棄の発生を抑制することができる。
【０１９４】
なお、上述した各実施例において、負荷処理機能部１００は、仮想スイッチ８１のポート８１０におけるパケットの送信処理の負荷を処理するが、これに限定されない。負荷処理機能部１００は、仮想スイッチ８１に代えて、ハードウェアにより構成された物理的スイッチ（例えばレイヤ２スイッチ機器）の物理ポートにおけるパケットの送信処理の負荷を上記手法と同様の手法で処理することができる。
【０１９５】
上述した実施形態は本発明の好適な実施の例である。但し、これに限定されるものではなく、本発明の要旨を逸脱しない範囲内において種々変形実施可能である。
【０１９６】
なお、以上の説明に関して更に以下の付記を開示する。
（付記１）  複数のポートの各々のパケットの送受信処理の負荷を示す負荷値を保持する保持部と、
前記複数のポートのうち、複数のプロセッサの各々が前記送受信処理を分担するポートを示すポート情報を取得し、前記負荷値及び前記ポート情報から前記複数のプロセッサの各々の前記送受信処理の負荷を算出する算出部と、
前記算出部の算出結果に基づいて前記複数のプロセッサの間で前記送受信処理の負荷を分散させる分散処理部とを有することを特徴とする負荷分散装置。
（付記２）  前記複数のポートの各々を介し送受信されるパケットを計数する計数部を有し、
前記負荷値は、前記複数のポートの各々の前記送受信処理の負荷をパケット単位で示し、
前記算出部は、前記負荷値、前記ポート情報、及び前記計数部が計数したパケット数から前記複数のプロセッサの各々の前記送受信処理の負荷を算出することを特徴とする付記１に記載の負荷分散装置。
（付記３）  前記複数のプロセッサは、それぞれ、前記複数のポートのうち、前記ポート情報が示す第１ポートの受信処理と、前記第１ポートで受信したパケットの転送先の第２ポートの送信処理を分担し、
前記負荷値には、前記複数のポートの各々について、パケットの受信処理の負荷を示す受信負荷値と、パケットの送信処理の負荷を示す送信負荷値とが含まれ、
前記算出部は、
パケットの転送経路ごとの前記第１ポート及び前記第２ポートを示す経路情報を取得し、
前記経路情報と前記ポート情報から、前記複数のプロセッサの各々が前記受信処理を分担する前記第１ポートの前記受信負荷値と前記第２ポートの前記送信負荷値の合計を算出することを特徴とする付記１または２に記載の負荷分散装置。
（付記４）  前記負荷値には、前記複数のポートの各々について、パケットの受信処理の負荷を示す受信負荷値と、パケットの送信処理の負荷を示す送信負荷値とが含まれ、
前記算出部は、前記ポート情報から、前記複数のポートのうち、前記複数のプロセッサの各々が前記送受信処理を分担する１以上のポートの前記受信負荷値及び前記送信負荷値の合計を算出することを特徴とする付記１または２に記載の負荷分散装置。
（付記５）  前記分散処理部は、前記算出部の算出結果に基づいて、前記複数のポートのうち、前記複数のプロセッサの各々が前記送受信処理を分担するポートを、前記複数のプロセッサのうち、２つのプロセッサの間の負荷の大小関係が逆転するように変更することにより、前記複数のプロセッサの間で前記送受信処理の負荷を分散させることを特徴とする付記１乃至４の何れかに記載の負荷分散装置。
（付記６）  前記分散処理部は、前記複数のプロセッサの一方に対し前記複数のポートの少なくとも１つの前記送受信処理を停止させたときから一定の期間が経過した後、前記複数のプロセッサの他方に対し当該ポートの前記送受信処理を開始させることを特徴とする付記５に記載の負荷分散装置。
（付記７）  前記分散処理部は、前記複数のポートのうち、前記複数のプロセッサの各々が前記送受信処理を分担するポートを、該ポートのパケットの前記送受信処理が行われていないときに変更することを特徴とする付記５に記載の負荷分散装置。
（付記８）  前記算出部は、前記複数のポートの各々におけるパケットのロスの検出に応じて前記複数のプロセッサの各々の前記送受信処理の負荷を算出することを特徴とする付記１乃至７の何れかに記載の負荷分散装置。
（付記９）  前記算出部は、周期的に前記複数のプロセッサの各々の前記送受信処理の負荷を算出することを特徴とする付記１乃至７の何れかに記載の負荷分散装置。
（付記１０）  複数のポートの各々のパケットの送受信処理の負荷を示す負荷値と、前記複数のポートのうち、複数のプロセッサの各々が前記送受信処理を分担するポートを示すポート情報とから前記複数のプロセッサの各々の前記送受信処理の負荷を算出し、
該算出結果に基づいて前記複数のプロセッサの間で前記送受信処理の負荷を分散させることを特徴とする負荷分散方法。
（付記１１）  前記負荷値は、前記複数のポートの各々の前記送受信処理の負荷をパケット単位で示し、
前記負荷値、前記ポート情報、及び前記複数のポートの各々を介し送受信されるパケット数から前記複数のプロセッサの各々の前記送受信処理の負荷を算出することを特徴とする付記１０に記載の負荷分散方法。
（付記１２）  前記複数のプロセッサは、それぞれ、前記複数のポートのうち、前記ポート情報が示す第１ポートの受信処理と、前記第１ポートで受信したパケットの転送先の第２ポートの送信処理を分担し、
前記負荷値には、前記複数のポートの各々について、パケットの受信処理の負荷を示す受信負荷値と、パケットの送信処理の負荷を示す送信負荷値とが含まれ、
パケットの転送経路ごとの前記第１ポート及び前記第２ポートを示す経路情報を取得し、
前記経路情報と前記ポート情報から、前記複数のプロセッサの各々が前記受信処理を分担する前記第１ポートの前記受信負荷値と前記第２ポートの前記送信負荷値の合計を算出することを特徴とする付記１０または１１に記載の負荷分散方法。
（付記１３）  前記負荷値には、前記複数のポートの各々について、パケットの受信処理の負荷を示す受信負荷値と、パケットの送信処理の負荷を示す送信負荷値とが含まれ、
前記ポート情報から、前記複数のポートのうち、前記複数のプロセッサの各々が前記送受信処理を分担する１以上のポートの前記受信負荷値及び前記送信負荷値の合計を算出することを特徴とする付記１０または１１に記載の負荷分散方法。
（付記１４）  前記算出部の算出結果に基づいて、前記複数のポートのうち、前記複数のプロセッサの各々が前記送受信処理を分担するポートを、前記複数のプロセッサのうち、２つのプロセッサの間の負荷の大小関係が逆転するように変更することにより、前記複数のプロセッサの間で前記送受信処理の負荷を分散させることを特徴とする付記１０乃至１３の何れかに記載の負荷分散方法。
（付記１５）  前記複数のプロセッサの一方に対し前記複数のポートの少なくとも１つの前記送受信処理を停止させたときから一定の期間が経過した後、前記複数のプロセッサの他方に対し当該ポートの前記送受信処理を開始させることを特徴とする付記１４に記載の負荷分散方法。
（付記１６）  前記複数のポートのうち、前記複数のプロセッサの各々が前記送受信処理を分担するポートを、該ポートのパケットの前記送受信処理が行われていないときに変更することを特徴とする付記１４に記載の負荷分散方法。
（付記１７）  前記複数のポートの各々におけるパケットのロスの検出に応じて前記複数のプロセッサの各々の前記送受信処理の負荷を算出することを特徴とする付記１０乃至１６の何れかに記載の負荷分散方法。
（付記１８）  周期的に前記複数のプロセッサの各々の前記送受信処理の負荷を算出することを特徴とする付記１０乃至１７の何れかに記載の負荷分散方法。
（付記１９）  複数のポートの各々のパケットの送受信処理の負荷を示す負荷値を保持するメモリと、
前記複数のポートのうち、複数の第１プロセッサの各々が前記送受信処理を分担するポートを示すポート情報を取得し、前記負荷値及び前記ポート情報から前記複数の第１プロセッサの各々の前記送受信処理の負荷を算出し、該算出結果に基づいて前記複数の第１プロセッサの間で前記送受信処理の負荷を分散させる第２プロセッサとを有することを特徴とする負荷分散装置。
【符号の説明】
【０１９７】
１       中継サーバ
７０，１１      ＣＰＵ
１４       ストレージ
８０       ＶＭ
８１       仮想スイッチ
８４       フローテーブル
１００      負荷処理機能部
１０１      パケットカウンタ部
１０２      負荷算出部
１０３      ポート割り当て部
１０４      負荷値テーブル
１０５      実行指示部
８１０      ポート
８３１      ポートリスト
【図１】
2018181155.tif 000007
【図２】
2018181155.tif 000008
【図３】
2018181155.tif 000009
【図４】
2018181155.tif 000010
【図５】
2018181155.tif 000011
【図６】
2018181155.tif 000012
【図７】
2018181155.tif 000013
【図８】
2018181155.tif 000014
【図９】
2018181155.tif 000015
【図１０】
2018181155.tif 000016
【図１１】
2018181155.tif 000017
【図１２】
2018181155.tif 000018
【図１３】
2018181155.tif 000019
【図１４】
2018181155.tif 000020
【図１５】
2018181155.tif 000021
【図１６】
2018181155.tif 000022
【図１７】
2018181155.tif 000023
【図１８】
2018181155.tif 000024