(57)【要約】【課題】ＮＩＣが受信したパケットを宛先ＶＭが動作するＮＵＭＡノードにＤＭＡ転送するように動的に切り替えること。【解決手段】スレッド＃１が、ＶＭ用仮想ポート＃２宛のフローについてＮＩＣ３のフィルタ３１ｂをハードウェア受信キュー＃２に設定し、キュー切替をスレッド＃２に通知する。そして、スレッド＃１は、当該フローについて、ハードウェア受信キュー＃１及び受信キュー＃１にあるパケットをスレッド＃２に送信する。そして、スレッド＃２は、当該フローについて、キュー切替の通知を受信すると、仮想スイッチポート＃１の受信処理を一時停止し、スレッド＃１から送信されたパケットをＶＭ用仮想ポート＃２に送信後、仮想スイッチポート＃１の受信処理を再開する。【選択図】図３
2018185624.tif 000002
【特許請求の範囲】
【請求項１】
第１受信バッファと通信装置を有する第１ノードで第１スレッドが実行される第１処理装置と、第２受信バッファを有する第２ノードで第２スレッドが実行される第２処理装置に、
前記第１スレッドは、前記第２処理装置で実行される仮想マシンの仮想ポート宛のフローについて、前記通信装置の出力先を前記第２受信バッファに設定し、前記出力先の前記第２受信バッファへの設定を切替通知により前記第２スレッドに通知し、前記第１受信バッファに格納されたパケットを前記第２スレッドに転送し、
前記第２スレッドは、前記切替通知を受信すると、前記フローについて、前記第２受信バッファの受信処理を一時停止し、前記第１スレッドから転送されたパケットを前記仮想ポートに転送し、該転送が終わった後に前記第２受信バッファの受信処理を再開する、
処理を実行させることを特徴とするスイッチプログラム。
【請求項２】
前記第１スレッドは、前記フローについて、前記第１処理装置のフローキャッシュにエントリを登録する際に、前記第１受信バッファから前記第２受信バッファへの切替が必要か否かを判定し、必要と判定した場合に、該エントリのアクションの出力先を前記第２スレッドに変更し、前記通信装置の出力先を前記第２受信バッファに設定し、前記出力先の前記第２受信バッファへの設定を切替通知により前記第２スレッドに通知し、前記第１受信バッファに格納されたパケットを前記第２スレッドに転送する、ことを特徴とする請求項１に記載のスイッチプログラム。
【請求項３】
前記第１スレッドは、前記フローについて、前記第１受信バッファにパケットがなくなった場合、又は、前記第１受信バッファに格納された所定の数のパケットを前記第２スレッドに転送した場合に、前記第２スレッドに切替完了通知を送信し、
前記第２スレッドは、前記フローについて、前記切替完了通知を受信すると、前記第２受信バッファの受信処理を再開することを特徴とする請求項１又は２に記載のスイッチプログラム。
【請求項４】
前記第１スレッドは、受信バッファに対応する受信ポートが物理ポートであり、出力先のポートが仮想マシン用仮想ポートであり、かつ、前記受信ポートが属するノードと前記仮想マシン用仮想ポートが属するノードが異なる場合に前記切替が必要と判定することを特徴とする請求項２に記載のスイッチプログラム。
【請求項５】
第１受信バッファと通信装置を有する第１ノードで第１スレッドが実行される第１処理装置と、第２受信バッファを有する第２ノードで第２スレッドが実行される第２処理装置が、
前記第１スレッドは、前記第２処理装置で実行される仮想マシンの仮想ポート宛のフローについて、前記通信装置の出力先を前記第２受信バッファに設定し、前記出力先の前記第２受信バッファへの設定を切替通知により前記第２スレッドに通知し、前記第１受信バッファに格納されたパケットを前記第２スレッドに転送し、
前記第２スレッドは、前記切替通知を受信すると、前記フローについて、前記第２受信バッファの受信処理を一時停止し、前記第１スレッドから転送されたパケットを前記仮想ポートに転送し、該転送が終わった後に前記第２受信バッファの受信処理を再開する
処理を実行することを特徴とするスイッチング方法。
【請求項６】
第１処理装置と第１受信バッファと通信装置とを有する第１ノードと、第２処理装置と第２受信バッファとを有する第２ノードとを有する情報処理装置において、
前記第１ノードは、前記第２処理装置で実行される仮想マシンの仮想ポート宛のフローについて、前記通信装置の出力先を前記第２受信バッファに設定し、前記出力先の前記第２受信バッファへの設定を切替通知により前記第２ノードに通知し、前記第１受信バッファに格納されたパケットを前記第２ノードに転送し、
前記第２ノードは、前記切替通知を受信すると、前記フローについて、前記第２受信バッファの受信処理を一時停止し、前記第１ノードから転送されたパケットを前記仮想ポートに転送し、該転送が終わった後に前記第２受信バッファの受信処理を再開する
ことを特徴とする情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、スイッチプログラム、スイッチング方法及び情報処理装置に関する。
【背景技術】
【０００２】
近年、複数のＣＰＵ（Central  Processing  Unit）を搭載するサーバにおいて、スケールアップを行いやすいＮＵＭＡ（Non-Uniform  Memory  Access）アーキテクチャが採用される場合が増えている。
【０００３】
図１４は、ＮＵＭＡアーキテクチャのサーバを示す図である。図１４に示すように、ＮＵＭＡアーキテクチャのサーバは、複数のＮＵＭＡノードを有する。なお、図１４では説明の便宜上、ＮＵＭＡノード＃１及びＮＵＭＡノード＃２で表される２台のＮＵＭＡノードのみを示したが、ＮＵＭＡアーキテクチャのサーバは、３台以上のＮＵＭＡノードを有してよい。
【０００４】
ＮＵＭＡアーキテクチャのサーバは、ＣＰＵ毎に独立にメモリを有する。すなわち、ＮＵＭＡノード＃１は、ＣＰＵ＃１とメモリ＃１を有し、ＮＵＭＡノード＃２は、ＣＰＵ＃２とメモリ＃２を有する。ＣＰＵは、メモリコントローラと、ＩＰＬ（Inter  Processor  Link）コントローラと、Ｉ／Ｏコントローラを有する。
【０００５】
メモリコントローラは、メモリと接続し、メモリへのアクセスを制御する。ＩＰＬコントローラは、プロセッサ間の通信を制御する。Ｉ／Ｏコントローラは、接続するＩ／Ｏ装置を制御する。ＮＵＭＡノード＃１のＩ／ＯコントローラにはＮＩＣ（Network  Interface  Card）が接続される。
【０００６】
ＮＵＭＡアーキテクチャのサーバでは、基本ソフト（ＯＳ：Operating  System）がアプリケーションの動作するＣＰＵと同じＮＵＭＡノードのメモリを当該アプリケーションに割当てることで、ＣＰＵ間のメモリアクセス競合を低減することができる。したがって、ＮＵＭＡアーキテクチャのサーバでは、複数ＣＰＵが共通のメモリコントローラ経由でメモリに接続されるＵＭＡ（Uniform  Memory  Access）アーキテクチャのサーバよりスケールアップが行いやすい。
【０００７】
しかしながら、ＮＵＭＡアーキテクチャのサーバでは、仮想スイッチを利用する仮想化環境において性能低下が発生する。図１５は、仮想スイッチを利用する仮想化環境における性能低下を説明するための図である。図１５において、ＶＭ＃１はＮＵＭＡノード＃１で動作する仮想マシン（ＶＭ：Virtual  Machine）であり、ＶＭ＃２はＮＵＭＡノード＃２で動作する仮想マシンである。ＶＭ＃１及びＶＭ＃２は、仮想スイッチを介してネットワークからパケットを受信する。ＶＭ＃１及びＶＭ＃２は、ｖＮＩＣ（仮想ＮＩＣ）受信バッファを用いてパケットを受信する。ＶＭ＃１のｖＮＩＣ受信バッファはメモリ＃１に設けられ、ＶＭ＃２のｖＮＩＣ受信バッファは、メモリ＃２に設けられる。
【０００８】
仮想スイッチの機能は、複数のスレッドがＣＰＵにより実行されることによって実現される。複数のスレッドは、ＣＰＵ＃１又はＣＰＵ＃２で実行される。仮想スイッチは、ＶＭ用の２つのｖポート（仮想ポート）と、ＮＩＣの物理ポートに対応付けられる論理ポートを有する。
【０００９】
ＮＩＣのｐＮＩＣ＃１で表される物理ポートがネットワークからパケットを受信する（１）と、受信パケットは、ｐＮＩＣ＃１の受信バッファにＤＭＡ（Direct  Memory  Access）で書き込まれる（２）。ｐＮＩＣ＃１の受信バッファは、一般的にはＮＩＣが接続されるＮＵＭＡノード＃１のメモリ＃１に設けられる。そして、仮想スイッチのスレッドが、ｐＮＩＣ＃１の受信バッファからパケットを読み出し（３）、パケットがＶＭ＃２宛である場合には、ＶＭ＃２のｖＮＩＣ受信バッファにパケットを書き込む（４）。
【００１０】
ここで、仮想スイッチのスレッドはＣＰＵ＃１で動作するため、ＶＭ＃２のｖＮＩＣ受信バッファへの書き込みは、リモートメモリへの書き込みとなる。したがって、ＶＭ＃１のｖＮＩＣ受信バッファへの書き込みと比べて、ＶＭ＃２のｖＮＩＣ受信バッファへの書き込みでは、性能が大幅に低下する。
【００１１】
そこで、ＮＩＣの物理ポートにＮＵＭＡノード毎の物理受信キューを配置し、ＮＩＣの物理ポートにＮＵＭＡノード毎に仮想ポートを対応させ、仮想ポート毎に受信キューを配置し、物理受信キューのＤＭＡ先を対応ＮＵＭＡノードの受信バッファにする技術がある。この技術によれば、異なるＮＵＭＡノードに存在するＮＩＣ−ＶＭ間の通信性能の低下を防ぐことができる。
【００１２】
なお、ロードバランサが特定のＮＵＭＡノードを使用するＶＭを同じＮＵＭＡノードのネットワークキューに割り当て、スケジューラがＶＭをＮＩＣ又はネットワークキューと同じＮＵＭＡノードに割り当てる技術がある。
【００１３】
また、ネットワークアダプタが、パケットフロー識別子を有する受信パケットを、転送パケットを記憶する複数の送信／受信キューのうちパケットフロー識別子に対応付けられた送信／受信キューにルーティングする技術がある。
【先行技術文献】
【特許文献】
【００１４】
【特許文献１】米国特許第９４９５１９２号明細書
【特許文献２】米国特許第９０６９７２２号明細書
【発明の概要】
【発明が解決しようとする課題】
【００１５】
ＮＵＭＡノード毎の物理受信キューのＤＭＡ先を対応ＮＵＭＡノードの受信バッファにするためには、ＮＩＣにおいて受信パケットの宛先に対応するＤＭＡ先のＮＵＭＡノードの特定情報を登録する必要があるが、ＮＩＣへの事前登録が行えない場合があるという問題がある。具体的には、ＮＦＶ（Network  Function  Virtualization）環境ではＶＭが内部で動的に生成した仮想ＭＡＣ（Media  Access  Control）アドレスで通信を行う場合があり、ＤＭＡ先のＮＵＭＡノードの特定情報を事前登録することができない。
【００１６】
本発明は、１つの側面では、ＮＩＣが受信したパケットを宛先ＶＭが動作するＮＵＭＡノードにＤＭＡ転送するように、ＮＩＣの物理受信キューを動的に切り替えるスイッチプログラム、スイッチング方法及び情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【００１７】
１つの態様では、スイッチプログラムは、第１受信バッファと通信装置を有する第１ノードで第１スレッドが実行される第１処理装置と、第２受信バッファを有する第２ノードで第２スレッドが実行される第２処理装置に、以下の処理を実行させる。第１スレッドは、第２処理装置で実行される仮想マシンの仮想ポート宛のフローについて、通信装置の出力先を第２受信バッファに設定し、出力先の第２受信バッファへの設定を切替通知により第２スレッドに通知し、第１受信バッファに格納されたパケットを第２スレッドに転送する。第２スレッドは、切替通知を受信すると、当該フローについて、第２受信バッファの受信処理を一時停止し、第１スレッドから転送されたパケットを仮想ポートに転送し、該転送が終わった後に第２受信バッファの受信処理を再開する。
【発明の効果】
【００１８】
１つの側面では、本発明は、ＮＩＣが受信したパケットを宛先ＶＭが動作するＮＵＭＡノードにＤＭＡ転送するようにＮＩＣの物理受信キューを動的に切り替えることができる。
【図面の簡単な説明】
【００１９】
【図１Ａ】図１Ａは、実施例に係る情報処理装置の動作例を説明するための第１の図である。
【図１Ｂ】図１Ｂは、実施例に係る情報処理装置の動作例を説明するための第２の図である。
【図２Ａ】図２Ａは、従来の仮想スイッチの動作を説明するための図である。
【図２Ｂ】図２Ｂは、後続パケットの追い越しを説明するための図である。
【図３】図３は、仮想スイッチの機能構成を示す図である。
【図４】図４は、フローテーブルの例を示す図である。
【図５】図５は、フローキャッシュ登録の例を示す図である。
【図６Ａ】図６Ａは、スレッド制御パケットの例を示す第１の図である。
【図６Ｂ】図６Ｂは、スレッド制御パケットの例を示す第２の図である。
【図７】図７は、移行管理テーブルの例を示す図である。
【図８】図８は、スレッドによる受信処理の手順を示すフローチャートである。
【図９】図９は、フローテーブルルックアップ処理の手順を示すフローチャートである。
【図１０】図１０は、スレッド制御パケット処理の手順を示すフローチャートである。
【図１１】図１１は、切替通知処理の手順を示すフローチャートである。
【図１２】図１２は、切替完了通知処理の手順を示すフローチャートである。
【図１３】図１３は、データ転送処理の手順を示すフローチャートである。
【図１４】図１４は、ＮＵＭＡアーキテクチャのサーバを示す図である。
【図１５】図１５は、仮想スイッチを利用する仮想化環境における性能低下を説明するための図である。
【発明を実施するための形態】
【００２０】
以下に、本願の開示するスイッチプログラム、スイッチング方法及び情報処理装置の実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
【実施例】
【００２１】
まず、実施例に係る情報処理装置の動作について説明する。実施例に係る情報処理装置は、以下の動作を行う。
（１）実施例に係る情報処理装置は、ＮＩＣの物理ポートに対応する仮想スイッチポート毎に、ＮＵＭＡノード毎の最低１つ以上の受信キューを有する。そして、実施例に係る情報処理装置は、ＮＩＣの物理ポートにおいて受信キューに対応するＨｗＱ（ハードウェアキュー）のＤＭＡ先を受信キューに対応するＮＵＭＡノードのメモリに設定する。
（２）そして、実施例に係る情報処理装置は、各ＮＵＭＡノードに最低１つ以上のスレッドを割り当て、同一ＮＵＭＡノードの受信キューの受信処理を担当させる。
（３）そして、ＮＵＭＡノード＃１に割当てられたスレッド＃１は他ＮＵＭＡノードに割り当てられたスレッドとの間に通信経路を確立する。
【００２２】
（４）そして、スレッド＃１は、フローキャッシュにフロー及びアクションを登録する際に、当該フローの出力ポートの所属するＮＵＭＡノードに基づきＮＩＣのフィルタへの登録が必要かを判断する。そして、スレッド＃１は、登録が必要と判断した場合には以下の手順を実行する。
（４−１）スレッド＃１は、ＮＩＣのフィルタに当該フロー情報及び当該フローの出力先ＨｗＱ情報を登録する。
（４−２）スレッド＃１は、当該フローを受信したポートにおいて受信キュー及びＨｗＱの切替を行った旨をスレッド間通信経路経由で切替先ＮＵＭＡノード＃２のスレッド＃２に通知する。
（４−３）スレッド＃１は、当該フローのアクションの出力先をスレッド＃２に変更してフローキャッシュに登録する。
（４−４）スレッド＃１は、その後当該ポートで一定数のパケットを受信するか、もしくは、受信パケットがない状態になるとスレッド＃２に切替完了通知を行う。
【００２３】
（５）スレッド＃２は、キュー切替の通知を受信すると当該ポートの受信処理を一時停止し、スレッド＃１からのデータの処理を優先的に実施する。
（６）スレッド＃２は、スレッド＃１から切替完了通知を受信すると当該ポートの受信処理を再開する。
【００２４】
以上の動作の具体例を図１Ａ及び図１Ｂを用いて説明する。図１Ａ及び図１Ｂは、実施例に係る情報処理装置の動作例を説明するための図である。なお、図１Ａ及び図１Ｂにおいて、太い破線の矢印は制御の流れを示し、太い実線の矢印は、Ｆｌｏｗ＿Ａで表されるフローの流れを示す。
【００２５】
実施例に係る情報処理装置１０は、ＮＵＭＡアーキテクチャのサーバであり、図１Ａに示すように、ＮＵＭＡノード＃１及びＮＵＭＡノード＃２で表されるＮＵＭＡノード１を有する。ＮＵＭＡノード１は、メモリとＣＰＵを有する。なお、図１Ａ及び図１Ｂでは説明の便宜上、２台のＮＵＭＡノード１のみを示したが、情報処理装置１０は、３台以上のＮＵＭＡノード１を有してよい。
【００２６】
ＮＵＭＡノード＃１は、ＮＩＣ３を有する。ＮＩＣ３は、ｐＮＩＣ＃１で表される物理ポート３１を有する。ｐＮＩＣ＃１は、ＨｗＱ＃１及びＨｗＱ＃２で表される２つのハードウェア受信キュー３１ａとフィルタ３１ｂとを有する。ハードウェア受信キュー３１ａは、ｐＮＩＣ＃１が受信したパケットを格納するキューである。ＨｗＱ＃１は、ＮＵＭＡノード＃１用のハードウェア受信キュー３１ａであり、ＤＭＡ先はＨｗＱ＃１用の受信バッファ４である。ＨｗＱ＃２は、ＮＵＭＡノード＃２用のハードウェア受信キュー３１ａであり、ＤＭＡ先はＨｗＱ＃２用の受信バッファ４である。
【００２７】
フィルタ３１ｂには、ｐＮＩＣ＃１が受信したパケットが属するフロー（Ｆｌｏｗ）に対する振り分け先（Ｄｓｔ．Ｑ）が登録される。デフォルトでは、ＨｗＱ＃１が振り分け先として設定される。
【００２８】
ＮＵＭＡノード＃１とＮＵＭＡノード＃２では、仮想スイッチ２が動作する。仮想スイッチ２の機能は、複数のスレッドが実行されることによって実現される。複数のスレッドは、ＮＵＭＡノード＃１のＣＰＵ又はＮＵＭＡノード＃２のＣＰＵで実行される。ＮＵＭＡノード＃１では、仮想スイッチ２のスレッド２５としてスレッド＃１が動作し、ＮＵＭＡノード＃２では、仮想スイッチ２のスレッド２５としてスレッド＃２が動作する。
【００２９】
複数のスレッドは、スイッチプログラムを形成する。スイッチプログラムは、ＮＵＭＡノード１のメモリから読み出されて、ＮＵＭＡノード１のＣＰＵにより実行される。また、スイッチプログラムは、ＤＶＤ等の不揮発性記憶媒体から読み出されてＮＵＭＡノード１にインストールされる。あるいは、スイッチプログラムは、ネットワークを介して接続された他の情報処理装置から読み出されてＮＵＭＡノード１にインストールされる。
【００３０】
仮想スイッチ２は、ＮＩＣ３の物理ポート３１に対応する仮想スイッチポート２４であるｖポート＃１を有する。また、仮想スイッチ２は、ＮＵＭＡノード＃１で動作するＶＭ用の仮想ポートでありｖポート＃２で表されるＶＭ用仮想ポート２１と、ＮＵＭＡノード＃２で動作するＶＭ用の仮想ポートでありｖポート＃３で表されるＶＭ用仮想ポート２１とを有する。ｖポート＃１は、ＲＸＱ＃１及びＲＸＱ＃２で表される受信キュー２４ａを有する。ＲＸＱ＃１は、ＨｗＱ＃１に対応し、ＲＸＱ＃２は、ＨｗＱ＃２に対応する。
【００３１】
また、仮想スイッチ２は、ＮＵＭＡノード＃１にフローテーブル群２２を有する。フローテーブル群２２は、フロー（Ｆｌｏｗ）に対するアクション（Ａｃｔｉｏｎｓ）を定義する一連のテーブルである。アクションは複数ある場合もある。図１Ａでは、Ｆｌｏｗ＿Ａに対するアクションとして「出力先はｖポート＃３」（Ｏｕｔｐｕｔ：ｖポート＃３）が定義される。
【００３２】
スレッド２５は、フローキャッシュ２３を有する。フローキャッシュ２３は、フローテーブル群２２のキャッシュであり、フロー情報から計算されるハッシュ値（Ｈａｓｈ）にフローとアクションを対応付ける。スレッド＃１は、フローキャッシュ＃１で表されるフローキャッシュ２３を有し、スレッド＃２は、フローキャッシュ＃２で表されるフローキャッシュ２３を有する。
【００３３】
ｐＮＩＣ＃１はＦｌｏｗ＿Ａのパケット群を受信するとデフォルトのＨｗＱ＃１に格納し、ＨｗＱ＃１に格納されたパケット群はＨｗＱ＃１用の受信バッファ４にＤＭＡ転送される（１）。そして、スレッド＃１は、ＨｗＱ＃１用の受信バッファ４から最初のパケットを取り出し、フローキャッシュ＃１を検索するが、ヒットしないため、フローテーブル群２２を検索する（２）。
【００３４】
すると、Ｆｌｏｗ＿Ａの情報がヒットし、出力先のｖポート＃３はＮＵＭＡノード＃２に所属するので、スレッド＃１及びスレッド＃２は、以下のキュー切替手順を実行する（３）。すなわち、スレッド＃１は、ｖポート＃１のキュー切替をスレッド＃２に通知し（４）、ＮＩＣ３のフィルタ３１ｂに、Ｆｌｏｗ＿Ａの出力先としてＨｗＱ＃２を登録する（５）。キュー切替を通知されたスレッド＃２は、ｖポート＃１の受信処理を中断する。
【００３５】
そして、スレッド＃１は、Ｆｌｏｗ＿Ａに対応するアクションを「出力先はスレッド＃２」（Ｏｕｔｐｕｔ：スレッド＃２）に変更してフローキャッシュ＃１に登録する（６）。そして、図１Ｂに示すように、スレッド＃１は、キュー切替前にＨｗＱ＃１に格納されたＦｌｏｗ＿Ａのパケットをフローキャッシュ＃１の内容に従いスレッド＃２に転送する（７ａ）。スレッド＃２は、スレッド＃１からの受信データを優先的に処理する。同時に、キュー切替後に受信されたＦｌｏｗ＿ＡのパケットがＨｗＱ＃２からＤＭＡ転送でＮＵＭＡノード＃２へ転送される（７ｂ）。
【００３６】
そして、スレッド＃１側のＦｌｏｗ＿Ａの処理が完了すると、スレッド＃１は、スレッド＃２へキュー切替完了を通知する（８）。そして、スレッド＃２は、ｖポート＃１の受信処理を再開する（９）。
【００３７】
ここで、比較のために、従来の仮想スイッチの動作を説明する。図２Ａは、従来の仮想スイッチの動作を説明するための図である。図２Ａにおいて、太い実線はＦｌｏｗ＿Ｃの流れを示し、太い一点鎖線はＦｌｏｗ＿Ｂの流れを示す。
【００３８】
図２Ａに示すように、従来の仮想スイッチでは、フィルタには手動登録が行われ（１）、動的な登録は行われない。また、Ｆｌｏｗ＿Ｂの処理（２）、（３）、（４）及び（５）とＦｌｏｗ＿Ｃの処理（２）'、（３）'、（４）'及び（５）'が各スレッドで並列に行われる。受信フローに対応した宛先ＮＵＭＡノードの自動切替は行われない。
【００３９】
また、図１Ａ及び図１Ｂに示したように、スレッド＃２は、スレッド＃１からキュー切替を通知されると対応するフローの受信処理を中断し、キュー切替完了を通知されると対応するフローの受信処理を再開する。このように、スレッド＃１がキュー切替とキュー切替完了をスレッド＃２に通知し、スレッド＃２がスレッド＃１からの通知に基づいて、対応するフローの受信処理の中断と再開を行うことで、パケットが正しい順序でＶＭに渡される。
【００４０】
図２Ｂは、後続パケットの追い越しを説明するための図である。後続パケットの追い越しは、スレッド＃１がキュー切替とキュー切替完了をスレッド＃２に通知し、スレッド＃２がスレッド＃１からの通知に基づいて、対応するフローの受信処理の中断と再開を行う仕組みがない場合に発生する。
【００４１】
図２Ｂの左側は、Ｆｌｏｗ＿Ｄの最初のパケット＃１がスレッド＃１により処理され、フィルタ３１ｂにキュー切替の登録が行われるまでに、ＲＸＱ＃１にＦｌｏｗ＿Ｄのパケット＃２とパケット＃３が溜まる場合を示す。そして、キュー切替の登録が行われると、図２Ｂの右側に示すように、スレッド＃１がＦｌｏｗ＿Ｅのパケットを処理している間に、Ｆｌｏｗ＿Ｄの後続のパケット＃４がスレッド＃２によって処理され、パケット＃４がパケット＃３を追い越してしまう。
【００４２】
次に、仮想スイッチ２の機能構成について説明する。図３は、仮想スイッチ２の機能構成を示す図である。図３に示すように、仮想スイッチ２は、ＶＭ用仮想ポート＃１及びＶＭ用仮想ポート＃２で表されるＶＭ用仮想ポート２１を有する。なお、ＶＭ用仮想ポート＃１は、図１Ａに示したｖポート＃２に対応し、ＶＭ用仮想ポート＃２は、図１Ａに示したｖポート＃３に対応する。
【００４３】
また、仮想スイッチ２は、フローテーブル群２２と、フローキャッシュ＃１及びフローキャッシュ＃２で表される２つのフローキャッシュ２３と、仮想スイッチポート＃１で表される仮想スイッチポート２４とを有する。また、仮想スイッチ２は、スレッド＃１及びスレッド＃２で表される２つのスレッド２５を有する。
【００４４】
フローテーブル群２２は、複数のフローテーブルであり、フローパイプラインを構成する。図４は、フローテーブルの例を示す図である。各フローテーブルはワイルドカードマッチ（マスク付）テーブルである。
【００４５】
図４に示すように、フローテーブルには、番地と、優先度と、マッチングルールと、アクションとが含まれる。番地は、各エントリが記憶される位置を示す値である。優先度は、マッチングルールをチェックする順番を示す。優先度の値が小さい順にマッチングルールはチェックされる。
【００４６】
マッチングルールは、受信パケットに対するアクションを特定するために用いられる。マッチングルールには、受信パケットに含まれるフロー情報（１２タプル）についてＶａｌｕｅとＭａｓｋが含まれる。１２タプルは、受信ポート、送信元ＭＡＣ、宛先ＭＡＣ、Ｅｔｈｅｒタイプ、ＶＬＡＮＩＤ、ＶＬＡＮＰｒｉｏ、送信元ＩＰ、宛先ＩＰ、ＩＰｐｒｏｔｏ、ＩＰＴｏＳ、Ｌ４Ｓｐｏｒｔ、Ｌ４Ｄｐｏｒｔである。ここで、ＶＬＡＮは、Virtual  Local  Area  Networkであり、ＩＰは、Internet  Protocolである。
【００４７】
受信ポートは、パケットを受信したポートの番号である。送信元ＭＡＣは、パケットの送信元のＭＡＣアドレスである。宛先ＭＡＣは、パケットの宛先のＭＡＣアドレスである。Ｅｔｈｅｒタイプは、上位層パケットの種類を示す。ＶＬＡＮＩＤは、ＶＬＡＮを識別する識別子である。ＶＬＡＮＰｒｉｏは、ＶＬＡＮの優先度である。送信元ＩＰは、パケットの送信元のＩＰアドレスである。宛先ＩＰは、パケットの宛先のＩＰアドレスである。ＩＰｐｒｏｔｏは、ＩＰのプロトコル番号を示す。ＩＰＴｏＳは、通信サービスの種別を示す。Ｌ４Ｓｐｏｒｔは、Ｌ４の送信元ポート番号である。Ｌ４Ｄｐｏｒｔは、Ｌ４の送信先ポート番号である。
【００４８】
Ｖａｌｕｅは、受信パケットに含まれるタプルの値と一致するか否かがチェックされる値である。Ｍａｓｋは、タプルの値を取り出す時のマスクであり、マスク値のビットが１に対応するビットがタプルから取り出されＶａｌｕｅと比較される。ただし、マスク値＝０は、どんなデータにもマッチする。
【００４９】
また、受信ポートにはマスク値はなく（Ｎ／Ａ）、受信ポートのフィールドは（１＜＜（ｎ−１））＆Ｖａｌｕｅ！＝０の時にマッチする。ここで、「＜＜」はビット左シフト演算である。例えば、１＜＜３は、２進数の１０００である。また、ｎはポート番号［１≦ｎ≦Ｎ］であり、Ｎは受信ポート数である。受信ポートのフィールドに設定されるＶａｌｕｅの値には、マッチさせたいポート番号に対応するビット位置に１がセットされるポートベクタというデータ構造が使用される。これにより、Ｖａｌｕｅに複数のポートを指定することができる。
【００５０】
アクションは、受信パケットがマッチングルールにマッチしたときにスレッドが行うべき動作である。アクションは、１２タプルにより特定されるフローに対してスレッドが行うべき動作である。複数のアクションは、アクションリストと呼ばれる。
【００５１】
例えば、「ＧｏｔｏＴａｂｌｅ：１」は、次にテーブル＃１に基づいてアクションを決定することを示す。また、アクションリスト「ＶＬＡＮｔｒａｎｓ：１００，ＧｏｔｏＴａｂｌｅ：２」はＶＬＡＮ番号を「１００」に付け替えを指定し、次にテーブル＃２に基づいてアクションを決定することを示す。また、「Ｏｕｔｐｕｔ：１」は、ｖポート＃１にパケットを出力することを示す。
【００５２】
図３に戻って、フローキャッシュ２３には、受信パケットのフロー情報と、途中のフローテーブルでマッチしたエントリのアクションも含め最後のフローテーブルまでにマッチしたエントリの全アクションがハッシュ値が示す番地に登録される。フローキャッシュ＃１はスレッド＃１用であり、フローキャッシュ＃２はスレッド＃２用である。
【００５３】
仮想スイッチポート２４は、ＮＩＣ３の物理ポート３１に対応する仮想ポートである。仮想スイッチポート２４は、受信キュー＃１及び受信キュー＃２で表される受信キュー２４ａと、送信キュー＃１及び送信キュー＃２で表される送信キュー２４ｂを有する。受信キュー＃１及び送信キュー＃１はスレッド＃１用であり、受信キュー＃２及び送信キュー＃２はスレッド＃２用である。仮想スイッチポート＃１は、図１Ａに示したｖポート＃１に対応する。
【００５４】
ＮＩＣ３は、物理ポート＃１で表される物理ポート３１を有する。物理ポート３１は、ハードウェア受信キュー＃１及びハードウェア受信キュー＃２で表されるハードウェア受信キュー３１ａと、フィルタ３１ｂと、ハードウェア送信キュー＃１及びハードウェア送信キュー＃２で表されるハードウェア送信キュー３１ｃとを有する。ハードウェア受信キュー＃１及びハードウェア送信キュー＃１はスレッド＃１用であり、ハードウェア受信キュー＃２及びハードウェア送信キュー＃２はスレッド＃２用である。物理ポート＃１は、図１Ａに示したｐＮＩＣ＃１に対応する。
【００５５】
スレッド２５は、ドライバ部４１と、仮想ポートハンドラ４２と、スレッド間通信ポート４３と、検索部４４と、中継部４５と、スレッド制御部４６とを有する。
【００５６】
ドライバ部４１は、仮想スイッチポート２４の読み書きを行う。ドライバ部４１は、受信キュー２４ａに格納された受信パケットを読み出して中継部４５に渡し、中継部４５から渡された送信パケットを送信キュー２４ｂに格納する。
【００５７】
仮想ポートハンドラ４２は、ＶＭ用仮想ポート２１の入出力を行う。仮想ポートハンドラ４２は、中継部４５から渡された受信パケットをＶＭ用仮想ポート２１に出力し、ＶＭ用仮想ポート２１から入力した送信パケットを中継部４５に渡す。
【００５８】
スレッド間通信ポート４３は、他のスレッド２５との通信に用いられるポートである。スレッド２５は、スレッド間通信ポート４３からパケット、通知等を他のスレッド２５に送信し、他のスレッド２５から送られてきたパケット、通知等をスレッド間通信ポート４３で受信する。
【００５９】
検索部４４は、中継部４５からの指示に基づいて、フローテーブル群２２及びフローキャッシュ２３を用いて受信パケットに対するアクションを特定し、特定したアクションを中継部４５に通知する。検索部４４は、フローキャッシュ２３に受信パケットのフロー情報とマッチするエントリがある場合には、当該エントリのアクションを中継部４５に通知する。一方、フローキャッシュ２３に受信パケットのフロー情報とマッチするエントリがない場合には、検索部４４は、フローテーブル群２２を用いてフロー情報に対応するアクションを特定し、特定したアクションをフロー情報とともにフローキャッシュ２３に登録する。
【００６０】
検索部４４は、登録部４４ａと判断部４４ｂを有する。登録部４４ａは、新たなエントリをフローキャッシュ２３に登録する。判断部４４ｂは、登録部４４ａが新たなエントリをフローキャッシュ２３に登録する際に、エントリのアクションで指定される出力先が他のＮＵＭＡノード１のＶＭ用仮想ポート２１であるか否かを判断し、判断結果を登録部４４ａと中継部４５に通知する。登録部４４ａは、出力先が他のＮＵＭＡノード１のＶＭ用仮想ポート２１である場合には、出力先を他のＮＵＭＡノード１に対応するスレッド２５に変更してフローキャッシュ２３に登録する。
【００６１】
図５は、フローキャッシュ登録の例を示す図である。図５に示すように、受信パケットのフロー情報と、フローテーブル群２２から特定されたアクションリストとから新たなエントリがフローキャッシュ２３に登録される際に、判断部４４ｂは、エントリが所定の条件を満たすか否かを判断する。ここで、所定の条件とは、Ｉｎ＿ｐｏｒｔ．ｔｙｐｅ＝物理ポートかつＯｕｔ＿ｐｏｒｔ．ｔｙｐｅ＝ＶＭ用仮想ポートかつＩｎ＿ｐｏｒｔ．ｎｕｍａ＿ｎｏｄｅ！＝Ｏｕｔ＿ｐｏｒｔ．ｎｕｍａ＿ｎｏｄｅである。
【００６２】
Ｉｎ＿ｐｏｒｔは受信ポートであり、Ｏｕｔ＿ｐｏｒｔは出力先のポートである。ｔｙｐｅはポートの種別であり、ｎｕｍａ＿ｎｏｄｅは、ＮＵＭＡノード１の番号である。すなわち、判断部４４ｂは、受信ポートの種別が「物理ポート」であり、かつ、出力先のポートの種別が「ＶＭ用仮想ポート」であり、かつ、出力先のポートのＮＵＭＡノード１の番号と受信ポートのＮＵＭＡノード１の番号が異なるかを判定する。そして、登録部４４ａは、所定の条件が満たされている場合に、アクションの出力先をＯｕｔ＿ｐｏｒｔ．ｎｕｍａ＿ｎｏｄｅに対応するスレッド２５に変更してフローキャッシュ２３に登録する。
【００６３】
図５では、所定の条件が満たされると、フローテーブル群２２から出力先として特定されたＶＭ用仮想ポート＃２（Ｏｕｔｐｕｔ：２）がスレッド＃２（Ｏｕｔｐｕｔ：Ｔｈｒｅａｄ２）に変更されてフローキャッシュ２３の番地Ｋに登録される。ここで、Ｋは、受信パケットのフロー情報から計算されたハッシュ値である。
【００６４】
図３に戻って、中継部４５は、検索部４４から通知されたアクションに基づいて、受信パケットを処理する。中継部４５は、アクションの出力先がＶＭ用仮想ポート＃１であるパケットを仮想ポートハンドラ４２に渡す。また、中継部４５は、受信パケットが所定の条件を満たすとの判断結果を判断部４４ｂから受け取ると、キュー切替手順の実行をスレッド制御部４６に指示する。
【００６５】
スレッド制御部４６は、スレッド間通信ポート４３を用いてキュー切替手順を実行する。具体的には、スレッド制御部４６は、キュー切替通知を切替先のスレッド２５に通知し、ＮＩＣ３のフィルタ３１ｂにキュー切替対象フローの宛先として切替先スレッド２５に対応するハードウェア受信キュー３１ａを登録する。そして、スレッド制御部４６は、受信キュー２４ａ及びハードウェア受信キュー３１ａからキュー切替対象フローのパケットを読み出して切替先スレッド２５に転送する。そして、スレッド制御部４６は、切替が完了すると、キュー切替完了通知を切替先のスレッド２５に通知する。
【００６６】
スレッド制御部４６は、ＮＩＣ３のフィルタ３１ｂの設定後、キュー切替対象フローの処理において、以下２つのどちらかの条件を満たした場合に切替完了と判断する。
（１）受信キュー２４ａからの読み出し時に読み出しデータが存在しない（受信パケットがない)
（２）受信キュー２４ａ及び対応するハードウェア受信キュー３１ａのキュー長の合計数分のパケットの処理を実行
【００６７】
上記（１）については、受信キュー２４ａからの読み出し時に受信パケットが存在しない場合は、新たな到着パケットがない状態であり、ＮＩＣ３のフィルタ３１ｂの設定時の受信済パケットを全て処理済であることを意味する。したがって、ハードウェア受信キュー３１ａ／受信キュー２４ａにおけるフローの処理が完了したと判断可能である。
【００６８】
上記（２）については、あるフローの受信をハードウェア受信キュー＃１からハードウェア受信キュー＃２に切替設定（フィルタ３１ｂの設定）後、当該フローのパケットが新たにハードウェア受信キュー＃１及び対応する受信キュー＃１に格納されることはない。したがって、フィルタ３１ｂの設定時、ハードウェア受信キュー＃１及び対応する受信キュー＃１に受信済のパケット数は高々Ｓｉｚｅ（ハードウェア受信キュー＃１）＋Ｓｉｚｅ（受信キュー＃１）である。ここで、Ｓｉｚｅ（Ｑ）は、キューＱの最大長である。したがって、Ｓｉｚｅ（ハードウェア受信キュー＃１）＋Ｓｉｚｅ（受信キュー＃１）個のパケットを処理した後にキュー切替対象フローのパケットがハードウェア受信キュー３１ａ／受信キュー２４ａに格納されていることはないと判断可能である。
【００６９】
また、スレッド制御部４６は、他のスレッド２５からキュー切替通知を受信すると、キュー切替対象のフローの受信ポートの受信処理を中断し、キュー切替通知に含まれるフローとアクションをフローキャッシュ２３に登録する。また、スレッド制御部４６は、他のスレッド２５からパケットを転送されると、フローキャッシュ２３に基づいてパケットを処理する。また、スレッド制御部４６は、他のスレッド２５からキュー切替完了通知を受信すると、キュー切替対象フローの受信ポートの受信処理を再開する。
【００７０】
なお、図３では２つのスレッド２５を示したが、スレッド２５は３つ以上あってもよい。また、図３では、１つのＮＩＣ３を示したが、ＮＩＣ３、物理ポート３１および物理ポート３１に対応する仮想スイッチポート２４は複数あってもよい。また、図３では、各ＮＵＭＡノード１に対して１つのＶＭ用仮想ポート２１を示したが、各ＮＵＭＡノード１に対してＶＭ用仮想ポート２１は複数あってもよい。
【００７１】
図６Ａ及び図６Ｂは、スレッド制御パケットの例を示す図である。ここで、スレッド制御パケットとは、スレッド間通信ポート４３を用いて送受信されるパケットである。図６Ａ（ａ）は基本フォーマットを示し、図６Ａ（ｂ）はキュー切替通知の例を示し、図６Ｂ（ｃ）はキュー切替完了通知の例を示し、図６Ｂ（ｄ）はデータ転送パケットの例を示す。
【００７２】
図６Ａ（ａ）に示すように、スレッド制御パケットには、２Ｂ（バイト）のＴＹＰＥと、２ＢのＬｅｎｇｔｈと、４ＢのＨａｓｈ  Ｖａｌｕｅと、ＬｅｎｇｔｈバイトのＰａｙｌｏａｄが含まれる。
【００７３】
ＴＹＰＥは、スレッド制御パケットの種別を示し、キュー切替通知の場合は'ｓｔａｒｔ'であり、キュー切替完了通知の場合は'ｃｏｍｐ'であり、データ転送の場合は'ｄａｔａ'である。Ｌｅｎｇｔｈは、本スレッド制御パケットのＰａｙｌｏａｄ部のサイズ（バイト数）である。Ｈａｓｈ  Ｖａｌｕｅは、通知フローのフロー情報のハッシュ値である。Ｐａｙｌｏａｄは、通知データであり、ＴＹＰＥ毎に異なる内容を含む。
【００７４】
図６Ａ（ｂ）に示すように、キュー切替通知の場合には、Ｐａｙｌｏａｄにはキュー切替対象フローのフローキャッシュエントリ情報（アクション書換え前）が含まれる。また、図６Ｂ（ｃ）に示すように、キュー切替完了通知の場合には、Ｐａｙｌｏａｄにはキュー切替対象フローのフロー情報が含まれる。また、図６Ｂ（ｄ）に示すように、スレッド２５間のデーテ転送パケットの場合には、Ｐａｙｌｏａｄにはキュー切替対象フローのフロー情報と転送パケットが含まれる。
【００７５】
次に、スレッド２５による処理の手順について説明する。スレッド２５による処理の手順では、キュー切替手順によって移行されるフローの情報が２つの移行管理テーブルを用いて管理される。図７は、移行管理テーブルの例を示す図である。図７では、２つの移行管理テーブルは、移行管理テーブルＡと移行管理テーブルＢと表される。
【００７６】
移行管理テーブルＡは、移行元スレッド２５において、移行中のフローの情報を保持するために用いられる。具体的には、移行管理テーブルＡには、移行中のフローに対応する宛先スレッド２５及び完了判断に用いられるカウント値が保持される。カウント値の初期値は、移行元のＳｉｚｅ（ハードウェア受信キュー３１ａ）＋Ｓｉｚｅ（受信キュー２４ａ）であり、カウント値は、受信キュー２４ａのパケットが処理される毎に１引かれる。例えば、Ｆｌｏｗ＿Ａについては、宛先スレッド２５の番号は２であり、カウント値は５１２である。
【００７７】
移行管理テーブルＢは、移行先スレッド２５において、移行中のフローに対応する受信ポートの情報を保持するために用いられる。具体的には、移行管理テーブルＢには、サスペンドポート番号と移行中フロー数が保持される。サスペンドポート番号は、移行中のフローの存在により受信処理を停止中のポートの番号である。移行中フロー数は、停止中のポートの関連するフローの数である。移行中フロー数が０にならないと当該ポートの受信処理は再開されない。
【００７８】
図８は、スレッド２５による受信処理の手順を示すフローチャートである。図８に示すように、スレッド２５は、処理対象のキューの情報を取得する（ステップＳ１）。すなわち、ｑｌｉｓｔ［ｉ］をキューｑの情報とする。ここで、ｑｌｉｓｔ［］はキューの情報を記憶するリストであり、ｉの初期値は０であり、ｑの情報及びｑｌｉｓｔ［］は構造体である。
【００７９】
そして、スレッド２５は、ｑはスレッド間通信ポート４３であるか否かを判定し（ステップＳ２）、ｑがスレッド間通信ポート４３でない場合には、ｑの状態が停止中（サスペンド）であるか否かを判定する（ステップＳ３）。そして、ｑの状態が停止中でない場合には、スレッド２５は、ｑに受信パケットがあるか否かを判定する（ステップＳ４）。
【００８０】
そして、ｑに受信パケットがある場合には、スレッド２５は、ｑからパケットを１つ読み出してＰとし、受信パケットＰからフロー情報を抽出してＦとし、フロー情報Ｆからハッシュ値を計算してＨ（Ｆ）とする（ステップＳ５）。そして、スレッド２５は、Ｈ（Ｆ）を用いてフローキャッシュ２３を参照し、Ｆに対応するエントリがあるかを確認する（ステップＳ６）。
【００８１】
そして、スレッド２５は、フローキャッシュ２３にＦのエントリがあるか否かを判定し（ステップＳ７）、フローキャッシュ２３にＦのエントリがある場合には、当該エントリで指定されるアクションを実行する（ステップＳ８）。そして、スレッド２５は、移行管理テーブルＡを参照し、ｑに移行中のフローがある場合は移行中フローのエントリのカウント値をデクリメントし、カウント値が０になったエントリに対応する宛先スレッド２５にキュー切替完了通知を送信し、当該エントリを削除する（ステップＳ９）。
【００８２】
そして、スレッド２５は、ｉに１を加え（ステップＳ１０）、ｉがＮＮに等しい場合にはｉに０を設定する（ステップＳ１１）。ここで、ＮＮは、スレッド間通信ポート４３を含むポートの数である。そして、スレッド２５は、ステップＳ１に戻る。
【００８３】
また、ステップＳ７において、フローキャッシュ２３にＦのエントリがない場合には、スレッド２５は、フローテーブル群２２を参照してフローキャッシュ２３にＦのエントリを登録するフローテーブルルックアップ処理を実行する（ステップＳ１２）。そして、スレッド２５は、ステップＳ９に移動する。
【００８４】
また、ステップＳ４にいてｑに受信パケットがない場合、及び、ステップＳ３においてｑの状態が停止中である場合には、スレッド２５は、ステップＳ１０に移動する。また、ステップＳ２において、ｑはスレッド間通信ポート４３である場合には、スレッド２５は、スレッド制御パケットを処理するスレッド制御パケット処理を実行し（ステップＳ１３）、ステップＳ１０に移動する。
【００８５】
このように、スレッド２５は、受信ポートを順番に繰り返し処理することで、受信パケットを処理することができる。
【００８６】
図９は、フローテーブルルックアップ処理の手順を示すフローチャートである。図９に示すように、スレッド２５は、フロー情報Ｆを用いてフローパイプラインを実行し、Ｆに対応するアクションリストＡＬを取得する（ステップＳ２１）。そして、スレッド２５は、ＡＬが空リストであるか否かを判定し（ステップＳ２２）、ＡＬが空リストでない場合には、Ｆから入力ポート番号Ｐｉを取得し、ＡＬから出力ポート番号Ｐｏを取得する（ステップＳ２３）。
【００８７】
そして、スレッド２５は、ｐｏｒｔ＿ｌｉｓｔ［Ｐｉ］をＩｎ＿Ｐｏｒｔとし、ｐｏｒｔ＿ｌｉｓｔ［Ｐｏ］をＯｕｔ＿Ｐｏｒｔとする（ステップＳ２４）。ここで、ｐｏｒｔ＿ｌｉｓｔ［］は、ポートの情報であり、構造体である。そして、スレッド２５は、以下の条件を全て満たすか確認する（ステップＳ２５）。以下の条件とは、Ｉｎ＿ｐｏｒｔ．ｔｙｐｅ＝物理ポート、Ｏｕｔ＿ｐｏｒｔ．ｔｙｐｅ＝ＶＭ用仮想ポート、及び、Ｉｎ＿ｐｏｒｔ．ｎｕｍａ＿ｎｏｄｅ！＝Ｏｕｔ＿ｐｏｒｔ．ｎｕｍａ＿ｎｏｄｅである。
【００８８】
そして、スレッド２５は、全ての条件を満たすか否かを判定する（ステップＳ２６）。そして、全ての条件を満たす場合には、スレッド２５は、ＮＩＣ３のＯｕｔ＿ｐｏｒｔ．ｎｕｍａ＿ｎｏｄｅに対応するハードウェア受信キュー３１ａの情報を取得し、当該フローの出力先を当該ハードウェア受信キュー３１ａとするようにＮＩＣ３のフィルタ３１ｂを設定する（ステップＳ２７）。
【００８９】
そして、スレッド２５は、Ｏｕｔ＿ｐｏｒｔから切替先スレッド情報を取得し、フロー情報Ｆから生成されたキュー切替通知を当該スレッド２５に送信し、ＡＬ中のアウトプットアクションの出力先を当該スレッドに変更する（ステップＳ２８）。ここで、アウトプットアクションとは、アクションのうち受信パケットの出力を行うアクションである。
【００９０】
そして、スレッド２５は、移行管理テーブルＡに当該フローのエントリを追加し、カウント値を初期化する（ステップＳ２９）。そして、スレッド２５は、フロー情報Ｆ及びアクションリストＡＬをフローキャッシュ２３のハッシュ値Ｈ（Ｆ）で参照されるエントリに登録する（ステップＳ３０）。
【００９１】
また、スレッド２５は、ステップＳ２６において満たさない条件がある場合には、ステップＳ３０に移動し、ステップＳ２２においてＡＬが空リストである場合には、規定の初期動作を実行する（ステップＳ３１）。ここで、規定の初期動作とは、例えば、当該パケットを廃棄することである。
【００９２】
このように、スレッド２５は、全ての条件が満たされた場合に、Ｏｕｔ＿Ｐｏｒｔに基づいてフィルタ３１ｂの設定、キュー切替通知の送信、アウトプットアクションの出力先の変更を行うことによって、受信キュー２４ａを切り替えることができる。
【００９３】
図１０は、スレッド制御パケット処理の手順を示すフローチャートである。図１０に示すように、スレッド２５は、スレッド制御パケットＰのＴＹＰＥを確認する（ステップＳ４１）。そして、スレッド２５は、ＴＹＰＥが'ｓｔａｒｔ'であるか否かを判定し（ステップＳ４２）、ＴＹＰＥが'ｓｔａｒｔ'である場合には、キュー切替通知を受信した場合の処理として切替通知処理を実行する（ステップＳ４３）。
【００９４】
また、ＴＹＰＥが'ｓｔａｒｔ'でない場合には、スレッド２５は、ＴＹＰＥが'ｃｏｍｐ'であるか否かを判定する（ステップＳ４４）。そして、ＴＹＰＥが'ｃｏｍｐ'である場合には、スレッド２５は、キュー切替完了通知を受信した場合の処理として切替完了通知処理を実行する（ステップＳ４５）。
【００９５】
また、ＴＹＰＥが'ｃｏｍｐ'でない場合には、スレッド２５は、ＴＹＰＥが'ｄａｔａ'であるか否かを判定する（ステップＳ４６）。そして、ＴＹＰＥが'ｄａｔａ'である場合には、スレッド２５は、スレッド２５間のデータ転送パケットを受信した場合の処理としてデータ転送処理を実行する（ステップＳ４７）。
【００９６】
また、ＴＹＰＥが'ｄａｔａ'でない場合には、スレッド２５は、対象外パケットのため、例外処理を実行する（ステップＳ４８）。例外処理としては、エラー処理等がある。
【００９７】
図１１は、切替通知処理の手順を示すフローチャートである。図１１に示すように、スレッド２５は、キュー切替通知Ｐからキュー切替対象フローのフロー情報ＦとアクションリストＡＬを抽出する（ステップＳ５１）。そして、スレッド２５は、フロー情報Ｆから入力ポート番号ＰＮを抽出し、移行管理テーブルＢの当該ポートエントリの移行中フロー数を１増加する（ステップＳ５２）。
【００９８】
そして、スレッド２５は、入力ポート番号ＰＮに対応する受信キュー情報を取得し、当該キューの状態をサスペンドに変更する（ステップＳ５３）。そして、スレッド２５は、キュー切替通知Ｐからフロー情報Ｆのハッシュ値Ｈ（Ｆ）を抽出し（ステップＳ５４）、フローキャッシュ２３のＨ（Ｆ）で参照されるエントリにＦとＡＬを登録する（ステップＳ５５）。
【００９９】
このように、フローキャッシュ２３のＨ（Ｆ）で参照されるエントリにＦとＡＬを登録することで、移行先スレッド２５は、受信キュー２４ａが切り替えられたパケットを宛先のＶＭに送信することができる。
【０１００】
図１２は、切替完了通知処理の手順を示すフローチャートである。図１２に示すように、スレッド２５は、キュー切替完了通知Ｐからキュー切替対象フローのフロー情報Ｆを抽出する（ステップＳ６１）。そして、スレッド２５は、フロー情報Ｆから入力ポート番号ＰＮを抽出し、移行管理テーブルＢの当該ポートエントリの移行中フロー数を１減算する（ステップＳ６２）。
【０１０１】
そして、スレッド２５は、当該エントリの移行中フロー数が０になった場合、入力ポート番号ＰＮに対応する受信キュー情報を取得し、当該キューの状態をアクティブに変更し、当該エントリを削除する（ステップＳ６３）。
【０１０２】
このように、移行先スレッド２５は、当該エントリの移行中フロー数が０になった場合、入力ポート番号ＰＮに対応するキューの状態をアクティブに変更することでＮＩＣ３からのパケット受信を再開することができる。
【０１０３】
図１３は、データ転送処理の手順を示すフローチャートである。図１３に示すように、スレッド２５は、データ転送パケットからハッシュ値Ｈ（Ｆ）と転送パケットＰｐを抽出する（ステップＳ７１）。そして、スレッド２５は、フローキャッシュ２３のＨ（Ｆ）で参照されるエントリからアクションリストを取得し、転送パケットＰｐに対してアクションを実行する（ステップＳ７２）。
【０１０４】
このように、移行先スレッド２５は、転送パケットＰｐに対してフローキャッシュ２３に登録されたアクションを実行することで、キュー切替前に移行元で受信されたパケットを適切に処理することができる。
【０１０５】
上述してきたように、実施例では、スレッド＃１が、ＶＭ用仮想ポート＃２宛のフローについてＮＩＣ３のフィルタ３１ｂをハードウェア受信キュー＃２に設定し、キュー切替をスレッド＃２に通知する。そして、スレッド＃１は、当該フローについて、ハードウェア受信キュー＃１及び受信キュー＃１にあるパケットをスレッド＃２に送信する。そして、スレッド＃２は、当該フローについて、キュー切替の通知を受信すると、仮想スイッチポート＃１の受信処理を一時停止し、スレッド＃１から送信されたパケットを処理後に、仮想スイッチポート＃１の受信処理を再開する。したがって、情報処理装置１０は、ＮＩＣ３が受信したパケットを宛先ＶＭが動作するＮＵＭＡノード＃２にＤＭＡ転送するようにフィルタ３１ｂの設定を動的に切り替えることができ、かつ、パケットを受信した順番で宛先ＶＭに送信することができる。
【０１０６】
また、実施例では、スレッド＃１は、当該フローについて、フローキャッシュ＃１にエントリを登録する際に、ＮＩＣ３のフィルタ３１ｂをハードウェア受信キュー＃２に設定する必要があるか否かを判定する。そして、スレッド＃１は、必要と判定した場合に、当該フローについて、該エントリの出力先をスレッド＃２に変更し、ＮＩＣ３のフィルタ３１ｂをハードウェア受信キュー＃２に設定し、キュー切替をスレッド＃２に通知する。そして、スレッド＃１は、当該フローについて、ハードウェア受信キュー＃１及び受信キュー＃１にあるパケットをスレッド＃２に送信する。したがって、情報処理装置１０は、当該フローの最初のパケットを受信した際にキュー切替手順を実行することができる。
【０１０７】
また、実施例では、スレッド＃１は、当該フローについて、ハードウェア受信キュー＃１及び受信キュー＃１にパケットがなくなった場合に、キュー切替完了をスレッド＃２に通知する。又は、スレッド＃１は、当該フローについて、Ｓｉｚｅ（ハードウェア受信キュー＃１）＋Ｓｉｚｅ（受信キュー＃１）の数のパケットをスレッド＃２に送信した場合にキュー切替完了をスレッド＃２に通知する。そして、スレッド＃２は、当該フローについて、キュー切替完了を通知されると、仮想スイッチポート＃１の受信処理を再開する。したがって、情報処理装置１０は、キュー切替後も当該フローの受信処理を継続することができる。
【０１０８】
また、実施例では、Ｉｎ＿ｐｏｒｔ．ｔｙｐｅ＝物理ポート、Ｏｕｔ＿ｐｏｒｔ．ｔｙｐｅ＝ＶＭ用仮想ポート、かつ、Ｉｎ＿ｐｏｒｔ．ｎｕｍａ＿ｎｏｄｅ！＝Ｏｕｔ＿ｐｏｒｔ．ｎｕｍａ＿ｎｏｄｅである場合に、キュー切替手順の実行が必要と判定する。したがって、情報処理装置１０は、キュー切替の必要性を正確に判定することができる。
【符号の説明】
【０１０９】
１    ＮＵＭＡノード
２    仮想スイッチ
３    ＮＩＣ
４    受信バッファ
１０    情報処理装置
２１    ＶＭ用仮想ポート
２２    フローテーブル群
２３    フローキャッシュ
２４    仮想スイッチポート
２４ａ    受信キュー
２４ｂ    送信キュー
２５    スレッド
３１    物理ポート
３１ａ    ハードウェア受信キュー
３１ｂ    フィルタ
３１ｃ    ハードウェア送信キュー
４１    ドライバ部
４２    仮想ポートハンドラ
４３    スレッド間通信ポート
４４    検索部
４４ａ    登録部
４４ｂ    判断部
４５    中継部
４６    スレッド制御部
【図１Ａ】
2018185624.tif 000003
【図１Ｂ】
2018185624.tif 000004
【図２Ａ】
2018185624.tif 000005
【図２Ｂ】
2018185624.tif 000006
【図３】
2018185624.tif 000007
【図４】
2018185624.tif 000008
【図５】
2018185624.tif 000009
【図６Ａ】
2018185624.tif 000010
【図６Ｂ】
2018185624.tif 000011
【図７】
2018185624.tif 000012
【図８】
2018185624.tif 000013
【図９】
2018185624.tif 000014
【図１０】
2018185624.tif 000015
【図１１】
2018185624.tif 000016
【図１２】
2018185624.tif 000017
【図１３】
2018185624.tif 000018
【図１４】
2018185624.tif 000019
【図１５】
2018185624.tif 000020