(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-05-16
(45)【発行日】2023-05-24
(54)【発明の名称】情報処理装置、情報処理方法および仮想マシン接続管理プログラム
(51)【国際特許分類】
H04L 47/125 20220101AFI20230517BHJP
H04L 47/50 20220101ALI20230517BHJP
【FI】
H04L47/125
H04L47/50
(21)【出願番号】P 2019170412
(22)【出願日】2019-09-19
【審査請求日】2022-06-09
(73)【特許権者】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002918
【氏名又は名称】弁理士法人扶桑国際特許事務所
(72)【発明者】
【氏名】兵頭 和樹
【審査官】宮島 郁美
(56)【参考文献】
【文献】特開2015-039166(JP,A)
【文献】米国特許出願公開第2015/0033222(US,A1)
【文献】中国特許出願公開第104348694(CN,A)
【文献】特開2018-137616(JP,A)
【文献】特表2013-535711(JP,A)
【文献】米国特許出願公開第2013/0125125(US,A1)
【文献】特開2017-045089(JP,A)
【文献】米国特許出願公開第2017/0063701(US,A1)
【文献】米国特許出願公開第2018/0095750(US,A1)
【文献】中国特許出願公開第109690475(CN,A)
【文献】米国特許出願公開第2019/0044892(US,A1)
【文献】韓国公開特許第10-2017-0057770(KR,A)
(58)【調査した分野】(Int.Cl.,DB名)
H04L12/00-13/18,41/00-49/9057,61/00-65/80,69/00-69/40
(57)【特許請求の範囲】
【請求項1】
自装置で動作する仮想マシンを宛先とするデータが書き込まれる受信バッファを備えるメモリと、
仮想スイッチの中継処理のオフロード先である第1のコプロセッサに、前記受信バッファの第1の記憶領域を継続的に割り当て、前記仮想スイッチの拡張処理のオフロード先である第2のコプロセッサにも、前記第2のコプロセッサから前記受信バッファの割当要求を受け付けたときに、前記受信バッファの第2の記憶領域を割り当てるプロセッサと、
を有する情報処理装置。
【請求項2】
前記プロセッサは、
前記第1の記憶領域の少なくとも一部の領域が解放されると、解放された領域のサイズに応じた追加の記憶領域を前記第1のコプロセッサに割り当て、
前記受信バッファの記憶領域の割り当て順に、前記記憶領域に書き込まれたデータを処理し、処理済の前記記憶領域を解放する、
請求項1記載の情報処理装置。
【請求項3】
前記プロセッサは、前記第2のコプロセッサに、前記割当要求で要求されるサイズの前記第2の記憶領域を割り当てる、
請求項1または2記載の情報処理装置。
【請求項4】
前記仮想マシンを宛先とする前記データを受信すると、前記データが前記拡張処理の対象であるか否かを判定し、前記データが前記拡張処理の対象である場合に前記第2のコプロセッサに前記データを転送し、前記データが前記拡張処理の対象でない場合に前記データを前記第1の記憶領域に書き込む前記第1のコプロセッサと、
前記第1のコプロセッサから前記拡張処理の対象の前記データを受信し、前記データに対して前記拡張処理を行い、前記拡張処理後の前記データを前記第2の記憶領域に書き込む前記第2のコプロセッサと、
を更に有する請求項1乃至3の何れか1項に記載の情報処理装置。
【請求項5】
前記第2のコプロセッサは、前記第1のコプロセッサから前記拡張処理の対象の前記データを受信すると、前記データに対する前記拡張処理を開始するとともに、前記割当要求を前記プロセッサに通知する、
請求項4記載の情報処理装置。
【請求項6】
前記プロセッサは、前記第1のコプロセッサによる前記受信バッファに対する前記データの書き込み、または、前記第2のコプロセッサによる前記受信バッファに対する前記拡張処理後の前記データの書き込みを検出すると、前記仮想マシンにより参照される、前記受信バッファのうちの書き込み済の記憶領域を示す情報を更新することで、前記仮想マシンに前記書き込み済の記憶領域を通知する、
請求項1乃至5の何れか1項に記載の情報処理装置。
【請求項7】
前記受信バッファは、シングルキューである、
請求項1乃至6の何れか1項に記載の情報処理装置。
【請求項8】
コンピュータが、
仮想スイッチの中継処理のオフロード先である第1のコプロセッサに、前記コンピュータで動作する仮想マシンを宛先とするデータが書き込まれる受信バッファの第1の記憶領域を継続的に割り当て、
前記仮想スイッチの拡張処理のオフロード先である第2のコプロセッサにも、前記第2のコプロセッサから前記受信バッファの割当要求を受け付けたときに、前記受信バッファの第2の記憶領域を割り当てる、
情報処理方法。
【請求項9】
コンピュータに、
仮想スイッチの中継処理のオフロード先である第1のコプロセッサに、前記コンピュータで動作する仮想マシンを宛先とするデータが書き込まれる受信バッファの第1の記憶領域を継続的に割り当て、
前記仮想スイッチの拡張処理のオフロード先である第2のコプロセッサにも、前記第2のコプロセッサから前記受信バッファの割当要求を受け付けたときに、前記受信バッファの第2の記憶領域を割り当てる、
処理を実行させる仮想マシン接続管理プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は情報処理装置、情報処理方法および仮想マシン接続管理プログラムに関する。
【背景技術】
【0002】
情報処理の分野では、物理的なコンピュータ(物理マシンや物理ホストと呼ぶことがある)上で、複数の仮想的なコンピュータ(仮想マシンや仮想ホストと呼ぶことがある)を動作させる仮想化技術が利用されている。各仮想マシン上では、OS(Operating System)などのソフトウェアを実行できる。仮想化技術を利用する物理マシンは、複数の仮想マシンを管理するためのソフトウェアを実行する。例えば、ハイパーバイザと呼ばれるソフトウェアが、CPU(Central Processing Unit)の処理能力やRAM(Random Access Memory)の記憶領域を、演算のリソースとして複数の仮想マシンに割り振ることがある。
【0003】
仮想マシンは、ハイパーバイザに実装される仮想スイッチと呼ばれるデータの中継機能を介して、他の仮想マシンや他の物理マシンと通信することがある。例えば、仮想スイッチのタスクを、ホストマシンからネットワークインタフェースカード(NIC:Network Interface Card)へオフロードすることで、ホストマシン上の演算負荷を軽減する提案がある。
【0004】
なお、ホストOSとゲストOSの通信路中に負荷分散用の新仮想マシンを配備する際、ホストOS上のバックエンドドライバを、バッファ内容を保持して新仮想マシン上で動作させることで、通信途中の状態を維持して負荷分散機能を動的に配備する提案もある。
【先行技術文献】
【特許文献】
【0005】
【文献】特開2015-39166号公報
【文献】特開2016-170669号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
仮想スイッチの機能は、物理マシンのプロセッサからFPGA(Field-Programmable Gate Array)やスマートNICなどのコプロセッサにオフロードされ得る。
ここで、仮想スイッチは、中継機能に加えて、暗号処理やデータ圧縮などの拡張機能を実行することがある。一方、コプロセッサの演算リソースは比較的小さく、中継機能および拡張機能の両方を単一のコプロセッサにオフロードするのが難しいことがある。そこで、中継機能と拡張機能とを各々別個のコプロセッサにオフロードすることが考えられる。
【0007】
仮想マシンがアクセスする、RAM上の受信バッファは単一のキュー(シングルキュー)により実現され得る。例えば、各機能のオフロード先の複数のコプロセッサのうち、主たる機能である中継機能を担うコプロセッサのみが、物理マシン上の仮想マシンを宛先とする受信データを受信バッファに書き込む処理を担当することが考えられる。この場合、中継機能を担うコプロセッサは、受信データのうち拡張処理対象の受信データを、拡張機能を担う他のコプロセッサに送信し、拡張処理後の受信データを他のコプロセッサから取得して、宛先の仮想マシンの受信バッファに書き込む。
【0008】
ところが、この方法では、拡張処理対象の受信データに関して、物理マシンの内部バス上で、一方のコプロセッサから他方のコプロセッサへ、および、他方のコプロセッサから一方のコプロセッサへ、コプロセッサ間の折り返しの通信が発生する。このため、内部バスを流れるデータ量が増して内部バスが高負荷となり、物理マシン全体の性能が低下する可能性がある。
【0009】
1つの側面では、本発明は、バス上を流れるデータ量を削減することができる情報処理装置、情報処理方法および仮想マシン接続管理プログラムを提供することを目的とする。
【課題を解決するための手段】
【0010】
1つの態様では、情報処理装置が提供される。この情報処理装置は、メモリとプロセッサとを有する。メモリは、自装置で動作する仮想マシンを宛先とするデータが書き込まれる受信バッファを備える。プロセッサは、仮想スイッチの中継処理のオフロード先である第1のコプロセッサに、受信バッファの第1の記憶領域を継続的に割り当て、仮想スイッチの拡張処理のオフロード先である第2のコプロセッサにも、第2のコプロセッサから受信バッファの割当要求を受け付けたときに、受信バッファの第2の記憶領域を割り当てる。
【0011】
また、1つの態様では、情報処理方法が提供される。
また、1つの態様では、仮想マシン接続管理プログラムが提供される。
【発明の効果】
【0012】
1つの側面では、バス上を流れるデータ量を削減することができる。
【図面の簡単な説明】
【0013】
【
図1】第1の実施の形態の情報処理装置の処理例を示す図である。
【
図2】第2の実施の形態の情報処理システムの例を示す図である。
【
図3】サーバのハードウェア例を示すブロック図である。
【
図5】仮想スイッチのオフロードの例を示す図である。
【
図6】中継機能および拡張機能のオフロードの例を示す図である。
【
図10】調停部による分配処理の例を示す図である。
【
図11】調停部による分配処理の例(続き)を示す図である。
【
図12】調停部による調停処理の例を示す図である。
【
図13】調停部による調停処理の例(続き)を示す図である。
【
図14】中継機能用FPGAの処理の例を示すフローチャートである。
【
図15】拡張機能用FPGAの処理の例を示すフローチャートである。
【
図16】中継機能用FPGAに対する分配処理の例を示すフローチャートである。
【
図17】拡張機能用FPGAに対する分配処理の例を示すフローチャートである。
【
図18】調停処理の例を示すフローチャートである。
【
図19】仮想マシンの受信処理の例を示すフローチャートである。
【
図21】バスを介する通信の比較例を示す図である。
【発明を実施するための形態】
【0014】
以下、本実施の形態について図面を参照して説明する。
[第1の実施の形態]
第1の実施の形態を説明する。
【0015】
図1は、第1の実施の形態の情報処理装置の処理例を示す図である。
情報処理装置1は、1または複数の仮想マシンを実行する。情報処理装置1は、例えば、ハイパーバイザ(
図1では図示を省略している)を実行し、ハイパーバイザの機能により、情報処理装置1の演算リソースを、各仮想マシンに割り当てる。
【0016】
情報処理装置1は、ハードウェア10およびソフトウェア20を有する。ハードウェア10は、メモリ11、プロセッサ12、コプロセッサ13,14およびバス15を含む。メモリ11、プロセッサ12およびコプロセッサ13,14は、バス15に接続されている。また、ハードウェア10は、ネットワークに接続するNIC(図示を省略している)を含む。ソフトウェア20は、仮想マシン21を含む。ソフトウェア20は、ハイパーバイザ(図示を省略している)を含む。
【0017】
メモリ11は、例えばRAMなどの主記憶装置である。メモリ11は、受信バッファ11aを有する。受信バッファ11aは、仮想マシン21を宛先とするデータを記憶する。受信バッファ11aは、単一のキュー(シングルキュー)により実現される。受信バッファ11aには、コプロセッサ13,14の各々による書き込みが可能である。受信バッファは、仮想マシン毎に設けられる。情報処理装置1は、メモリ11に加えて、HDD(Hard Disk Drive)やSSD(Solid State Drive)などの補助記憶装置を有してもよい。
【0018】
プロセッサ12は、例えばCPUなどの演算装置である。プロセッサ12には、複数のプロセッサの集合(マルチプロセッサ)も含まれ得る。プロセッサ12は、メモリ11に記憶された、仮想マシン21やハイパーバイザなどのソフトウェアのプログラムを実行する。プロセッサ12は、コプロセッサ13,14の各々に対する受信バッファ11aの記憶領域の割り当てを制御する。
【0019】
コプロセッサ13,14は、プロセッサ12が実行する仮想スイッチの機能のオフロード先として用いられる補助演算装置である。コプロセッサ13,14は、プロセッサ12により割り当てられた受信バッファ11aの記憶領域に対して、コプロセッサ13,14の各々によるデータの直接の書き込みが可能である。コプロセッサ13,14は、例えば、FPGAやスマートNICなどにより実現される。仮想スイッチは、受信データの宛先の仮想マシンを特定する中継機能、および、受信データに対する暗号処理(暗号化または復号)やデータ圧縮処理(あるいは復元処理)などの拡張機能を有する。プロセッサ12は、仮想スイッチの中継機能をコプロセッサ13にオフロードする。プロセッサ12は、仮想スイッチの拡張機能をコプロセッサ14にオフロードする。オフロードによりプロセッサ12の負荷が軽減される。なお、仮想スイッチの拡張機能のオフロード先となるコプロセッサは複数でもよい。
【0020】
コプロセッサ13は、中継処理部13aを有する。中継処理部13aは、仮想スイッチの中継機能に関する処理(中継処理)を行う。中継処理部13aは、情報処理装置1のNIC上の物理ポート(図示を省略している)で受信されたデータを中継する。中継処理部13aは、自装置(すなわち、情報処理装置1)で動作する仮想マシン21を宛先とするデータを受信すると、当該データが拡張機能に関する処理(拡張処理)の対象であるか否かを判定する。中継処理部13aは、当該データが拡張処理の対象である場合に、当該データを、バス15を介して、コプロセッサ14に転送する。中継処理部13aは、物理ポートで受信された仮想マシン21を宛先とするデータのうち、拡張処理の対象外のデータを、コプロセッサ13に割り当てられた、受信バッファ11a内の記憶領域(コプロセッサ13の割当領域)に書き込む。データが拡張処理の対象であるか否かは、例えば、データに付加されるヘッダ情報などに対して予め定められた、コプロセッサ13により保持されるルール情報に基づいて判定される。
【0021】
コプロセッサ14は、拡張処理部14aを有する。拡張処理部14aは、コプロセッサ13から受信した拡張処理の対象のデータに対して拡張処理を行う。拡張処理は、例えば、前述の暗号処理(暗号化または復号)やデータの圧縮処理および圧縮済データの復元処理などである。コプロセッサ14は、拡張処理後のデータを、コプロセッサ14に割り当てられた、受信バッファ11a内の記憶領域(コプロセッサ14の割当領域)に書き込む。
【0022】
仮想マシン21は、メモリ11およびプロセッサ12などのリソースを用いて実現される。仮想マシン21は、コプロセッサ13,14にオフロードされた仮想スイッチの機能により、情報処理装置1または他の情報処理装置で動作する仮想マシン、あるいは、他の情報処理装置と通信する。仮想マシン21は、受信バッファ11aに格納された、仮想マシン21を宛先とするデータを取得し、当該データを処理する。仮想マシン21は、処理済のデータが格納された受信バッファ11aの記憶領域を解放する。仮想マシン21は、プロセッサ12により実行されるので、仮想マシン21による処理は、プロセッサ12により実行される処理であるとも言える。
【0023】
このように、情報処理装置1では、通常はプロセッサ12により実行される仮想スイッチの中継機能を、コプロセッサ13にオフロードし、当該中継機能に付随する、仮想スイッチの拡張機能をコプロセッサ14にオフロードする。そして、コプロセッサ13,14の両方から、仮想マシン21の受信バッファ11aに対して直接データを書き込み可能にする。
【0024】
そのため、プロセッサ12は、仮想スイッチの中継処理のオフロード先であるコプロセッサ13に、受信バッファ11aの第1の記憶領域を継続的に割り当てる。プロセッサ12は、仮想スイッチの拡張処理のオフロード先であるコプロセッサ14にも、コプロセッサ14から受信バッファ11aの割当要求を受け付けたときに、受信バッファ11aの第2の記憶領域を割り当てる。
【0025】
より具体的には、プロセッサ12は、コプロセッサ13に受信バッファ11aの第1の記憶領域を割り当て、第1の記憶領域の少なくとも一部の領域が解放されると、解放された領域のサイズに応じた追加の記憶領域をコプロセッサ13に割り当てる。プロセッサ12は、コプロセッサ14に対しては、コプロセッサ14から受信バッファ11aの割当要求を受け付けたときに、割当要求で要求されたサイズの第2の記憶領域を割り当てる。プロセッサ12は、例えば、仮想マシン21の機能により、受信バッファ11aの記憶領域の割当順に、記憶領域に書き込まれたデータを処理する。プロセッサ12は、処理済の記憶領域(すなわち、処理済のデータが格納されていた記憶領域)を解放する。
【0026】
次に、プロセッサ12によるコプロセッサ13,14への受信バッファ11aの割当の一例を示す。
図1では、コプロセッサ13を「コプロセッサ#1」、コプロセッサ14を「コプロセッサ#2」と表記することがある。
【0027】
例えば、プロセッサ12は、仮想マシン21が起動すると、メモリ11のうちの第1のサイズの領域を、仮想マシン21に対する受信バッファ11aとして割り当てる(ステップS1)。第1のサイズを、一例として、8とする。当初、受信バッファ11aの全ての領域は未割当領域である。受信バッファ11aの先頭を示すインデックス(あるいはアドレス)は0である。受信バッファ11aの終端を示すインデックスは8である。受信バッファ11aの未割当領域は、インデックスの小さい方から順番に、各コプロセッサに割り当てられる。
【0028】
プロセッサ12は、コプロセッサ13に受信バッファ11aの第1の記憶領域を割り当てる(ステップS2)。例えば、プロセッサ12は、コプロセッサ13に対して、予め定められた第2のサイズの領域を割り当てる。第2のサイズを、一例として、4とする。すると、プロセッサ12は、受信バッファ11aのうちインデックスiが0≦i<4に対応する記憶領域(第1の記憶領域)をコプロセッサ13に割り当てる。中継機能を担うコプロセッサ13から受信バッファ11aに書き込まれるデータは継続的に発生することが見込まれる。このため、プロセッサ12は、コプロセッサ13に対して割り当てられている記憶領域(第1の記憶領域)が第2のサイズになるように維持する。
【0029】
プロセッサ12は、コプロセッサ14から受信バッファ11aの割当要求を受け付ける。すると、プロセッサ12は、割当要求に含まれる要求サイズに応じた受信バッファ11aの第2の記憶領域を、コプロセッサ14に対して割り当てる(ステップS3)。コプロセッサ14に対しては必要分だけ記憶領域を割り当てることで、受信バッファ11aを効率的に利用できる。例えば、コプロセッサ14は、拡張処理の対象のデータを受信すると、拡張処理後のデータを書き込むための記憶領域を予約するために、受信バッファ11aの割当要求を、プロセッサ12に送信する。コプロセッサ14は、書き込み対象のデータに応じた要求サイズを含む割当要求により、プロセッサ12に指定する。ここでは、一例として、要求サイズが2であったとする。すると、プロセッサ12は、受信バッファ11aのうち4≦i<6に対応する記憶領域(第2の記憶領域)をコプロセッサ14に割り当てる。
【0030】
ここで、中継機能は拡張機能に付随する機能であり、中継処理部13aが受信した受信データの全てが拡張機能の対象になるわけではない。このため、プロセッサ12は、コプロセッサ14から割当要求があった場合に、要求サイズに応じた第2の記憶領域を、コプロセッサ14に割り当てる。
【0031】
なお、コプロセッサ14は、例えば、コプロセッサ13から拡張処理の対象のデータを受信すると、当該データに対する拡張処理を開始するとともに、受信バッファ11aの割当要求をプロセッサ12に通知してもよい。拡張処理には時間を要するため、拡張処理の開始とともに割当要求を通知することで、拡張処理後、拡張処理後のデータを受信バッファ11aに、迅速に書き込めるようになる。
【0032】
プロセッサ12(あるいは、プロセッサ12が実行する仮想マシン21)は、受信バッファ11aの記憶領域の割当順に、記憶領域に書き込まれたデータを処理する。すなわち、プロセッサ12は、FIFO(First In, First Out)の手順で、受信バッファ11aに書き込まれたデータを処理する。例えば、プロセッサ12は、受信バッファ11aの0≦i<2に対応する記憶領域にコプロセッサ13により書き込まれたデータを処理する。その後、プロセッサ12は、0≦i<2に対応する記憶領域を解放する(ステップS4)。プロセッサ12は、0≦i<2に対応する記憶領域(サイズ2)を解放したので、受信バッファ11aの終端のインデックスに2を加算する。すると、受信バッファ11aの先頭のインデックスは2となり、終端のインデックスは10となる。ここで、ステップS4で解放される記憶領域は、中継機能のオフロード先であるコプロセッサ13に割り当てられた第1の記憶領域の一部分である。このため、プロセッサ12は、解放した記憶領域のサイズ2に応じた、6≦i<8に対応する記憶領域を、コプロセッサ13に追加で割り当てる。このように、コプロセッサ13に対しては、常に、第2のサイズの第1の記憶領域が継続的に割り当てられる。
【0033】
続いて、プロセッサ12(あるいは、プロセッサ12が実行する仮想マシン21)は、例えば、2≦i<4に対応する記憶領域にコプロセッサ13により書き込まれたデータを処理する。更に、プロセッサ12(あるいは、プロセッサ12が実行する仮想マシン21)は、例えば、4≦i<6に対応する記憶領域にコプロセッサ14により書き込まれたデータを処理する。プロセッサ12は、2≦i<6に対応する記憶領域を解放する(ステップS5)。プロセッサ12は、2≦i<6(サイズ4)に対応する記憶領域を解放したので、受信バッファ11aの終端のインデックスに4を加算する。すると、受信バッファ11aの先頭インデックスは6となり、終端のインデックスは14となる。ここで、ステップS5で解放された2≦i<4に対応する記憶領域は、コプロセッサ13に割り当てられた第1の記憶領域の一部分である。このため、プロセッサ12は、解放した2≦i<4に対応する記憶領域のサイズ2に応じた、8≦i<10に対応する記憶領域を、コプロセッサ13に追加で割り当てる。以降、プロセッサ12は、上記の手順を繰り返す(ステップS3に類する処理は、コプロセッサ14から割当要求があったときに実行される)。
【0034】
このように、情報処理装置1によれば、仮想スイッチの中継処理のオフロード先である第1のコプロセッサに、受信バッファの第1の記憶領域が継続的に割り当てられる。仮想スイッチの拡張処理のオフロード先である第2のコプロセッサにも、第2のコプロセッサから受信バッファの割当要求を受け付けたときに、受信バッファの第2の記憶領域が割り当てられる。
【0035】
これにより、バス15上を流れるデータ量を削減することができる。
ここで、シングルキューである受信バッファ11aに受信順にデータを書き込み、仮想マシン21により順番に処理させるため、コプロセッサ13,14のうち、コプロセッサ13のみに、受信バッファ11aの記憶領域を割り当てることも考えられる。しかし、このようにすると、拡張処理対象の受信データをコプロセッサ13からコプロセッサ14に送信した後、受信バッファ11aに書き込むために、コプロセッサ14からコプロセッサ13に対する折り返しの通信が発生する。このため、バス15の帯域が多く消費されて、情報処理装置1の性能が低下する可能性がある。
【0036】
これに対し、コプロセッサ13,14の両方から受信バッファ11aへのデータの直接の書き込みを可能にすることが考えられる。コプロセッサ13,14の両方から受信バッファ11aへ直接書き込めれば、コプロセッサ13,14間の上記の折り返しの通信が生じなくなり、バス15の帯域の消費量を低減できる。しかし、このとき、受信バッファ11a(シングルキュー)を用いる仮想マシン21の処理への影響を及ぼさないようにするための実装方法が問題となる。仮想マシン側の改造を伴うとすると第三者提供の仮想マシンイメージが使用できなくなり、仮想化の利点である可搬性を損なうためである。
【0037】
そこで、プロセッサ12は、中継機能のオフロード先であるコプロセッサ13には、所定サイズの記憶領域を継続的に割り当てるようにし、コプロセッサ14に対しては、コプロセッサ14から割当要求があったときに、コプロセッサ14に記憶領域を割り当てる。
【0038】
コプロセッサ13に所定サイズの記憶領域を継続的に割り当てる理由は、中継機能を担うコプロセッサ13から受信バッファ11aに書き込まれるデータは継続的に発生することが見込まれるためである。また、コプロセッサ14に対しては、割当要求に応じて記憶領域を割り当てる理由は、中継機能は拡張機能に付随する機能であり、中継処理部13aが外部から受信したデータの全てが拡張機能の対象になるわけではないためである。
【0039】
例えば、単純に、コプロセッサ13,14の両方に、所定サイズの記憶領域を常に割り当てるように制御することも考えられる。しかし、受信バッファ11aをFIFOにより処理する場合、データ未書き込みの記憶領域よりも後ろにデータ書き込み済の他の記憶領域が存在すると、データ未書き込みの記憶領域が書き込み済にならなければ、他の記憶領域に書き込まれたデータを処理できない。したがって、例えば、コプロセッサ14の割当領域への書き込みが発生するまで、当該割当領域よりも後ろにあるコプロセッサ13の割当領域の書き込み済データに対する処理が遅延することがある。
【0040】
このため、プロセッサ12は、拡張機能のオフロード先であるコプロセッサ14に対しては、割当要求があったときに(すなわち、コプロセッサ14により所要されるときにだけ)、受信バッファ11aの記憶領域を割り当てることで、当該遅延を低減できる。
【0041】
こうして、情報処理装置1によれば、コプロセッサ13,14から受信バッファ11aへの直接の書き込みを可能にし、バス15上を流れるデータ量を削減することができる。また、バス15の帯域が多く消費されて、情報処理装置1の性能が低下する可能性を低減できる。
【0042】
[第2の実施の形態]
次に、第2の実施の形態を説明する。
図2は、第2の実施の形態の情報処理システムの例を示す図である。
【0043】
第2の実施の形態の情報処理システムは、サーバ100,200を有する。サーバ100,200は、ネットワーク50に接続されている。ネットワーク50は、例えば、LAN(Local Area Network)、WAN(Wide Area Network)またはインターネットなどである。
【0044】
サーバ100,200は、各々が仮想マシンを実行可能なサーバコンピュータである。サーバ100,200は、物理マシンや物理ホストなどと呼ばれてもよい。サーバ100上の仮想マシン、および、サーバ200上の仮想マシンは、ネットワーク50を介して相互に通信することができる。仮想マシンは、ネットワーク50に接続された他の物理マシン(図示を省略している)と通信することもできる。サーバ100上の仮想マシンは、サーバ100が実行する仮想スイッチに接続される。同様に、サーバ200上の仮想マシンは、サーバ200が実行する仮想スイッチに接続される。
【0045】
図3は、サーバのハードウェア例を示すブロック図である。
サーバ100は、CPU101、RAM102、HDD103、FPGA104,105、画像信号処理部106、入力信号処理部107、媒体リーダ108およびNIC109を有する。これらのハードウェアは、サーバ100のバス111に接続される。なお、CPU101は、第1の実施の形態のプロセッサ12に対応する。RAM102は、第1の実施の形態のメモリ11に対応する。
【0046】
CPU101は、プログラムの命令を実行するプロセッサである。CPU101は、HDD103に記憶されたプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを含んでもよい。また、サーバ100は複数のプロセッサを有してもよい。以下で説明する処理は複数のプロセッサまたはプロセッサコアを用いて並列に実行されてもよい。また、複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
【0047】
RAM102は、CPU101が実行するプログラムやCPU101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、サーバ100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
【0048】
HDD103は、OSやミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、サーバ100は、フラッシュメモリやSSDなどの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
【0049】
FPGA104,105は、仮想スイッチの機能のオフロード先として用いられるコプロセッサである。仮想スイッチは、受信パケットをサーバ100上の仮想マシンに中継する中継機能を有する。また、仮想スイッチは、受信パケットに対する暗号処理(暗号化/復号)やデータ圧縮・復元などの拡張機能を有する。拡張機能は、パケット加工やパケット制御などの処理を含むことがある。例えば、FPGA104は、仮想スイッチの中継機能がオフロードされ、当該中継機能に基づく中継処理を実行する。FPGA105は、仮想スイッチの拡張機能がオフロードされ、当該拡張機能に基づく拡張処理を実行する。FPGA104は、第1の実施の形態のコプロセッサ13の一例である。FPGA105は、第1の実施の形態のコプロセッサ14の一例である。
【0050】
画像信号処理部106は、CPU101からの命令に従って、サーバ100に接続されたディスプレイ51に画像を出力する。ディスプレイ51としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなど、任意の種類のディスプレイを用いることができる。
【0051】
入力信号処理部107は、サーバ100に接続された入力デバイス52から入力信号を取得し、CPU101に出力する。入力デバイス52としては、マウス・タッチパネル・タッチパッド・トラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、サーバ100に、複数の種類の入力デバイスが接続されていてもよい。
【0052】
媒体リーダ108は、記録媒体53に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体53として、例えば、磁気ディスク、光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。磁気ディスクには、フレキシブルディスク(FD:Flexible Disk)やHDDが含まれる。光ディスクには、CD(Compact Disc)やDVD(Digital Versatile Disc)が含まれる。
【0053】
媒体リーダ108は、例えば、記録媒体53から読み取ったプログラムやデータを、RAM102やHDD103などの他の記録媒体にコピーする。読み取られたプログラムは、例えば、CPU101によって実行される。なお、記録媒体53は可搬型記録媒体であってもよく、プログラムやデータの配布に用いられることがある。また、記録媒体53やHDD103を、コンピュータ読み取り可能な記録媒体と言うことがある。
【0054】
NIC109は、ネットワーク50に接続され、ネットワーク50を介して他のコンピュータと通信を行う物理インタフェースである。NIC109は、ケーブルのコネクタと結合する複数の物理ポートを有し、スイッチやルータなどの通信装置とケーブルで接続される。
【0055】
なお、NIC109は、複数のコプロセッサを有するスマートNICでもよい。その場合、中継スイッチのオフロード先を、NIC109上の複数のコプロセッサとしてもよい。例えば、NIC109上の第1のコプロセッサに中継機能を、NIC109上の第2のコプロセッサに拡張機能を、各々オフロードする構成も考えられる。
【0056】
また、サーバ200もサーバ100と同様のハードウェアを用いて実現される。
図4は、仮想化機構の例を示す図である。
サーバ100は、ハードウェア110を有し、ハードウェア110を用いて、ハイパーバイザ120および仮想マシン130,130a,130bを動作させる。
【0057】
ハードウェア110は、サーバ100におけるデータ入出力や演算のための物理リソースであり、
図3で例示したCPU101およびRAM102などを含む。
ハイパーバイザ120は、サーバ100のハードウェア110を、仮想マシン130,130a,130bに割り振ることで、サーバ100上に、仮想マシン130,130a,130bを動作させる。ハイパーバイザ120は、仮想スイッチの機能を有する。ただし、ハイパーバイザ120は、仮想スイッチの機能を、FPGA104,105にオフロードする。このため、ハイパーバイザ120は、オフロードされた仮想スイッチに対する制御機能を実行すればよく、仮想スイッチの中継機能や拡張機能を実行しなくてよい。
【0058】
仮想マシン130,130a,130bは、ハードウェア110を用いて動作する仮想的なコンピュータである。
なお、サーバ200も、サーバ100と同様に、ハイパーバイザおよび仮想マシンを実行する。
【0059】
図5は、仮想スイッチのオフロードの例を示す図である。
例えば、仮想スイッチ140の中継機能がFPGA104にオフロードされる。仮想スイッチ140は、仮想ポート141,142,143,144,145を有する。仮想ポート141~145は、物理ポートまたは仮想マシンと接続される仮想的なインタフェースである。
【0060】
NIC109は、物理ポート109a,109bを有する。例えば、物理ポート109aは、仮想ポート141に接続されている。物理ポート109bは、仮想ポート142に接続されている。
【0061】
仮想マシン130は、仮想NIC(vnic:virtual NIC)131を有する。仮想マシン130aは、vnic131aを有する。仮想マシン130bは、vnic131bを有する。vnic131,131a,131bは、仮想スイッチ140の仮想ポートと接続される、仮想マシン130,130a,130bの仮想的なインタフェースである。例えば、vnic131は、仮想ポート143に接続されている。vnic131aは、仮想ポート144に接続されている。vnic131bは、仮想ポート145に接続されている。
【0062】
例えば、ハイパーバイザ120は、仮想スイッチ制御部120aを有する。仮想スイッチ制御部120aは、仮想スイッチ140の仮想ポートと物理ポートとの接続、および、仮想ポートとvnicとの接続などを制御する。
【0063】
仮想マシン130,130a,130bは、仮想スイッチ140を介して相互に通信可能である。例えば、仮想マシン130は、vnic131、仮想ポート143,144およびvnic131aを介する通信経路により、仮想マシン130aと通信する。また、仮想マシン130,130a,130bは、サーバ200で動作する仮想マシンまたは他の物理マシンと通信することもできる。例えば、仮想マシン130bは、vnic131b、仮想ポート145,141および物理ポート109aを介する通信経路により、サーバ200で動作する仮想マシンまたは他の物理マシンにデータを送信する。また、仮想マシン130bは、物理ポート109a、仮想ポート141,145およびvnic131bを介する通信経路により、サーバ200で動作する仮想マシンまたは他の物理マシンにより送信された仮想マシン130bを宛先とするデータを受信する。
【0064】
図6は、中継機能および拡張機能のオフロードの例を示す図である。
CPU101は、IO(Input/Output)コントローラ101a,101bを有する。FPGA104は、IOコントローラ101aに接続されている。FPGA105は、IOコントローラ101bに接続されている。FPGA104,105の間のIOコントローラ101a,101bを介する通信経路は、バス111の一部である。FPGA104を識別する番号を「#1」とする。FPGA105を識別する番号を「#2」とする。
【0065】
仮想スイッチ140は、中継機能150および拡張機能170を有する。FPGA104は、仮想スイッチ140における中継機能150を有する。中継機能150は、FPGA104内の電子回路により実現される。FPGA105は、仮想スイッチ140における拡張機能170を有する。拡張機能170は、FPGA105内の電子回路により実現される。FPGA104は、中継機能150により、物理ポート109a,109bを介する外部からのデータの受信および外部へのデータの送信を行う。
【0066】
例えば、ある仮想マシンの単一のvnicは、少なくともデータ受信において、FPGA104上の仮想ポートおよびFPGA105上の仮想ポートの両方に、論理的に接続される。あるいは、少なくともデータ受信において、FPGA104上の仮想ポートおよびFPGA105上の仮想ポートの両方が、仮想マシンのvnicに対して論理的に1つの仮想ポートとして振舞い、当該vnicに当該1つの仮想ポートが接続されるとも言える。
【0067】
図7は、サーバの機能例を示す図である。
vnic131は、受信キュー132および送信キュー133を有する。また、仮想マシン130は、受信バッファ134を有する。受信バッファ134は、RAM102上の記憶領域により実現され、仮想マシン130を宛先とする受信データが書き込まれる。
【0068】
受信キュー132は、デスクリプタ132aを有する。デスクリプタ132aは、受信バッファ134におけるFIFO制御用の情報である。デスクリプタ132aは、受信バッファ134のうちの割当済の記憶領域を表すインデックス(avail_idx)、および、受信バッファ134のうちのデータ書き込み済の記憶領域を表す、仮想マシン130側のインデックス(used_idx)を有する。「avail」はavailableの略である。「idx」はindexの略である。受信バッファ134は、デスクリプタ132aに基づいて仮想マシン130によりシングルキューとして用いられる。
【0069】
送信キュー133は、送信対象のデータを管理するためのキューである。
ハイパーバイザ120は、受信キュー121,122および調停部123を有する。受信キュー121,122は、RAM102上の記憶領域を用いて実現される。
【0070】
受信キュー121は、デスクリプタ121aを有する。デスクリプタ121aは、受信バッファ134のうち、FPGA104に割り当てられた記憶領域を表す、FPGA104側のインデックス(avail_idx)を有する。デスクリプタ121aは、受信バッファ134のうち、FPGA104によりデータ書き込み済の記憶領域を表す、FPGA104側のインデックス(used_idx)を有する。
【0071】
受信キュー122は、デスクリプタ122aを有する。デスクリプタ122aは、受信バッファ134のうち、FPGA105に割り当てられた記憶領域を表す、FPGA105側のインデックス(avail_idx)を有する。デスクリプタ122aは、受信バッファ134のうち、FPGA105によりデータ書き込み済の記憶領域を表す、FPGA105側のインデックス(used_idx)を有する。
【0072】
調停部123は、FPGA104,105による仮想マシン130の受信バッファ134へのデータ書き込みを調停する。調停部123は、デスクリプタ132aにおけるavail_idxに基づいて、デスクリプタ121a,122aの各々のavail_idxを更新することで、FPGA104,105に受信バッファ134の記憶領域を割り当てる分配処理を行う。また、調停部123は、FPGA104によるデスクリプタ121aのused_idxの更新、または、FPGA105によるデスクリプタ122aのused_idxの更新に応じて、デスクリプタ132aのused_idxを更新する調停処理を行う。
【0073】
仮想マシン130は、デスクリプタ132aのused_idxに基づいて、受信バッファ134のうちデータ書き込み済の記憶領域を特定し、当該記憶領域に書き込まれたデータを処理する。仮想マシン130は、処理済のデータに対応する記憶領域を解放する。
【0074】
仮想ポート143は、調停部123から受信バッファ134のうちの書き込み先の記憶領域のインデックスを取得し、当該記憶領域に対してデータをDMA(Direct Memory Access)転送する。仮想ポート143は、受信バッファ134への書き込み(DMA転送)に応じて、デスクリプタ121aのused_idxを更新する。
【0075】
FPGA105は、仮想ポート143aおよび予約部190を有する。
仮想ポート143aは、調停部123から受信バッファ134のうちの書き込み先の記憶領域のインデックスを取得し、当該記憶領域に対してデータをDMA転送する。仮想ポート143aは、受信バッファ134への書き込み(DMA転送)に応じて、デスクリプタ122aのused_idxを更新する。
【0076】
予約部190は、FPGA104から拡張処理対象の新たなデータを受信すると、調停部123に対して受信バッファ134の記憶領域を予約する。具体的には、予約部190は、受信したデータのサイズに応じた要求サイズを含む割当要求を調停部123に出力する。これにより、調停部123を介して、受信バッファ134の記憶領域がFPGA105に割り当てられ、仮想ポート143aによる受信バッファ134への直接の書き込みが可能になる。
【0077】
なお、仮想マシン130a,130bも仮想マシン130と同様の機能を有する。
図8は、サーバの機能例(続き)を示す図である。
FPGA104は、仮想ポート143,144,146,…、中継機能150、記憶部161、仮想ポート処理部162、FPGA間転送処理部163およびIOコントローラ164を有する。
図8では、仮想ポート141,142,145の図示を省略している。
【0078】
仮想ポート146は、FPGA105へのデータ転送に用いられる仮想的なポートである。
中継機能150は、物理ポート109aを介して外部から受信したデータを、宛先の仮想マシンに中継する。中継機能150は、検索部151、アクション適用部152およびクロスバースイッチ153を有する。なお、データはパケットと呼ばれる単位で受信される。パケット単位の処理を説明する際に、「パケット」の語を用いることがある。
【0079】
検索部151は、予め設定されたルールに基づき受信パケットを検索し、当該受信パケットに対応するアクションを決定する。ルールには、例えば、入力ポート番号やヘッダ情報などに対して、実行すべきアクションが含まれる。アクションには、宛先の仮想マシンに対する出力仮想ポートの決定の他、例えば、ヘッダ情報の書き換えなどがある。
【0080】
アクション適用部152は、検索部151により検索されたアクションを受信パケットに対して適用し、クロスバースイッチ153に出力する。ここで、アクションとして、暗号処理や圧縮・復号などの拡張処理を適用する場合、当該アクションについてはFPGA105により実行される。アクション適用部152は、例えば、受信パケットに対して、出力先の仮想ポートの番号を示すメタデータを付加するなどして、中継処理の結果を、FPGA105に通知する。なお、この場合、FPGA104においてある仮想マシンと接続する仮想ポートの番号と、FPGA105において同じ仮想マシンと接続する仮想ポートの番号とを同じ番号としてもよい。あるいは、FPGA104は、FPGA105における当該仮想マシンと接続する仮想ポートの番号を予め取得して保持しておき、当該仮想ポートの番号を、メタデータとして、受信データに付加して、FPGA105に通知してもよい。
【0081】
クロスバースイッチ153は、アクション適用部152から取得した受信パケットを、出力先の仮想ポートに出力する。ここで、クロスバースイッチ153は、拡張処理対象の受信パケットを、仮想ポート146に出力する。
【0082】
記憶部161は、DMAメモリ情報を記憶する。DMAメモリ情報は、仮想ポートに対応するDMA転送先の受信バッファを識別する情報である。DMAメモリ情報は、受信バッファにおけるデータ書き込み可能なインデックスの情報を含んでもよい。
【0083】
仮想ポート処理部162は、仮想ポートに対応するDMAメモリ情報を用いて、IOコントローラ164を介して仮想マシンのメモリ領域にアクセスし、データの送受信(例えば、受信したデータの受信バッファへの書き込み)を実行する。
【0084】
FPGA間転送処理部163は、クロスバースイッチ153により仮想ポート146に出力された受信パケットを、IOコントローラ164を介してFPGA105に送信する。
【0085】
IOコントローラ164は、サーバ100におけるバス111およびDMA転送を制御する。IOコントローラ164は、バス111によるデータ転送を制御するIOバスコントローラ、および、DMA転送を制御するDMAコントローラを有してもよい。
【0086】
FPGA105は、仮想ポート143a,144a,…、拡張機能170、記憶部181、仮想ポート処理部182、FPGA間転送処理部183およびIOコントローラ184および予約部190を有する。
【0087】
仮想ポート143a,144aは、サーバ100上の仮想マシンと接続される仮想的なポートである。仮想ポート143aは、仮想マシン130に接続される。仮想ポート144aは、仮想マシン130aに接続される。
【0088】
拡張機能170は、FPGA104から受信した拡張処理対象のデータに対する拡張処理を行い、拡張処理後のデータを宛先の仮想マシンに転送する。拡張機能170は、記憶部171、フィルタ部172、拡張機能処理部173およびクロスバースイッチ174を有する。
【0089】
記憶部171は、フィルタルールを記憶する。フィルタルールは、パケットのヘッダ情報に対する出力先の仮想ポートを示す情報である。
フィルタ部172は、予約部190を介してFPGA104により転送された受信データを取得する。フィルタ部172は、記憶部171に記憶されたフィルタルールに基づいて、FPGA104から受信したデータの出力先の仮想ポートを特定し、クロスバースイッチ174に供給する。
【0090】
拡張機能処理部173は、FPGA間転送処理部183からFPGA104により転送された受信データを取得する。拡張機能処理部173は、当該受信データに対して、暗号処理(例えば、復号)や圧縮状態からの復元などの拡張処理を行って、拡張処理後のデータをクロスバースイッチ174に供給する。
【0091】
クロスバースイッチ174は、フィルタ部172から供給される出力先の仮想ポートに、拡張機能処理部173から供給される拡張処理後のデータを出力する。
記憶部181は、DMAメモリ情報を記憶する。DMAメモリ情報は、前述のように、仮想ポートに対応するDMA転送先の受信バッファを識別する情報である。
【0092】
仮想ポート処理部182は、仮想ポートに対応するDMAメモリ情報を用いて、IOコントローラ184を介して仮想マシンのメモリ領域にアクセスし、データの送受信(例えば、受信したデータの受信バッファへの書き込み)を実行する。
【0093】
FPGA間転送処理部183は、FPGA104により転送された受信パケットを、IOコントローラ164を介して受信し、拡張機能処理部173および予約部190に出力する。
【0094】
IOコントローラ184は、サーバ100におけるバス111およびDMA転送を制御する。IOコントローラ184は、バス111によるデータ転送を制御するIOバスコントローラ、および、DMA転送を制御するDMAコントローラを有してもよい。
【0095】
予約部190は、FPGA間転送処理部183によるデータ受信、あるいは、仮想ポートから入力されフィルタ部172でヒットしたパケットに対して宛先仮想ポート毎にパケット数をカウントし、各仮想ポートに関して所要される受信バッファの領域数を求める。予約部190は、FPGA105の各仮想ポートで所要される受信バッファの領域数を一定サイクル毎に、調停部123に通知する。ここで、拡張機能処理部173の処理は時間がかかる。このため、予約部190は、FPGA104へデータが入力されたタイミングで、書き込みに所要されるバッファ領域数を調停部123に要求することで、拡張処理完了時には、仮想ポートへの出力に所要される受信バッファの記憶領域を準備済(割当済)にできる。
【0096】
なお、
図8で例示した仮想ポートおよび物理ポートの数は、一例であり、他の数であってもよい。
図9は、予約部の処理の例を示す図である。
【0097】
FPGA104からFPGA105に転送される拡張処理対象の受信データ60は、メタデータおよびパケットデータを含む。メタデータは、前述のように、宛先の仮想マシンに対応する出力先の仮想ポートの番号(例えば、out_port=1)を含む。パケットデータは、各種レイヤのヘッダ情報やユーザデータ本体を含むパケットに相当する部分である。
【0098】
FPGA間転送処理部183は、サーバ100のバス111を介して、受信データ60をFPGA104から受信すると、受信データ60を、予約部190および拡張機能処理部173に出力する。
【0099】
拡張機能処理部173は、受信データ60のユーザデータ本体に対する拡張処理を開始する。ここで、予約部190は、要求数カウンタ191、更新部192および通知部193を有する。
【0100】
要求数カウンタ191は、仮想ポートのポート番号ごとに、各仮想マシンに対して要求される受信バッファの記憶領域の数を管理するための情報である。
更新部192は、受信データ60のメタデータから、出力先の仮想ポートに所要される記憶領域の数をカウントし、要求数カウンタ191を更新する。
【0101】
通知部193は、一定サイクル毎に、要求数カウンタ191を参照して、調停部123に該当の仮想ポートに接続された仮想マシンの受信バッファに対して要求される記憶領域の数(すなわち、要求サイズ)を含む割当要求を通知する。
【0102】
拡張機能処理部173は、受信データ60に対する拡張処理が完了すると、拡張処理後のデータを、クロスバースイッチ174(図示を省略している)を介して、例えば、出力先の仮想ポート143aに対応するポート#1出力部143a1に供給する。なお、拡張処理では、例えば、受信データ60に付加されているメタデータが除去される。
【0103】
ここで、更新部192は、FPGA104から受信したデータに対して、そのヘッダ情報(フロールール)から、当該フロールールに対応する出力先の仮想ポートを特定してもよい。例えば、記憶部171がフィルタルール171aを保持する場合、更新部192は、フロールールに対してフィルタ部172により特定された仮想ポートの番号(出力ポート)を取得して、要求数カウンタ191を更新してもよい。例えば、フィルタ部172は、送信対象データの入力元の仮想ポート143aに対応するポート#1入力部143a2を介して送信データを取得した場合、当該送信データの送信元アドレスを宛先とするデータの出力先を仮想ポート143aと特定する。フィルタ部172は、特定結果をフィルタルール171aに記録し、記憶部171に保持する。
【0104】
調停部123は、通知部193から割当要求を取得すると、該当の仮想マシンの受信バッファの記憶領域を、FPGA105に割り当てる。調停部123は、ポート情報記憶部124に記憶された情報に基づいて、FPGA104,105に対する受信バッファの割当を管理する。
【0105】
ここで、
図9では、仮想マシン130の受信バッファ134に対する割当管理の例を示している。他の仮想マシンについても、仮想マシン130と同様に管理される。
ポート情報記憶部124は、RAM102の所定の記憶領域を用いて実現される。ポート情報記憶部124は、インデックスヒストリ125およびインデックス管理情報126を有する。
【0106】
インデックスヒストリ125は、FPGA104,105の各々への受信バッファ割当時に、割り当てられたデスクリプタ132aの終端のインデックスと、デスクリプタ121aまたはデスクリプタ122aの終端のインデックスとが記録される。インデックスヒストリ125は、キューであり、FIFOにより処理される。
【0107】
インデックスヒストリ125に記録されたFPGA104,105の先頭データのデスクリプタ132a側のインデックスの比較で、どちらのFPGAのデータを先に処理すべきかを判定可能になる(インデックスの小さい方が先に処理される)。また、インデックスヒストリ125に記録されたデスクリプタ121a側またはデスクリプタ122a側のインデックスを用いて、処理対象のFPGAのデータのバッファ割当境界を判定可能になる。処理対象のFPGAに関してバッファ割当境界まで書き込み済となった場合に、インデックスヒストリ125の当該FPGAの先頭データを削除することで、処理対象とするFPGAのデータの切り替えが可能になる。なお、インデックスヒストリ125の「n/a」は、not availableの略であり、データ無しを示す。
【0108】
インデックス管理情報126は、fpga1 last_used_idx、fpga2 last_used_idxおよびFPGA105(FPGA#2)の記憶領域の要求数の情報を含む。
【0109】
fpga1 last_used_idxは、受信バッファ134において、FPGA104により書き込み済である記憶領域の終端のインデックスの終端を示す。
fpga2 last_used_idxは、受信バッファ134において、FPGA105により書き込み済である記憶領域の終端のインデックスを示す。
【0110】
要求数は、FPGA105に対して割当が要求されている記憶領域の数を示す。例えば、要求数=1は、1つのインデックスに対応する1つの記憶領域に相当する。要求数=1は、当該記憶領域のサイズを示しているとも言える。
【0111】
例えば、予約部190は、受信データ60を取得し、要求数カウンタ191における仮想ポート143(ポート番号=1)の要求数を1から2に更新したとする。通知部193は、次の割当要求の通知タイミングで、仮想ポート143に接続された仮想マシン130の受信バッファ134に関して、要求数=2を示す割当要求を調停部123に通知する。割当要求の通知後、予約部190は、要求数カウンタ191の通知済の要求数を0にリセットしてよい。
【0112】
すると、調停部123は、割当要求に応じて、FPGA105に対する受信バッファ134の記憶領域の割当を行う。ここで、当該割当要求の通知時点で、インデックスヒストリ125には、FPGA104に対して、「4,4」が登録済であるとする。これは、受信バッファ134の0≦i<4(iはインデックスを示す)の記憶領域がFPGA104に割当済であることを示す。また、デスクリプタ121aでは、avail_idx=4、used_idx=2であり、デスクリプタ122aでは、avail_idx=0、used_idx=0であるとする。更に、インデックス管理情報126では、fpga1 last_used_idx=2、fpga2 last_used_idx=0、要求数=0であるとする。
【0113】
調停部123は、割当要求で要求された要求数=2を、インデックス管理情報126における要求数に加算する。その結果、インデックス管理情報126における要求数は、0+2=2に更新される。調停部123は、インデックス管理情報126における要求数=2に基づいて、デスクリプタ122aのavail_idxを0から2に更新する。また、調停部123は、インデックスヒストリ125において、FPGA105に対し、「6,2」を記録する。調停部123は、FPGA105へ記憶領域を割り当てると、割り当てた記憶領域の数を、インデックス管理情報126における要求数から減算する。
【0114】
図10は、調停部による分配処理の例を示す図である。
分配処理は、受信バッファ134における、インデックスで区分される記憶領域を、FPGA104,105に割り当てる処理である。例えば、調停部123は仮想マシン130に関して次のように分配処理を行う(他の仮想マシンについても同様の処理となる)。
【0115】
初期状態では、受信バッファ134は確保されておらず、インデックスヒストリ125にはインデックスの情報が設定されていない。また、インデックス管理情報126およびデスクリプタ121a,122a,132aの何れのパラメータも0である。
【0116】
まず、仮想マシン130が起動すると、仮想マシン130は、RAM102上に受信バッファ134の記憶領域を確保し、受信キュー132に受信バッファ134を割り当てる(受信バッファ134および受信キュー132の初期化)。例えば、受信バッファ134のサイズは予め定められる。ここでは、一例として、初期化後の受信バッファ134のサイズを8とする。このとき、受信バッファ134の先頭インデックスは、0である。受信バッファ134の終端インデックスは8である。受信バッファ134の0≦i<8の記憶領域は、未割当の状態である。仮想マシン130は、受信キュー132のデスクリプタ132aにおいて、avail_idx=8、used_idx=0に更新する。
【0117】
すると、調停部123は、受信キュー132におけるavail_idxの更新により、受信バッファ134の割当を検知する。そして、調停部123は、中継機能を担うFPGA104用の受信キュー121に、例えば、仮想マシン130が設定した受信バッファ134の記憶領域の総数の半分(この例では、8÷2=4)を設定する。すなわち、調停部123は、デスクリプタ121aにおいて、avail_idx=4に更新する。調停部123は、FPGA104に対して割り当てたデスクリプタ132a上の終端インデックス=4と、デスクリプタ121aのavail_idx=4との組(4,4)を、インデックスヒストリ125のFPGA104(FPGA#1)の先頭の欄に設定する。ただし、調停部123は、FPGA104に割り当てる記憶領域の数を他の数としてもよい。
【0118】
調停部123は、FPGA105から受信バッファ134の割当要求がある場合、次の処理を実行する。調停部123は、受信バッファ134の未割当領域の先頭(本例の場合、インデックス=4)から要求数分の記憶領域をFPGA105に設定する。例えば、要求数=2のとき、調停部123は、インデックス管理情報126における要求数を、0から2に更新する。そして、調停部123は、デスクリプタ122aにおいて、avail_idx=2に更新する。調停部123は、FPGA105に対して割り当てたデスクリプタ132a上の終端インデックス=6と、デスクリプタ122aのavail_idx=2との組(6,2)を、インデックスヒストリ125のFPGA105(FPGA#2)の欄の先頭に設定する。調停部123は、インデックス管理情報126の要求数から、今回割り当てた記憶領域の数を減算する。例えば、調停部123は、今回2つの記憶領域をFPGA105に割り当てたので、要求数=2-2=0に更新する。
【0119】
図11は、調停部による分配処理の例(続き)を示す図である。
続いて、FPGA104は、受信キュー121のデスクリプタ121aで割り当てられているavail_idxの小さい方から順に、当該avail_idxに対応する受信バッファ134の記憶領域にデータを書き込む。例えば、FPGA104は、受信バッファ134の0≦i<2の記憶領域にデータを書き込んだとする。そして、FPGA104は、デスクリプタ121aのused_idxを0から2に更新する。
【0120】
調停部123は、後述される調停処理により、fpga1 last_used_idxを0から2に更新するとともに、受信キュー132のデスクリプタ132aにおけるused_idxを0から2に更新する。
【0121】
仮想マシン130は、デスクリプタ132aにおけるused_idx=2により、受信バッファ134の先頭インデックス(この場合は0)を起点に、0≦i<2に対応する記憶領域にデータが書き込まれたことを検出し、当該データを処理する。仮想マシン130は、該当のデータに対する処理が完了すると、受信バッファ134の0≦i<2に対応する記憶領域を解放する。仮想マシン130は、受信バッファ134の記憶領域を解放すると、解放した分の記憶領域を受信バッファ134に補充する。その結果、受信バッファ134に対して、デスクリプタ132aの先頭インデックス=2、終端インデックス=10となる。更に、デスクリプタ132aのavail_idxは8から10に更新される。
【0122】
調停部123は、デスクリプタ132aのavail_idxの更新を検知すると、インデックスヒストリ125において、デスクリプタ132aにおける割当終端インデックスの小さい方であるFPGA104に対応する記憶領域の解放を検知する。そして、調停部123は、受信バッファ134の記憶領域の総数の半分(この例では、4)になるまで、FPGA104に対して受信バッファ134の記憶領域を追加で割り当てる(この場合、追加の割当数は2である)。調停部123は、デスクリプタ121aにおいて、avail_idx=4+2=6に更新する。調停部123は、FPGA104に対して割り当てたデスクリプタ132a上の終端インデックス=6+2=8とデスクリプタ121aのavail_idx=6との組(8,6)を、インデックスヒストリ125のFPGA104(FPGA#1)の2番目の欄に設定する。
【0123】
このように、調停部123は、FPGA104,105の各々に、受信バッファ134の記憶領域を割り当てる。
図12は、調停部による調停処理の例を示す図である。
【0124】
調停処理は、FPGA104によるデスクリプタ121aのused_idxの更新、または、FPGA105によるデスクリプタ122aのused_idxの更新に応じて、デスクリプタ132aのused_idxを更新する処理である。以下では、
図11の状態に続く処理を説明するが、
図11においてデスクリプタ121aのused_idxが0から2に更新された場合も下記と同様の処理となる。
【0125】
FPGA104は、受信キュー121のデスクリプタ121aで割り当てられているavail_idxの小さい方から順に、当該avail_idxに対応する受信バッファ134の記憶領域にデータを書き込む。
【0126】
ここで、例えば、調停部123はインデックスヒストリ125のFPGA104の先頭データと、インデックス管理情報126のfpga1 last_used_idxから、受信バッファ134のうちFPGA104に割当済領域の先頭インデックスを計算する。インデックスヒストリ125のFPGA104の先頭データが(4,4)で、fpga1 last_used_idx=2の場合、受信バッファ134のうちFPGA104に割当済の領域の先頭インデックスは、4-(4-2)=2である。そして、調停部123は、受信バッファ134のうち、FPGA104に割り当てられている当該先頭インデックスに対応する記憶領域からデータを書き込むようにFPGA104に指示する。インデックスヒストリ125のFPGA104の先頭データで示される記憶領域だけでは書き込み可能サイズが不足することもある。この場合、調停部123は、インデックスヒストリ125のFPGA104の2番目のデータを用いて、受信バッファ134の書き込み可能な記憶領域を特定する。
【0127】
例えば、FPGA104は、受信バッファ134の2≦i<4の記憶領域にデータを書き込んだとする。そして、FPGA104は、デスクリプタ121aのused_idxを2から4に更新する。
【0128】
調停部123は、インデックスヒストリ125のFPGA104,105の各々の先頭データにおけるデスクリプタ132a側のインデックス(
図12の例では、4と6)を比較し、小さい方のインデックスに対応するFPGA(FPGA104)を選択する。
【0129】
調停部123は、選択したFPGAに関して、インデックスヒストリ125のFPGA側のデスクリプタのインデックスをHとし、下記の式(1)によりcountを求める。
count=MIN(used_idx,H)-last_used_idx ・・・(1)
ここで、MINは、引数のうちの最小値をとる関数である。式(1)におけるused_idxは、選択したFPGA側のデスクリプタ(デスクリプタ121aまたはデスクリプタ122a)のused_idxである。式(1)におけるlast_used_idxは、インデックス管理情報126における、選択したFPGAに対応する値となる。
【0130】
調停部123は、count≧1の場合、デスクリプタ132aのused_idx、および、該当のFPGAに対応するlast_used_idxの各々に、countを加算する。
【0131】
そして、調停部123は、該当のFPGAに関して、last_used_idxがHと等しくなった場合に、インデックスヒストリ125から該当のFPGAの先頭データを削除する。
【0132】
図12の例では、インデックスヒストリ125からFPGA104が選択される。そして、count=MIN(4,4)-2=4-2=2となる。このため、調停部123は、デスクリプタ132aにおけるused_idxを2+count=4に更新する。また、調停部123は、インデックス管理情報126におけるfpga1 last_used_idxを2+count=2+2=4に更新する。ここで、fpga1 last_used_idx=4は、H=4に等しくなるので、調停部123は、インデックスヒストリ125のFPGA104の先頭データ(4,4)を削除する。すると、インデックスヒストリ125では、FPGA104に対して、(8,6)が先頭データとなる。
【0133】
図13は、調停部による調停処理の例(続き)を示す図である。
続いて、FPGA105は、受信キュー122のデスクリプタ122aで割り当てられているavail_idxの小さい方から順に、当該avail_idxに対応する受信バッファ134の記憶領域にデータを書き込む。
【0134】
ここで、例えば、調停部123はインデックスヒストリ125のFPGA105の先頭データと、インデックス管理情報126のfpga2 last_used_idxから、受信バッファ134のうちFPGA105に割当済領域の先頭インデックスを計算する。インデックスヒストリ125のFPGA105の先頭データが(6,2)で、fpga2 last_used_idx=0の場合、受信バッファ134のうちFPGA105に割当済の領域の先頭インデックスは、6-(2-0)=4である。そして、調停部123は、受信バッファ134のうち、FPGA105に割り当てられている当該先頭インデックスに対応する記憶領域からデータを書き込むようにFPGA105に指示する。インデックスヒストリ125のFPGA105の先頭データで示される記憶領域だけでは書き込み可能サイズが不足することもある。この場合、調停部123は、インデックスヒストリ125のFPGA105の2番目のデータを用いて、受信バッファ134の書き込み可能な記憶領域を特定する。
【0135】
例えば、FPGA105は、受信バッファ134の4≦i<6の記憶領域にデータを書き込んだとする。そして、FPGA105は、デスクリプタ122aのused_idxを0から2に更新する。
【0136】
調停部123は、インデックスヒストリ125のFPGA104,105の各々の先頭データにおけるデスクリプタ132a側のインデックス(
図13の例では、8と6)を比較し、小さい方のインデックスに対応するFPGA(FPGA105)を選択する。
【0137】
調停部123は、選択したFPGA105に関して、式(1)によりcountを求める。この例では、count=MIN(2,2)-0=2である。
調停部123は、count=2≧1であるため、デスクリプタ132aのused_idxを、4+count=4+2=6に更新する。また、調停部123は、インデックス管理情報126におけるfpga2 last_used_idxを0+count=0+2=2に更新する。ここで、fpga2 last_used_idx=2は、H=2に等しくなるので、調停部123は、インデックスヒストリ125のFPGA105の先頭データ(6,2)を削除する。
【0138】
このように、調停部123は、調停処理を行う。
次に、サーバ100の処理手順を説明する。以下では、仮想マシン130を宛先とするデータを受信した場合を例示するが、他の仮想マシンを宛先とするデータを受信した場合も同様の手順となる。まず、FPGA104,105の処理手順を説明する。
【0139】
図14は、中継機能用FPGAの処理の例を示すフローチャートである。
(S10)FPGA104は、物理ポート109aを介して、データを受信する。
(S11)FPGA104は、受信したデータが拡張処理対象であるか否かを判定する。拡張処理対象である場合、ステップS12に処理が進む。拡張処理対象でない場合、ステップS13に処理が進む。例えば、FPGA104は、受信したデータのヘッダ情報などを基に、ヘッダ情報に対するルールによって予め定められたアクションを特定することで、受信したデータが拡張処理対象であるか否かを判定する。
【0140】
(S12)FPGA104は、受信したデータに対して中継処理結果として取得される、宛先仮想ポート番号を付加し、付加後のデータを、拡張処理用のFPGA105に転送する。そして、中継機能用FPGAの処理が終了する。
【0141】
(S13)FPGA104は、受信バッファ134の格納先インデックスを調停部123に問い合わせる。FPGA104は、受信バッファ134の格納先インデックスを調停部123から取得する。
【0142】
(S14)FPGA104は、受信バッファ134の格納先インデックスに対応する記憶領域に、受信したデータを書き込む(DMA転送)。
(S15)FPGA104は、FPGA104(FPGA#1)側のused_idxを更新する。すなわち、FPGA104は、デスクリプタ121aのused_idxに、データを書き込んだ記憶領域の数(当該記憶領域に対応するインデックスの数)を加算する。そして、中継機能用FPGAの処理が終了する。
【0143】
図15は、拡張機能用FPGAの処理の例を示すフローチャートである。
(S20)FPGA105は、中継機能用FPGA(すなわち、FPGA104)から拡張処理対象のデータを受信する。
【0144】
(S21)FPGA105は、拡張処理の実行を開始する。FPGA105は、ステップS21で開始した拡張処理と、下記のステップS22~S24とを並列に行える。
(S22)FPGA105は、ステップS20で受信したデータのサイズに応じた拡張処理後のデータの書き込みサイズを求め、当該書き込みサイズに基づいて受信バッファ134の記憶領域の要求数を求める。FPGA105は、拡張処理後データの出力先の仮想ポート143aに対応する受信バッファ134の記憶領域の要求数を更新する。仮想ポート毎の要求数は前述のように要求数カウンタ191に登録されている。
【0145】
(S23)FPGA105は、ステップS22で求めた要求数を含む、受信バッファ134の記憶領域の割当要求を調停部123に通知する。
(S24)FPGA105は、受信バッファ134の記憶領域の割当結果を調停部123から取得する。
【0146】
(S25)FPGA105は、拡張処理が完了すると、拡張処理後のデータを、FPGA105に割り当てられた受信バッファ134の記憶領域に出力する(DMA転送)。
(S26)FPGA105は、FPGA105(FPGA#2)側のused_idxを更新する。すなわち、FPGA105は、デスクリプタ122aのused_idxに、データを書き込んだ記憶領域の数(当該記憶領域に対応するインデックスの数)を加算する。そして、拡張機能用FPGAの処理が終了する。
【0147】
次に、調停部123の処理手順を説明する。以下では、図中、仮想マシンをVM(Virtual Machine)と略記することがある。
図16は、中継機能用FPGAに対する分配処理の例を示すフローチャートである。
【0148】
(S30)調停部123は、仮想マシン(VM)130による受信バッファ134の割当を検出する。例えば、前述のように、調停部123は、仮想マシン130の起動後、デスクリプタ132aのavail_idxが更新されたことを検出することで、仮想マシン130による受信バッファ134の割当を検出する。
【0149】
(S31)調停部123は、FPGA104(FPGA#1)に受信バッファ134のうちの所定サイズを割り当てる。すなわち、調停部123は、割り当てに応じて、FPGA104に対応する受信キュー121のデスクリプタ121aにおけるavail_idxを更新する。所定サイズは、例えば、受信バッファ134の総サイズのうちの半分である(所定サイズは、他の値でもよい)。調停部123は、インデックスヒストリ125において、FPGA104に対し、デスクリプタ132aの今回割り当てた記憶領域の終端インデックスと、デスクリプタ121aのavail_idxの組を記録する。そして、ステップS30に処理が進む。
【0150】
なお、ステップS30では、受信バッファ134の一部が解放された場合にも、仮想マシン130により解放された領域に対して新たな領域が割り当てられることになる。仮想マシン130による新領域の割り当て時にFPGA104への割り当て領域のサイズが所定サイズに達していない場合、ステップS31において、調停部123は、FPGA104に対して、所定サイズとなるまで追加分の記憶領域を割り当てる。調停部123は、割り当てに応じて、デスクリプタ121aにおけるavail_idxを更新する。調停部123は、インデックスヒストリ125において、FPGA104に対し、今回割り当てた記憶領域に対応する、デスクリプタ132aにおける終端インデックスと、デスクリプタ121aのavail_idxの組を記録する。
【0151】
図17は、拡張機能用FPGAに対する分配処理の例を示すフローチャートである。
(S40)調停部123は、FPGA105(FPGA#2)から受信バッファ134の記憶領域の割当要求を受信する。
【0152】
(S41)調停部123は、インデックス管理情報126におけるFPGA105(FPGA#2)の要求数に、割当要求に含まれる要求数を加算する。
(S42)調停部123は、FPGA105(FPGA#2)に、受信バッファ134の未割当領域を先頭から順に割り当てる。調停部123は、FPGA105に対応する受信キュー122のデスクリプタ122aのavail_idxを割り当てた記憶領域の分だけ更新する。調停部123は、インデックスヒストリ125において、FPGA105に対し、今回割り当てた記憶領域に対応する、デスクリプタ132aにおける終端インデックスと、デスクリプタ122aのavail_idxの組を記録する。
【0153】
(S43)調停部123は、インデックス管理情報126におけるFPGA105(FPGA#2)の要求数から、ステップS42で割り当てた割当済数を減算する。
(S44)調停部123は、インデックス管理情報126における要求数が0であるか否かを判定する。要求数≠0の場合、ステップS42に処理が進む。要求数=0の場合、拡張機能用FPGAに対する分配処理が終了する。
【0154】
図18は、調停処理の例を示すフローチャートである。
調停部123は、例えば、デスクリプタ121aのused_idxまたはデスクリプタ122aのused_idxが更新されたときに、あるいは、所定の周期で下記の手順を実行する。
【0155】
(S50)調停部123は、インデックスヒストリ125の両FPGAの先頭データの仮想マシン(VM)130側インデックスを比較して、インデックスが小さい方のFPGAを選択する。ここで、仮想マシン130側インデックスは、デスクリプタ132aにおける、各FPGAに対する割当済領域の終端インデックスを示す。
【0156】
(S51)調停部123は、ステップS50で選択したFPGAに関して、インデックスヒストリ125の先頭データのFPGA側インデックスをHとして、式(1)によりcountを計算する。
【0157】
(S52)調停部123は、count≧1であるか否かを判定する。count≧1の場合、ステップS53に処理が進む。count<1の場合、調停処理が終了する。
(S53)調停部123は、仮想マシン130側used_idx(デスクリプタ132aにおけるused_idx)と、インデックス管理情報126における該当のFPGAのlast_used_idxの各々にcountを加算する。
【0158】
(S54)調停部123は、該当のFPGAに関してlast_used_idx=Hであるか否かを判定する。last_used_idx=Hである場合、ステップS55に処理が進む。last_used_idx≠Hである場合、調停処理が終了する。
【0159】
(S55)調停部123は、インデックスヒストリ125から該当のFPGAの先頭データを削除する。そして、調停処理が終了する。
このように、調停部123は、FPGA104による受信バッファ134に対するデータの書き込み、または、FPGA105による受信バッファ134に対する拡張処理後のデータの書き込みを検出する。すると、調停部123は、仮想マシン130により参照される、受信バッファ134のうちの書き込み済の記憶領域を示す情報(デスクリプタ132aのused_idx)を更新することで、仮想マシン130に当該書き込み済の記憶領域を通知する。デスクリプタ132aは、仮想マシン130により参照される既存の情報である。調停部123の調停処理によって、仮想マシン130の処理に影響を及ぼさないように、FPGA104,105の両方からの受信バッファ134への書き込みを可能にできる。
【0160】
次に、仮想マシン130による受信処理を説明する。他の仮想マシンも同様の手順を実行する。
図19は、仮想マシンの受信処理の例を示すフローチャートである。
【0161】
(S60)仮想マシン130は、受信バッファ134のうち、VM側used_idx(デスクリプタ132aにおけるused_idx)で示される記憶領域に格納された受信データに対する所定の処理を実行する。
【0162】
(S61)仮想マシン130は、受信バッファ134における処理済領域を解放する。
(S62)仮想マシン130は、解放した分の記憶領域を受信バッファ134に割り当てる。仮想マシン130は、新たに割り当てた分だけ、デスクリプタ132aのavail_idxを更新する。そして、仮想マシン130の受信処理が終了する。
【0163】
図20は、バスを介する通信の例を示す図である。
調停部123の制御により、FPGA104,105の各々は、仮想マシン130の受信バッファ134への書き込みを行える。例えば、FPGA104は、受信したデータが拡張処理対象である場合、バス111を介して、当該データをFPGA105に転送する。FPGA105は、当該データに対して拡張処理を実行し、拡張処理後のデータを、仮想マシン130の受信バッファ134に書き込む。これにより、仮想マシン130は、当該データに対する受信処理を行える。
【0164】
図21は、バスを介する通信の比較例を示す図である。
比較例では、FPGA104のみが受信バッファ134への書き込みを行う場合を考える。例えば、FPGA104は、受信したデータが拡張処理対象である場合、バス111を介して、当該データをFPGA105に転送する。FPGA105は、当該データに対して拡張処理を実行し、拡張処理後のデータを、FPGA104に転送する。FPGA104は、拡張処理後のデータを仮想マシン130の受信バッファ134に書き込む。これにより、仮想マシン130は、当該データに対する受信処理を行える。
【0165】
図21の比較例では、拡張処理対象のデータについて、FPGA105からFPGA104へのバス111を介した折り返しの通信が発生する。この場合、拡張処理対象のデータ量が多いと、バス111の通信帯域の消費量が過大になる可能性がある。バス111の負荷の増大は、サーバ100の全体の性能低下の要因になる。
【0166】
そこで、
図20で例示したように、サーバ100は、FPGA104だけでなく、FPGA105から、仮想マシン130の受信バッファ134への直接の書き込みを可能にすることで、FPGA105からFPGA104に対する折り返しの通信を抑制する。このため、バス111の通信帯域の消費量を削減でき、バス111の通信帯域の過剰消費によるサーバ100の性能低下を抑制できる。
【0167】
ところで、FPGA104,105の双方から受信バッファ134への書き込みを可能にするため、例えば、ロック変数や不可分(アトミック)命令を用いた排他アクセスを行うなどのソフトウェア的手法を採ることも考えられる。しかし、デバイスからバス111を介したメモリアクセスはオーバヘッドが多大なため、通常は1対1のアクセスであることを利用して、インデックスを数十~100サイクル毎に読み込み、アクセス遅延を抑制する。しかし、FPGA104,105のように複数デバイスからの排他アクセスでは、ロック変数やインデックスに毎サイクルアクセスすることになり、オフロード時は性能が劇的に低下する可能性がある。このため、排他アクセスのような手法を適用することはできない。
【0168】
また、例えば、単純に、FPGA104,105の両方に対して、例えば、受信バッファ134の均等分配や比率分配により所定サイズの記憶領域を常に割り当てるように制御することも考えられる。しかし、受信バッファ134をFIFOにより処理する際に、データ未書き込みの記憶領域よりも後ろに、データ書き込み済の他の記憶領域が存在すると、データ未書き込みの記憶領域が書き込み済にならないと、他の記憶領域に書き込まれたデータを処理できない。したがって、例えば、FPGA105の割当領域に対する書き込みが発生するまで、当該割当領域よりも後ろに存在するFPGA104の割当領域に書き込み済のデータに対する処理遅延が生じることがある。
【0169】
これに対し、調停部123は、中継機能のオフロード先であるFPGA104には、所定サイズの記憶領域を継続的に割り当てる。そして、調停部123は、拡張機能のオフロード先であるFPGA105に対しては、割当要求があったときに、要求サイズに応じた受信バッファ134の記憶領域を割り当てる。これにより、上記処理遅延を低減できる。
【0170】
FPGA104に所定サイズの割当を維持する理由は、中継機能を担うFPGA104から受信バッファ134に書き込まれるデータは継続的に発生することが見込まれるためである。また、FPGA105に対して、書き込み対象のデータが発生するときに記憶領域を割り当てる理由は、中継機能は拡張機能に付随する機能であり、FPGA104が外部から受信したデータの全てが拡張機能の対象になるわけではないためである。
【0171】
また、調停部123は、受信バッファ134(シングルキュー)を用いる仮想マシン130の処理への影響を及ぼさないように、FPGA104,105へのバッファ領域の割当を行う。このため、仮想マシン130側の改造を要しない。
【0172】
上記のように、調停部123は、仮想マシンがもつ受信用のシングルキュー(受信バッファ134)に対して、性能低下なしで複数デバイスから安全にアクセスする手順を提供する。これにより、拡張機能を利用しないフローは中継機能側FPGAから、拡張機能を利用するフローは拡張機能側FPGAから、仮想マシンに対する直接のデータ転送を実現する。こうして、仮想マシンに変更を加えることなく、仮想マシンの受信フローの拡張機能利用によるバス111上の折り返しデータ量を削減できる。
【0173】
なお、第1の実施の形態の情報処理は、プロセッサ12にプログラムを実行させることで実現できる。また、第2の実施の形態の情報処理は、CPU101にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体53に記録できる。
【0174】
例えば、プログラムを記録した記録媒体53を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体53に記録されたプログラムまたは他のコンピュータから受信したプログラムを、RAM102やHDD103などの記憶装置に格納し(インストールし)、当該記憶装置からプログラムを読み込んで実行してもよい。
【符号の説明】
【0175】
1 情報処理装置
10 ハードウェア
11 メモリ
11a 受信バッファ
12 プロセッサ
13,14 コプロセッサ
13a 中継処理部
14a 拡張処理部
15 バス
20 ソフトウェア
21 仮想マシン