(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-12-04
(45)【発行日】2024-12-12
(54)【発明の名称】ネットワークインタフェース及びそのバッファ制御方法
(51)【国際特許分類】
G06F 13/10 20060101AFI20241205BHJP
【FI】
G06F13/10 330D
(21)【出願番号】P 2022048675
(22)【出願日】2022-03-24
【審査請求日】2023-02-14
(73)【特許権者】
【識別番号】524132520
【氏名又は名称】日立ヴァンタラ株式会社
(74)【代理人】
【識別番号】110001678
【氏名又は名称】藤央弁理士法人
(72)【発明者】
【氏名】横井 伸浩
(72)【発明者】
【氏名】井原 央翔
【審査官】田名網 忠雄
(56)【参考文献】
【文献】特開2003-067137(JP,A)
【文献】特開平06-350648(JP,A)
【文献】特表2015-506027(JP,A)
【文献】特開平05-160880(JP,A)
【文献】特表2018-502376(JP,A)
【文献】特開2019-103013(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 13/10-13/14
G06F 3/06-3/08
(57)【特許請求の範囲】
【請求項1】
ネットワークインタフェースであって、
プロセッサと、
メモリと、
前記プロセッサ
から前記メモリ
より先にアクセスされるキャッシュと、を含み、
前記プロセッサは、
前記メモリに、転送データを格納するための複数バッファを確保し、
前記複数バッファの空きバッファの割り当て順序を管理し、
データ転送後に
解放されたバッファを、
空きバッファとして前記割り当て順序の
先頭位置に戻
し、
前記先頭位置の空きバッファからデータ転送に使用する、ネットワークインタフェース。
【請求項2】
請求項1に記載のネットワークインタフェースであって、
前記プロセッサは、前記メモリに、複数バッファ群を確保し、
前記複数バッファ群の各バッファ群は、同一サイズの複数バッファで構成され、
前記複数バッファ群は互いに異なるバッファサイズを有し、
前記プロセッサは、転送データサイズが前記異なるバッファサイズの最大バッファサイズ以下である場合、前記転送データサイズ以上のバッファサイズの内の最小バッファサイズのバッファ群を、前記転送データを格納するために選択する、ネットワークインタフェース。
【請求項3】
請求項1に記載のネットワークインタフェースであって、
前記プロセッサは、使用中バッファ量に基づいて、新たな転送データに対するバッファ割り当ての有無を判定する、ネットワークインタフェース。
【請求項4】
請求項2に記載のネットワークインタフェースであって、
前記転送データサイズが前記最大バッファサイズより大きい場合、前記プロセッサは、前記転送データサイズ以上の新たなバッファ領域を確保する、ネットワークインタフェース。
【請求項5】
請求項2に記載のネットワークインタフェースであって、
前記転送データサイズが前記最大バッファサイズより大きい場合、前記プロセッサは、前記転送データを分割して前記複数バッファ群から選択したバッファを割り当てる、ネットワークインタフェース。
【請求項6】
請求項2に記載のネットワークインタフェースであって、
前記複数バッファ群それぞれにおいて同時使用可能なバッファ数の最大値が設定されている、ネットワークインタフェース。
【請求項7】
請求項2に記載のネットワークインタフェースであって、
前記プロセッサは、
前記転送データサイズが前記最大バッファサイズ以下である場合、使用中バッファ量に基づいて新たな転送データに対するバッファ割り当ての有無を判定し、
前記転送データサイズが前記最大バッファサイズより大きい場合、前記判定をスキップして前記転送データを格納するバッファを確保する、ネットワークインタフェース。
【請求項8】
請求項1に記載のネットワークインタフェースであって、
前記プロセッサは、使用中バッファ量に基づいて、新たな転送データに対するバッファ割り当ての有無を判定し、
前記複数バッファにおいて同時使用可能なバッファ数の最大値が設定されている、ネットワークインタフェース。
【請求項9】
ネットワークインタフェースにおけるバッファ制御方法であって、
前記ネットワークインタフェースは、プロセッサと、メモリと、前記プロセッサから前記メモリより先にアクセスされるキャッシュと、を含み、
前記バッファ制御方法は、前記プロセッサが、
前記メモリに、転送データを格納するための複数バッファを確保し、
前記複数バッファの空きバッファの割り当て順序を管理し、
データ転送後に解放されたバッファを、空きバッファとして前記割り当て順序の先頭位置に戻し、
前記先頭位置の空きバッファからデータ転送に使用する、バッファ制御方法。
【請求項10】
請求項9に記載のバッファ制御方法であって、
前記プロセッサが、前記メモリに、複数バッファ群を確保し、
前記複数バッファ群の各バッファ群は、同一サイズの複数バッファで構成され、
前記複数バッファ群は互いに異なるバッファサイズを有し、
前記バッファ制御方法は、前記プロセッサが、転送データサイズが前記異なるバッファサイズの最大バッファサイズ以下である場合、前記転送データサイズ以上のバッファサイズの内の最小バッファサイズのバッファ群を、前記転送データを格納するために選択する、バッファ制御方法。
【請求項11】
請求項9に記載のバッファ制御方法であって、
前記プロセッサが、使用中バッファ量に基づいて、新たな転送データに対するバッファ割り当ての有無を判定する、バッファ制御方法。
【請求項12】
請求項10に記載のバッファ制御方法であって、
前記プロセッサが、前記転送データサイズが前記最大バッファサイズより大きい場合、前記転送データサイズ以上の新たなバッファ領域を確保する、バッファ制御方法。
【請求項13】
請求項10に記載のバッファ制御方法であって、
前記プロセッサが、前記転送データサイズが前記最大バッファサイズより大きい場合、前記転送データを分割して前記複数バッファ群から選択したバッファを割り当てる、バッファ制御方法。
【請求項14】
請求項10に記載のバッファ制御方法であって、
前記複数バッファ群それぞれにおいて同時使用可能なバッファ数の最大値が設定されている、バッファ制御方法。
【請求項15】
請求項10に記載のバッファ制御方法であって、
前記プロセッサが、前記転送データサイズが前記最大バッファサイズ以下である場合、使用中バッファ量に基づいて新たな転送データに対するバッファ割り当ての有無を判定し、
前記プロセッサが、前記転送データサイズが前記最大バッファサイズより大きい場合、前記判定をスキップして前記転送データを格納するバッファを確保する、バッファ制御方法。
【請求項16】
請求項9に記載のバッファ制御方法であって、
前記プロセッサが、使用中バッファ量に基づいて、新たな転送データに対するバッファ割り当ての有無を判定し、
前記複数バッファにおいて同時使用可能なバッファ数の最大値が設定されている、バッファ制御方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ネットワークインタフェースに関する。
【背景技術】
【0002】
情報システム及びストレージシステムは、例えば、一例としてユーザアプリケーション等が動作するサーバシステムと保存するデータの管理、信頼性を向上させるストレージコントローラとサーバシステムで利用するデータを格納、保持するドライブが複数格納されたドライブボックスで構成される。
【0003】
ストレージシステムは、サーバシステムからの要求を受信し、例えばリード要求の場合、ストレージコントローラがドライブボックス内のドライブからデータを読み出し、サーバシステムへデータ転送を行う。
【0004】
従来、特にエンタープライズ製品のストレージコントローラのフロントエンドネットワークは、FC(Fibre Channel)ネットワーク、バックエンドネットワークはSAS(Serial Attached SCSI)ネットワークが主流であり、ドライブボックスは、JBOD(Just a Bunch Of Disks)で、ドライブボックスのスロットに、データを格納するSAS/SATAドライブを複数搭載する構成が一般的であった。
【0005】
近年、ストレージシステムの性能向上のために、高性能なドライブであるSSD(Solid State Drive)等のフラッシュドライブの採用が進み、フラッシュドライブにアクセスするために最適なNVMe(Non-Volatile Memory Express)プロトコルが規格化され、更に、バックエンドネットワークのドライブ接続の高拡張性に向けて、NVMeプロトコルをインターネットプロトコル(IP)上で使用することができるNVMe over Fabrics(NVMe-oF)規格が登場した。
【0006】
また、フロントエンドネットワークにも、このNVMe-oFを適用し、サーバシステムからストレージコントローラを介してドライブボックスまでの接続すべてをNVMe-oF化するEnd-to-End-NVMe-oFの考え方が広まりつつあり、NVMe-oFに対応したフラッシュドライブ搭載のドライブボックス(FBOF:Fabric-attached Bunch of Flash)や、複数のストレージコントローラをネットワークで接続したComposable Storageが登場してきており、エンタープライズストレージの分野でIP接続の活用が広がってきている。
【0007】
ネットワークの高速化や新しいプロトコルの登場(NVMe-oF等)により、エンタープライズストレージシステムにおいても、ネットワークインタフェースの高速化やマルチプロトコル対応が求められている。従来はストレージコントローラ上のCPUを用いる、又は、プロトコル毎に専用ハードウェアにオフロードして複数プロトコルに対応していた。例えば、米国特許第9100349号は、イーサネットとFCのプロトコルチップを両方搭載したNIC(Network Interface Card)により、1台で複数プロトコル対応する技術を開示する。
【0008】
しかし、ストレージコントローラ上のCPUの使用は、そのCPUリソースがプロトコル処理で消費される問題がある。プロトコル処理専用ASICを搭載したChannel Board(CHB)は、プロトコル毎に専用ASICの開発が必要であり、タイムリーなプロトコルサポートが困難であった。
【0009】
これに対して、ネットワークインタフェース装置にも変化があり、汎用プロセッサやメモリを内蔵し、オペレーティングシステムを動作させて、そのうえでソフトウェアを動かし、ネットワークプロトコルの処理を行うSmartNICが登場している。SmartNICでは、例えばサーバシステム上で動くようなものと同じオペレーティングシステムを動作させることができ、そこで利用されているソフトウェアプロトコルスタックや、アプリケーション等を動作させることができる。処理をソフトウェア実装できるため、複数のプロトコルや、新しいプロトコルへの早急な対応、プロトコル処理のアップデートにも柔軟に対応することができる。
【先行技術文献】
【特許文献】
【0010】
【発明の概要】
【発明が解決しようとする課題】
【0011】
汎用CPUとメモリを搭載したNICであるSmartNICを用いてプロトコル処理をソフトウェア実装することで複数のプロトコルに柔軟に対応しつつ、プロトコル処理負荷をストレージコントローラからオフロードすることができる。
【0012】
しかし、SmartNICはストレージコントローラに搭載するためのボード面積の制約や、ストレージコントローラのインタフェースの電力制限の制約より、搭載するメモリチップの、種類、搭載枚数及び配線に制限がある。
【0013】
例えば、iSCSIやNVMe TCPのように、データをTCP/IPパケットで転送し、一旦、SmartNICのメモリ上にパケットをおいて複数回のメモリアクセス処理が必要となるプロトコルでは、必要なメモリ性能を達成する構成を実現できない可能性がある。このため、メモリが性能のボトルネックとなって所望の性能が得られない可能性がある。
【課題を解決するための手段】
【0014】
本発明の代表的な実施形態に係るネットワークインタフェースは、プロセッサと、メモリと、前記プロセッサから前記メモリより先にアクセスされるキャッシュと、を含む。前記プロセッサは、前記メモリに、転送データを格納するための複数バッファを確保し、前記複数バッファの空きバッファの割り当て順序を管理し、データ転送後に解放されたバッファを、空きバッファとして前記割り当て順序の先頭位置に戻し、前記先頭位置の空きバッファからデータ転送に使用する。
【発明の効果】
【0015】
本発明の代表的な実施形態によれば、ネットワークインタフェースにおけるメモリネックによる性能低下を抑制できる。前記した以外の課題、構成および効果は、以下の実施形態の説明により明らかにされる。
【図面の簡単な説明】
【0016】
【
図2】ネットワークインタフェースの構成例を示す図である。
【
図3】ネットワークインタフェースのプログラム構成を示す図である。
【
図4】ストレージインタフェースのプログラムの関係の一例を示す図である。
【
図5】ネットワークインタフェースがホストとコマンド及びデータを送受信する処理の概要を説明する図である。
【
図6A】データ転送のいくつかの態様を説明する図である。
【
図6B】データ転送のいくつかの態様を説明する図である。
【
図8A】バッファリストに含まれるバッファリスト管理情報を示す。
【
図8B】バッファエントリが保持している情報を示す。
【
図10】ターゲットのネットワークインタフェースの処理フローの例を示す。
【
図11】イニシエータのネットワークインタフェースの処理フロー例を示す。
【
図12】バッファ制御処理例のフローチャートを示す。
【
図13】バッファリスト判定処理例のフローチャートを示す。
【
図14】バッファ制御処理例のフローチャートである。
【
図15】バッファリスト判定ステップにおける処理例のフローチャートを示す。
【
図16】最大アクティブ数判定処理例のフローチャートを示す。
【
図17】他の最大アクティブ数判定処理例のフローチャートを示す。
【
図18】他の最大アクティブ数判定処理例のフローチャートを示す。
【発明を実施するための形態】
【0017】
以下、図面に基づいて、実施形態を説明する。なお、以下の記載および図面は、本発明を説明するための例示であって、説明の明確化のため、適宜、省略および簡略化がなされており、本発明は、他の種々の形態でも実施する事が可能であり、特に限定しない限り、各構成要素は単数でも複数でも構わない。
【0018】
また、以下に説明する実施形態は特許請求の範囲に係る発明を限定するものではなく、実施形態の中で説明されている要素の組み合わせの全てが、発明の解決手段に必須であるとは限らない。
【0019】
以下の説明では、「テーブル」、「リスト」、「キュー」等の表現にて各種情報を説明することがあるが、各種情報は、これら以外のデータ構造で表現されていてもよく、データ構造に依存しないことを示すため、「xxxのテーブル」、「xxxのリスト」、「xxxのキュー」等を「xxx情報」等と称することがある。以下の説明では、識別情報について説明する際に、「識別情報」、「識別子」、「名」、「ID」、「番号」等の表現を用いるが、これらについてはお互いに置換が可能である。
【0020】
以下の説明では、同一あるいは同様な機能を有する構成要素が複数ある場合には、基本的に同一の符号を付して説明するが、機能が同じであっても機能を実現するための手段が異なる場合がある。さらに、後述する実施形態は、汎用コンピュータ上で稼動するソフトウェアで実装してもよいし、専用ハードウェア又はソフトウェアとハードウェアの組み合わせで実装してもよい。
【0021】
また、以下の説明では「プログラム」を主語として処理を説明することがあるが、プログラムはプロセッサ(例えば、CPU:Central Processing Unit) によって実行されることによって、定められた処理に対して、適宜に記憶資源(例えば、メモリ)、および/または、インタフェースデバイス(通信ポート)等を用いながら行うため、処理の主体がプロセッサとして説明してもよい。
【0022】
プログラムを主語として説明された処理は、プロセッサを有する計算機(例えば、計算ホスト、ストレージ装置)が行う処理としてもよい。また、以下の説明では、「コントローラ」の表現で、プロセッサ又はプロセッサが行う処理の一部又は全部を行うハードウェア回路を指してもよい。
【0023】
プログラムは、プログラムソース(例えば、プログラム配布サーバや、計算機が読み取り可能な記憶メディア)から、各計算機にインストールされてもよく、この場合、プログラム配布サーバはCPUと記憶資源を含み、記憶資源はさらに配布プログラムと配布対象であるプログラムを記憶し、配布プログラムをCPUが実行することで、プログラム配布サーバのCPUは配布対象のプログラムを他の計算機に配布してもよい。
【0024】
また、以下の説明において、2以上のプログラムが1つのプログラムとして実現されてもよいし、1つのプログラムが2以上のプログラムとして実現されてもよい。
【0025】
また、以下の説明において、記憶ドライブ又は単にドライブは、物理的な記憶デバイスを意味し、典型的には、不揮発性の記憶デバイス(例えば補助記憶デバイス)でもよい。ドライブは、例えば、HDD(Hard Disk Drive)又はSSD(Solid State Drive)でもよい。ストレージシステムに異なる種類のドライブが混在していてもよい。
【0026】
また、以下の説明において、ドライブはVOLを持ち、「VOL」はボリュームの略であり、物理的な記憶デバイスまたは、論理的な記憶デバイスでもよい。VOLは、実体的なVOL(RVOL)であってもよいし、仮想的なVOL(VVOL)であってもよい。「RVOL」は、そのRVOLを有するストレージシステムが有する物理的な記憶資源(例えば、1以上のRAIDグループ)に基づくVOLでよい。
【0027】
「VVOL」は、外部接続VOL(EVOL)と、容量拡張VOL(TPVOL)と、スナップショットVOLとのうちのいずれでもよい。EVOLは、外部のストレージシステムの記憶空間(例えばVOL)に基づいており、ストレージ仮想化技術に従うVOLでよい。TPVOLは、複数の仮想領域(仮想的な記憶領域)で構成されており容量仮想化技術(典型的にはThin Provisioning)に従うVOLでよい。
【0028】
また、以下の説明では、ホストから認識されるVOL(ホストに提供されるVOL)を「LDEV」と言う。以下の説明では、LDEVは、TPVOL(又はRVOL)であり、プールは、TPプールである。しかし、本開示の特徴は、容量拡張技術(Thin Provisioning)が採用されていないストレージ装置にも適用できる。
【0029】
「プール(POOL)」は、論理的な記憶領域(例えば複数のプールVOLの集合)であり、用途ごとに用意されてよい。例えば、プールとして、TPプールであってよい。TPプールは、複数のページ(実体的な記憶領域)で構成された記憶領域でよい。ストレージコントローラが、ホストコンピュータ(以下、ホスト)から受信したライト要求が指定するアドレスが属する仮想領域(TPVOLの仮想領域)にページが割り当てられていない場合、その仮想領域(ライト先仮想領域)にTPプールからページを割り当てる(ライト先仮想領域にページが割り当て済であってもページが新たにライト先仮想領域に割り当てられてもよい)。「プールVOL」は、プールの構成要素となるVOLでよい。プールVOLは、RVOLであってもよいしEVOLであってもよい。
【0030】
また、以下の説明では、VOLはSCSIにおける「Logical Unit(以降、LU)」でも、NVMeにおける「Name Space(以降、NS)」でもよい。
【0031】
また、以下の説明において、「RAID」は、Redundant Array of Inexpensive Disksの略である。RAIDグループは、複数のドライブ(典型的には同種のドライブ)で構成され、そのRAIDグループに関連付けられたRAIDレベルに従いデータを記憶する。RAIDグループは、パリティグループと呼ばれてもよい。パリティグループは、例えば、パリティを格納するRAIDグループのことでよい。
【0032】
本明細書の一実施形態のネットワークインタフェース装置(以下単にネットワークインタフェースとも呼ぶ)は、サーバシステム及びストレージシステムを含む情報処理システムに実装され得る。ストレージシステムは、ストレージコントローラ、及びドライブボックスを含むことができる。ネットワークインタフェースは、例えば、汎用プロセッサ、メモリ、ネットワークコントローラ、及びホストシステムとのインタフェースを含むことができる。
【0033】
ソフトウェアベースのプロトコル処理を実現できる汎用プロセッサとメモリを用いた構成は、iSCSIの他にNVMe-oF等、新規プロトコルへの対応を増やすたびにハードウェアを更新しなければならない点を解決する。例えば、iSCSIからNVMe-oFへの切り替えや、NVMe-oFの仕様アップデートによる変化、また、更に新しいプロトコルに変化しても迅速に対応できるように、汎用プロセッサやメモリ等を用いて、ネットワークインタフェースのソフトウェアの入れ替えで対応することで変化に追従する。本明細書の一実施形態のネットワークインタフェースは、複数のプロトコル処理を同時にサポートする。
【0034】
本明細書の一実施形態のネットワークインタフェースは、プロトコル処理におけるメモリアクセスを削減するために、プロトコル処理のうちメモリアクセス要因で支配的なデータを格納するデータバッファ制御について以下の方式の一部又は全部を採用することができる。
【0035】
ネットワークインタフェースは、複数サイズのバッファを使用する。バッファサイズはサポートするプロトコルの転送データサイズに応じて設定され、例えば、サポートする転送データサイズ毎に、複数のデータバッファが確保される。データバッファは、例えば、初期化時(起動時)に、リスト構造で確保される。
【0036】
例えば、ネットワークインタフェースは、起動時に、8KB、256KB等のサイズのバッファを複数個ずつ確保する。これにより、I/O中のバッファ確保負荷を削減しつつ、短データ長と長データ長でバッファを使い分けることができる。多くの短データ長の転送要求を受けた場合、使用するメモリ量を減らし、長データ長の転送要求が来た時は、多数のバッファを使用しないことでリストを引く負荷を削減できる。
【0037】
本明細書の一実施形態のネットワークインタフェースは、データバッファを選択する際に、最近使用した領域を選択する。データバッファをリストで管理し、直前に解放されたバッファを次の処理で使うようにする。これにより、データバッファへのアクセス範囲を局所化し、キャッシュヒット率を上げることができる。転送データがキャッシュヒットしてメモリアクセス回数が削減することで、メモリネックによる性能低下の課題を解消する。
【0038】
本明細書の一実施形態のネットワークインタフェースは、キャッシュ容量とアクティブなバッファ使用量の合計の差から、起動できるコマンド処理を制御する。キャッシュからデータがなるべく溢れないように、同時に処理するデータ転送のバッファ使用数を制限する。これにより、キャッシュヒット頻度を上げて、メモリアクセスを減らすことができ、メモリ帯域圧迫による性能低下を防ぐことができる。
【0039】
図1は、本明細書の一実施形態にかかる情報処理システムの構成例を示す図である。情報処理システムは、1または複数のサーバシステム100と、ストレージシステムと、を含む。ストレージシステムは、1又は複数のストレージ装置101と、1または複数のドライブボックス105と、を含む。
【0040】
ストレージ装置101は、1または複数のストレージコントローラ102を含む。
図1の構成例では、各ストレージ装置101は、二つのストレージコントローラ102を含む。ストレージコントローラ102は、フロントエンドネットワーク106を介して、1または複数のサーバシステム100に接続されている。
【0041】
ドライブボックス105は、1または複数のドライブを搭載し、1または複数のストレージコントローラ102とバックエンドネットワーク107を介して接続される。また、ストレージコントローラ102は、ストレージコントローラ間ネットワーク108による近距離の接続の他に、中、遠距離の別のストレージコントローラ102と外部ネットワーク109を介して接続する。
【0042】
サーバシステム100は、ユーザアプリケーション等が動作するホストマシンであり、1又は複数のプロセッサを有し、メモリ、補助記憶装置の1又は複数の記憶装置を含んで構成される。例えば、データベースやWebサービスが動作し、サーバシステム100は、それらにより作られたデータを、ネットワークインタフェース104を介してストレージコントローラ102にライト及びリードする。また、サーバシステム100は、ストレージコントローラ102とフロントエンドネットワーク106を介して接続し、そのインタフェース装置としてネットワークインタフェース104を持つ。サーバシステム100は、複数のサーバ群で構成されてもよく、それぞれにネットワークインタフェース104を持ちストレージコントローラ102や、他のサーバシステム100と接続してもよい。
【0043】
サーバシステム100にストレージとしての機能を提供するため、ストレージ装置101内の二つのストレージコントローラ102は、冗長化されたコントローラを構成する。ストレージコントローラ102は、それぞれ、1又は複数のプロセッサ及び1又は複数の記憶装置を備える。ストレージ装置101内のストレージコントローラ102は同じ構成を有する。
【0044】
ストレージコントローラ102は、それぞれ、1又は複数のプロセッサを有し、各プロセッサのコアは、サーバシステム100からのリードコマンドやライトコマンドに応じて、対応するドライブボックス105に格納されたデータを転送指示する。ストレージコントローラ102のメモリは、例えば、SDRAM(Synchronous Dynamic Random Access Memory)等の半導体メモリで構成される。メモリは、揮発メモリとSCM(Storage Class Memory)などの不揮発メモリと組み合わせて構成してもよい。
【0045】
メモリは、プロセッサの主記憶として、実行プログラム(ストレージ制御プログラム等)や、プロセッサが参照する管理テーブル等を格納する。また、メモリは、ストレージコントローラ102のディスクキャッシュ(キャッシュメモリ)としても使用される。ストレージコントローラ102は、ドライブボックス105に対するインタフェース装置としてネットワークインタフェース104を持つ。ネットワークインタフェース104は、サーバシステム100から指示されたデータ転送や、データコピー等のストレージ処理にかかる処理に関する情報をドライブボックス105と通信する。
【0046】
ドライブボックス105は、SSDやHDD等のドライブを複数搭載し、それら複数ドライブとストレージコントローラ102を接続するために、内部スイッチ、並びに、転送処理に利用するプロセッサ及びメモリを含む。サーバシステム100にて生成されたデータを、ストレージコントローラ102を介して受信し、格納、保持する。
【0047】
ドライブボックス105は保持しているデータの可用性を確保するために、内蔵されているドライブ間でRAIDを組んでもよいし、複数のドライブボックス105間でRAIDを組んでもよい。また、ドライブボックス105はストレージコントローラ102とバックエンドネットワーク107を介して接続し、そのインタフェース装置としてネットワークインタフェース104を持つ。
【0048】
ネットワークインタフェース104は、サーバシステム100、ストレージコントローラ102、及びドライブボックス105それぞれに搭載され、各種装置と各種ネットワークとの接続インタフェースとなる装置である。
【0049】
ネットワークインタフェース104は、例えば、SmartNICでもよい。SmartNICの各種機能は、SmartNIC搭載の汎用プロセッサ及び、一部ハードウェアオフロードエンジンを用いて実施される。また、SmartNICはFPGA(Field Programmable Gate Array)を用いた構成でもよく、その場合は、各機能はFGPA上で実現される。さらに、その他の形態として、全体がハードウェア実装された専用インタフェースハードウェアとしての構成であってもよい。ネットワークインタフェース104の詳細は後述する。
【0050】
フロントエンドネットワーク106は、ストレージコントローラ102とサーバシステム100の間を接続するストレージエリアネットワークで、例えば、iSCSI、NVMe-oF(NVMe over Fabrics)等のIPネットワークが利用される。バックエンドネットワーク107は、ストレージコントローラ102とドライブボックス105の間を接続するネットワークであり、例えば、iSCSI、NVMe-oF等のIPネットワークが利用される。
【0051】
ストレージコントローラ間ネットワーク108は、ストレージコントローラ102の冗長化のために利用するネットワークで、広帯域のインタコネクトで構成される。当該ネットワークを使って、ライトデータの2重化やメタデータの共有等を行い、一方のストレージコントローラ102が保守や障害等で閉塞しても、もう一方のストレージコントローラ102により、ストレージ処理を継続可能となる。
【0052】
外部ネットワーク109は、Wide Area Network(WAN)、または、Local Area Network(LAN)で例えば、データリンク層がイーサネット(登録商標)、インターネット層がインターネットプロトコル、トランスポート層がTCP、または、UDP等のネットワークで、iSCSIやNVMe-oFのProtocol Data Unit(PDU)を用いた通信を行う。当該ネットワークは、インターネット回線又は専用回線の形態をとることができる。距離に応じて、通信遅延が大きくなり、ネットワーク機器をロスレス機器のみで構成しない場合、上記回線種によって発生率は異なるが、パケットロスの発生が想定される。
【0053】
なお、情報システム、ストレージシステムは、ここで示したもの以外も含んでよい。例えば、各ネットワークには、スイッチやルーター等のネットワーク機器が間に接続されてもよいし、監視や保守のための装置が接続されてもよい。また、パブリッククラウド上のストレージサービスに外部ネットワーク109を経由して接続する構成でもよい。
【0054】
サーバシステム100のネットワークインタフェース104は、ストレージコントローラ102を介してドライブボックス105のデータを読み書きするために、iSCSIやNVMe-oFにおけるイニシエータソフトウェアを持つ。これに対して、ストレージコントローラのネットワークインタフェース104は、ターゲットソフトウェアを持つ。
【0055】
ストレージコントローラ102のネットワークインタフェース104は、ドライブボックス105のデータを読み書きするために、iSCSIやNVMe-oFにおけるイニシエータソフトウェアを持つ。これに対して、ドライブボックス105のネットワークインタフェース104はターゲットソフトウェアを持つ。
【0056】
さらに、ストレージコントローラ102のネットワークインタフェース104は、ほかのストレージ装置101のデータを読み書きするために、iSCSIやNVMe-oFにおけるイニシエータソフトウェアを持つ。これに対して他のストレージ装置101のネットワークインタフェース104は。ターゲットソフトウェアを持つ。
【0057】
なお、ネットワークインタフェース104の一部はSmartNICの機能性を持たないNICでもよい。例えば、100内の104はNICでイニシエータとして動作し、102内の104はSmartNICでターゲットとして動作する構成などがある。
【0058】
図2は、本明細書の一実施形態にかかるネットワークインタフェース104の構成例を示す図である。ネットワークインタフェース104は、ホストバス201を介して、ネットワークインタフェース104を搭載する機器、例えば、ストレージコントローラ102やサーバシステム100の内部構成やドライブボックス105等と接続される。ネットワークインタフェース104は、ネットワークパス200を介して、例えばIPネットワーク接続で他の機器と接続する。
【0059】
ネットワークインタフェース104は、データプロセッシングユニット202及びメモリ208を含む。データプロセッシングユニット202は、ホストバス201に接続するためのホストインタフェース207、ネットワークパス200と接続してネットワークプロトコルの処理を行うネットワークコントローラ203を含む。さらに、プロセッサ204、メモリコントローラ209、DMA(Direct Memory Access)コントローラ205、及びキャッシュ206を含む。
【0060】
ホストバス201は、ネットワークインタフェース104をストレージコントローラ102やサーバシステム100、ドライブボックス105等と接続するバスである。ホストバス201は、広帯域で高速なインタコネクトであり、例えば搭載する機器のプロセッサ等とPCIeで接続する構成をとる。
【0061】
ホストインタフェース207は、ホストバス201を介してネットワークインタフェース104とホストシステム(以下単にホストとも呼ぶ)を接続するためのインタフェースである。例えば、ホストバス201がPCIeの場合、例えばPCIeのPHYを含むことができる。DMAコントローラ205は、ネットワークインタフェース104内のメモリ208とホストのメモリ間でデータをやり取りする。
【0062】
ネットワークパス200は、例えば、IPネットワークのパスで、WAN、LAN、または、SAN(Storage Area Network)のネットワーク形態をとる。ネットワークインタフェース104は、1つのネットワークパス200、または、冗長化することも考慮して2以上のネットワークパス200を介して通信を行う。
【0063】
ネットワークコントローラ203は、ネットワークパス200にネットワークインタフェース104を接続するためのインタフェースである。ネットワークコントローラ203は、例えば、PHY等の物理層の処理、並びに、データリンク層、インターネット層、及びトランスポート層のステートレスな処理を実行する。ネットワークコントローラ203は、例えばチェックサムやフレーム処理を行う。
【0064】
ネットワークコントローラ203は、例えば、イーサネット、IP、TCP、UDP等に対応する。更に、IPsec(Internet Security Protocol)やTLS(Transport Layer Security)、DIF(Data Integrity Field)等のオフロードエンジンを含んでもよい。また、光ケーブルやカッパーケーブル等との接続に対応した構成をとる。
【0065】
プロセッサ204は、例えば、汎用プロセッサであり、例えば、サーバシステム100等でも利用されるオペレーティングシステムを実行する。プロセッサ204は、さらに、他のソフトウェアを実行して、プロトコル処理やコマンド処理やネットワークインタフェース104の管理等の処理を行う。プロセッサ204は、任意の構成を有することができ、例えば、1又は複数のCPU又はMPU(Micro Processing Unit)を含み、1又は複数のコア241を含むことができる。
【0066】
メモリ208は、例えば、SDRAM等の半導体メモリで構成され、SCMなどの不揮発メモリと組み合わせて構成してもよい。メモリ208は、プロセッサ204の主記憶として、実行プログラム(プロトコル処理やコマンド処理の命令コード)や、プロセッサが参照する管理テーブル等を格納する。また、メモリ208は、ネットワークと送受信するコマンドやデータのバッファとしても利用される。更に、ネットワークコントローラ203やホストインタフェース207とキューイングインタフェースをとり、キューのディスクリプタやインデックス等を格納する。
【0067】
メモリコントローラ209は、メモリ208のデータを読み書きする際にメモリを制御するためのインタフェースである。メモリコントローラ209は、例えば、プロセッサ204に内蔵されてもよいし、データプロセッシングユニット202に内蔵されてもよいし、ネットワークインタフェース104に内蔵されてもよい。
【0068】
キャッシュ206は、メモリ208とプロセッサ204との間において、データを一時的に格納する。プロセッサ204は、メモリ208よりも高速にキャッシュ206にアクセスすることができる。メモリ208から読み出されたデータは、キャッシュ206に格納される。プロセッサ204は、メモリ208より前にキャッシュ206にアクセスしてデータ(コマンドを含む)を読み出す。キャッシュ206は階層構造を有することができる。よりプロセッサに近い階層から、L1キャッシュ、L2キャッシュ等と呼ばれる。プロセッサ204とDMAコントローラ205はキャッシュ206に対してコヒーレント性を確保する(一貫性を持つ)。
【0069】
なお、情報システム及びストレージシステムは、ここで示したもの以外も含んでよいものとし、例えば、監視や保守のためのモジュールやインタフェース、ネットワークインタフェース104上で動作するオペレーティングシステムやソフトウェアプログラムが格納される不揮発の記憶装置が追加されてもよい。
【0070】
図3は本明細書の一実施形態にかかるネットワークインタフェースのプログラム構成を示す図である。ソフトウェアベースの変更可能な処理機能を実現するために、ネットワークインタフェース104は、汎用的なプロセッサ204、キャッシュ206及びメモリ208を用いて、オペレーティングシステム300を動作させ、その上で各種処理のソフトウェアプログラムを動作させる。
【0071】
ソフトウェアプログラム300~308は、メモリ208に展開され、プロセッサ204処理される。一部の命令は、キャッシュ206に格納される。なお、DIF(Data Integrity Field)やCRC(Cyclic Redundancy Check)、暗号、圧縮、ハッシュ、パリティ処理などハードウェア化したほうが効率の良くなる処理部分はハードウェアに実装し、ソフトウェアにより制御してもよい。
【0072】
オペレーティングシステム300は、ネットワークインタフェースを動作させるための基盤となる基本ソフトウェアプログラムであり、ネットワークインタフェース全体を管理する。オペレーティングシステム300は、ネットワークインタフェースのプロセッサ上で動作する各ソフトウェアに共通する利用環境を提供する。オペレーティングシステム300は、組込み向けオペレーティングシステムでもよいし、サーバ上で動くような汎用オペレーティングシステム、例えばLinux(登録商標)等でもよい。
【0073】
ネットワークコントローラドライバ301は、ネットワークコントローラ203を制御するためのドライバソフトウェエアである。ネットワークコントローラドライバ301は、パケット生成またはパケット受信時にオフロードするパケット処理のパラメータセットをネットワークコントローラ203へ渡す。さらに、プロトコル処理303が生成したパケットをネットワークコントローラ203へ渡して送信させる。また、ネットワークコントローラ203から受信したパケットを、プロトコル処理303へ渡す。
【0074】
ホストインタフェースドライバ302は、ホストインタフェース207を制御するためのドライバソフトウェエアである。ネットワークインタフェース104とホストとの通信は、ホストインタフェースドライバ302を介して実行される。
【0075】
プロトコル処理303は、コマンド処理305、DMA制御307、ネットワークコントローラドライバ301と連携して、送信パケットの生成及びその送信処理を行う。また、受信したパケットを処理して、制御情報やiSCSI PDU、NVMe-oF PDU等の情報及びデータを取り出して、取り出した情報をコマンド処理305へ渡す。
【0076】
プロトコル処理303は、インターネットプロトコル層のIPヘッダ処理、トランスポート層のTCPヘッダ処理やUDPヘッダ処理、そして、iSCSI処理やNVMe-oF処理を行う。例えば、プロトコル処理303は、ソケットプログラムや、iSCSIイニシエータまたはターゲット、NVMe-oFイニシエータまたはターゲット等のプログラムを実行する。
【0077】
ホストキュー制御304は、ホストとコマンドのやり取りをするためのキューインタフェースを制御するためのソフトウェアである。ホストキュー制御304は、ネットワークインタフェース104内で、ホストへ送信するコマンドの内部キュー及びホストから受信したコマンドの内部キューを管理する。ホストキュー制御304は、ホストへのコマンド又はホストからのコマンドを内部キューに格納する。また、内部キューを例えば、リング構造としたときのHead及びTailを制御する。ホストキュー制御304は、ホストが保持するコマンドキューのHead及びTailを制御する。
【0078】
コマンド処理305は、ホストからネットワークインタフェース104を制御するためのコマンドを受信し、ネットワークインタフェース104を制御する。ネットワークプロトコルの処理要求をホストから受け、プロトコル処理303を起動し、プロトコル処理303の処理結果をホストへ応答する。また、ホストで確保されたメモリとのデータ転送のために、DMA制御307を起動し、応答処理を行う。更に、初期設定や設定変更、ネットワークインタフェース104のソフトウェア交換や、障害時のホストへの通知等を行う。
【0079】
バッファ制御306は、メモリ208内でデータを一時的に保持するバッファを制御するためのソフトウェアである。バッファは、ネットワークから受信、ホストに転送するデータ又はホストから受信しネットワークに送信するデータを格納する。バッファ制御306は、異なる複数のサイズのバッファ群を確保、使用及び管理する。バッファ制御306は、キャッシュヒット率が向上するようにバッファを制御する。この点の詳細は後述される。
【0080】
DMA制御307は、例えば、ホスト側で確保されたメモリと、ネットワークインタフェース104上のメモリ208と、の間のデータ転送を制御するため、DMAハードウェアとのインタフェース処理を行う。
【0081】
初期化/保守/障害処理308は、ネットワークインタフェース104を構成するハードウェアの初期化及び、各種ソフトウェアの初期化処理を行う。また、ネットワークインタフェース104のソフトエアの更新や、ハードウェア故障の検出及びホストへの通知等をサポートする。
【0082】
図4は、
図3に示したストレージインタフェースのプログラムの関係の一例を示す図である。ネットワークインタフェース104では、オペレーティングシステム300が動作し、各ソフトウェアプログラムはそれをベースに動作する。また、初期化/保守/障害処理308により、ネットワークインタフェース104は、初期設定、ソフトウェア更新等の保守、及び障害処理等を実行する。障害処理は、例えば、障害検出、並びに統計情報及びエラー情報などのダンプトレース情報の収集等を含む。
【0083】
ネットワークコントローラドライバ301は、ネットワークコントローラ203を制御し、ネットワークコントローラ203のパケットバッファに対して送信パケットを格納し、そのパケットバッファから受信パケットを取得する。また、データリンク層、インターネットプロトコル層、トランスポート層のフレーム処理や、ステートレスな処理、例えば、チェックサム計算等をオフロードするための設定を行う。
【0084】
ネットワークコントローラドライバ301の動作を受けて、プロトコル処理303は、IP、TCP、UDP、iSCSI PDU処理、NVMe-oF PDU処理等のネットワークプロトコル処理を行う。プロトコル処理303は、ネットワークコントローラドライバ301からの受信パケットを処理して、制御情報やiSCSI PDU、NVMe-oF PDU等の情報及びデータを取り出す。受信パケットはデータを含まない場合もある。プロトコル処理303は取り出した情報を、コマンド処理305に渡す。データは、バッファ制御306により制御されているバッファを介して又はバッファを介することなくホストに転送され得る。
【0085】
プロトコル処理303は、コマンド処理305から取得した情報及びホストから送信されたデータをネットワークヘの送信パケットに含める。データは、バッファ制御306により制御されているバッファを介して又は介することなくネットワークに転送され得る。送信パケットは、データを含まない場合もある。
【0086】
コマンド処理305は、ホストキュー制御304、バッファ制御306及びDMA制御307と協働でコマンド処理を実行する。コマンド処理305は、ホストインタフェースドライバ302を介して、ホストインタフェース207を制御する。コマンド処理305は、ホストシステムとネットワーク通信の送信コマンドまたは受信コマンド、例えば、iSCSIやNVMe-oFのPDU生成のための情報、解析した情報又はPDUそのものをやりとりする。コマンドは、キューインタフェースを用いて、ホストシステムとやり取りされる。ホストキュー制御304は、このキューインタフェースを制御する。
【0087】
コマンド処理305は、プロトコル処理303の結果より、ホストが処理できるディスクリプタを生成して、ホストキュー制御304を介して、キューに格納する。また、ホストシステムが生成したディスクリプタをキューから取得し、プロトコル処理303等、ネットワークインタフェース104内の各機能を設定、利用する。なお、キューのディスクリプタは、DMA制御307によりDMAコントローラ205を用いてホストシステムとネットワークインタフェース104でやり取りできる。
【0088】
図5は、ネットワークインタフェース104が、ホスト、例えば、ストレージコントローラと102と、コマンド及びデータを送受信する処理の概要を説明する図である。以下では、ホストとやり取りするコマンドをホストコマンドとも呼ぶ。
【0089】
ネットワークインタフェース104は、ネットワークからパケット351を受信し、その処理をいずれかのコア241に割り当てる。割り当てられたコア241は、そのプロトコル処理を実行して、情報及びデータを取り出す。
図5の例において、取り出されたデータはバッファ381に格納される。コア241は、受信パケット351から取り出した情報から、ホストに送るホストコマンド355を生成する。
【0090】
ホストコマンドは内部送信キュー371に格納される。内部送信キュー371は、コア241毎に用意されており、
図5において、一つの内部送信キューが例として符号371で指示されている。
図5の例において、内部送信キュー371はリングバッファ(FIFO)であり、新たなコマンドはそのTail領域に格納される。各内部送信キュー371のHead及びTailが管理される。
【0091】
ネットワークインタフェース104は、内部送信キュー371のHeadから取り出したホストコマンドを、ホスト400のホスト送信キュー401に転送する。ホスト400は、例えば、ストレージコントローラ102やサーバシステム100である。ホスト送信キュー401は、
図5の例においてリングバッファである。ネットワークインタフェース104は、ホスト400と共に、ホスト送信キュー401のHead及びTailを管理する。
【0092】
図5の例において、複数の内部送信キュー371からのホストコマンドが、一つのホスト送信キュー401に転送される。他の例において、複数のホスト送信キュー401が用意されていてよく、例えば、内部送信キュー371それぞれと対応する同数のホスト送信キュー401が使用されてもよい。
【0093】
ホスト400は、ネットワークインタフェース104に転送するホストコマンドをホスト受信キュー402に格納する。ホスト受信キュー402はリングバッファである。ネットワークインタフェース104は、ホスト400と共に、ホスト受信キュー402のHead及びTailを管理する。
【0094】
ネットワークインタフェース104は、ホスト受信キュー402のコマンドをその内部受信キュー372に転送する。内部受信キュー372は、コア241毎に用意されており、
図5において、ホストから転送してきたホストコマンドを見て、対応する一つの内部受信キューを選択して転送する。このとき、ホストコマンドを見るのは、ホストキュー制御304でもよいし、DMAのハードウェアでもよい。一つの内部受信キューが例として符号372で指示されている。複数のホスト受信キュー402が用意されていてよく、例えば、内部受信キュー372への振り分け処理が不要となるように、内部受信キュー372それぞれと対応する同数のホスト受信キュー402が使用されてもよい。
【0095】
ネットワークインタフェース104は、ホスト400からのホストコマンドに応じてバッファ381に格納されているデータをホスト400に転送し、また、ホスト400のメモリに格納されているデータ354をバッファ382に転送する。後述するように、バッファ381、382は、キャッシュヒット率が向上するように制御される。
【0096】
ネットワークにデータ354を含むパケットを送信するホストコマンド356を受信すると、ネットワークインタフェース104は、そのホストコマンド356により、データ354のプロトコル処理を実行して、送信パケット352を生成する。ネットワークインタフェース104は、送信パケット352をネットワークに送信する。
【0097】
図6A及び
図6Bは、データ転送のいくつかの態様を説明する図である。
図6Aは、ネットワークインタフェース104のキャッシュ206/メモリ208を使用するデータ転送のいくつかの例を示し、
図6Bは、キャッシュ206/メモリ208を使用しないデータ転送のいくつかの例を示す。データ転送は、DMAコントローラ205を使用して実行される。ネットワークインタフェース104は、
図6A及び6Bに示す全てのデータ転送をサポートしてよく、一部、例えば、
図6Aのデータ転送のみをサポートしてもよい。
【0098】
図6Aは、ネットワークインタフェース104のキャッシュ/メモリを介すデータ転送を示す。例えば、iSCSIやNVMe TCPのデータ転送が該当する。
図6Aにおいて、データ転送501は、ホスト400とネットワークインタフェース104のキャッシュ206/メモリ208の間で実行される。データ転送501において、エラーチェックや保証コードの付与や除去は行われていない。データ転送501は、例えば、ネットワークインタフェース104上で動作するプログラムの更新データや、キューを介して転送するディスクリプタの転送等が該当する。データ転送511は、ホスト400とリモートサイト450との間で、ネットワークインタフェース104のキャッシュ206/メモリ208を介して実行される。データ転送511において、エラーチェックや保証コードの付与や除去は行われていない。
【0099】
データ転送512は、リモートサイト450からホスト400に対して、ネットワークインタフェース104のキャッシュ206/メモリ208を介して実行される。DMAコントローラ205は、リモートサイト450からのデータにDIF(Data Integrity Field)を付与して、ホスト400に転送する。DIFを生成するため情報は、ホスト400から得られる。
【0100】
データ転送513は、ホスト400からリモートサイト450に対して、ネットワークインタフェース104のキャッシュ206/メモリ208を介して実行される。DMAコントローラ205は、ホスト400からのデータに付与されているDIFを参照してデータチェックを行い、そのDIFをデータから除去する。DIFが除去されたデータが、リモートサイト450に転送される。
【0101】
データ転送514は、ホスト400とリモートサイト450との間で、ネットワークインタフェース104のキャッシュ206/メモリ208を介して実行される。転送されるデータにはDIFが付与されている。DMAコントローラ205は、データに付与されているDIFを参照してエラーチェックを実行する。
【0102】
データ転送515は、ホスト400とリモートサイト450との間で、ネットワークインタフェース104のキャッシュ206/メモリ208を介して実行される。転送されるデータにはDIFが付与されている。DMAコントローラ205は、データに付与されているDIFを参照してエラーチェックを実行すると共に、DIFを除去して新たなDIFを付与する。
【0103】
図6Bは、ネットワークインタフェース104のキャッシュ/メモリを介さないデータ転送を示す。例えば、RDMA(Remote Direct Memory Access)が該当する。
【0104】
データ転送521は、ホスト400とリモートサイト450との間で実行される。データ転送521において、エラーチェックや保証コードの付与や除去は行われていない。データ転送522は、リモートサイト450からホスト400に対して実行される。DMAコントローラ205は、リモートサイト450からのデータにDIF(Data Integrity Field)を付与して、ホスト400に転送する。
【0105】
データ転送523は、ホスト400からリモートサイト450に対して実行される。DMAコントローラ205は、ホスト400からのデータに付与されているDIFを参照してデータチェックを行い、そのDIFをデータから除去する。DIFが除去されたデータが、リモートサイト450に転送される。
【0106】
データ転送524は、ホスト400とリモートサイト450との間で実行される。転送されるデータにはDIFが付与されている。DMAコントローラ205は、データに付与されているDIFを参照してエラーチェックを実行する。データ転送525は、ホスト400とリモートサイト450との間で実行される。転送されるデータにはDIFが付与されている。DMAコントローラ205は、データに付与されているDIFを参照してエラーチェックを実行すると共に、DIFを除去して新たなDIFを付与する。
【0107】
図7は、バッファリストの構成例を示す。ネットワークインタフェース104は、メモリ208内に、異なるサイズのバッファ群を作成及び管理する。各バッファ群は複数のバッファで構成されている。異なるサイズは、サポートするデータ転送サイズに応じて設定されている。例えば、8KB、16KB、32KB・・・、256KB等のサイズのバッファが、ネットワークインタフェース104の起動時に確保される。
【0108】
各バッファ群は、対応するバッファリストにより管理される。
図7は、サイズXのバッファ群のバッファリスト700A、サイズYのバッファ群のバッファリスト700B、及びサイズZのバッファ群のバッファリスト700C、を例として示す。バッファリストは、バッファ制御306により管理される。
【0109】
各バッファリストは、複数のバッファエントリ703を含む。
図7は、例として一つのバッファエントリを符号703で指示する。バッファエントリ703は矩形で表され、その内部の数字はエントリ番号を示す。例えば、サイズが8KBのバッファリストは、バッファエントリ数の8KBのバッファを管理する。バッファエントリ703は、対応するバッファの情報を示す。
【0110】
図8Aは、各バッファリストに含まれるバッファリスト管理情報750を示す。バッファリスト管理情報は、バッファエントリヘッドアドレス751及びバッファアクティブ数752を示す。バッファエントリヘッドアドレス751は、バッファリストの先頭のエントリのアドレスを示す。バッファアクティブ数752は、現在使用中のバッファエントリの数を示す。
【0111】
図8Bは、バッファエントリ703が保持している情報を示す。バッファエントリ703は、バッファエントリアドレス761、バッファアドレス762及びネクストバッファエントリアドレス763を示す。バッファエントリアドレス761は、当該バッファエントリのアドレスを示す。バッファアドレス762は、当該バッファエントリ703が管理するバッファのメモリ208内のアドレスを示す。ネクストバッファエントリアドレス763は、当該バッファエントリ703の次のバッファエントリのアドレスを示す。
【0112】
バッファエントリ703は、不図示のフィールドにおいて、当該バッファがアクティブであるか、空きであるかを管理してもよい。バッファエントリヘッドアドレス751は、空きバッファのバッファエントリの先頭エントリを示す。ネクストバッファエントリアドレス763に従って空きバッファのバッファエントリが順序付けされて並ぶ。このように、バッファリストは、新たなデータを格納するために、先頭バッファエントリからバッファエントリが選択される。このように、空きバッファの割り当て順序が管理される。
【0113】
先頭バッファエントリが選択されると、バッファエントリヘッドアドレス751が更新される。このため、使用中バッファのエントリは、空バッファのエントリのリストから外される。後述するように、データ転送で使用された後に解放されたバッファのエントリは、空きバッファエントリのリストの所定の位置、後述する例において先頭位置に戻される。
【0114】
上記複数バッファサイズのバッファリストによって、I/O中のバッファ確保負荷を削減しつつ、短データ長と長データ長でバッファを使い分けることで、多くの短データ長の転送要求が来た時は使用するメモリ量を減らし、長データ長の転送要求が来た時にバッファ使用数を少なくすることで、リストを引く負荷を削減する。
【0115】
図9は、バッファ管理テーブル900の構成例を示す。バッファ管理テーブル900は、バッファを管理するための情報を示し、ストレージコントローラ102により生成される。バッファ管理テーブル900は、バッファ群を動的に変更可能とする。具体的には、バッファ管理テーブル900は、バッファリスト771、バッファサイズ772、バッファ数773、最大アクティブ数774、及び制御タイプ775を示す。
【0116】
バッファリスト771は、バッファリストの識別子を示す。バッファサイズ772は、バッファリストが管理するバッファ群のバッファサイズを示す。バッファ数773は、バッファリストが管理するバッファ数、つまり、バッファエントリ数を示す。バッファ数773は、初期化において確保されるバッファ数を示す。最大アクティブ数774は、バッファリストが管理するバッファ群における同時使用の最大バッファ数を示す。最大アクティブ数を変更することで、同時に使用できる最大バッファ数を動的にコントロールする。制御タイプ775は、バッファの制御タイプを示す。制御タイプに応じて、バッファの制御方法を切り替える。例えば、バッファの許容アクティブ数の計算方法をバッファリスト毎に行うか、すべてのバッファリストのアクティブ数を踏まえて行うかが切り替えられる。また、バッファリストのバッファサイズ上の転送の時に、複数バッファを使うか、新しく領域を確保するかの方式を切り替えられる。
【0117】
図10は、ターゲットのネットワークインタフェース104の処理フローの例を示す。ネットワークインタフェース104は、ネットワークからネットワークインタフェース104のホストへの通信パケットに対する処理を実行する。例えばホストはターゲットのストレージコントローラ102であり、ネットワーク106を介してイニシエータのサーバシステム100から通信パケットが転送される。
【0118】
ネットワークコントローラ203は、ネットワークから通信パケットを受信する(S101)。ネットワークコントローラ203は、受信した通信パケットのプロトコル処理を、プロセッサ204のコアに振り分ける(S102)。
【0119】
通信パケットのプロトコル処理を割り当てられてコアは、プロトコル処理303を実行する(S103)。プロトコル処理303は、通信パケットから情報を抽出して、コマンド処理305に渡す。
【0120】
コマンド処理305は、通信パケットから抽出された情報に応じて、ホストに通信プロトコル処理結果を通知するためのホストコマンドを生成する(S104)。処理結果の通知は、例えば、ネットワークからリード要求やライト要求が受信されたことをストレージコントローラ102に通知する。さらに、コマンド処理305は、生成したホストコマンドを、ネットワークインタフェース104内の内部送信キュー371に積み込む(S105)。ホストコマンドの積み込みに応答して、コマンド処理305は、内部送信キュー371のTailを更新する(S106)。
【0121】
ホストキュー制御304は、担当するコアの内部送信キュー371のTail更新を受けて、内部送信キュー371のホストコマンドを、DMA制御307を介してDMAコントローラ205を使用して、ホスト送信キューに転送する(S107)。ホストコマンドの転送に応じて、ホストキュー制御304は、ホスト送信キュー401のTailを更新する(S108)。ホスト送信キュー401のTailやHeadの情報は、ネットワークインタフェース104とホストが同一情報を参照してもよく、それぞれが保持する情報を転送してもよい。さらに、ホストキュー制御304は、内部送信キューのHeadを更新する(S109)。
【0122】
ホストは、ホスト送信キュー401からホストコマンドを取得し、ホスト送信キューのHeadを更新する(S110)。ネットワークインタフェース104は、ホスト送信キューのHeadをホスト側の更新に合わせて受取って更新してもよいし、別のタイミングでホストから通知を受けてもよい。ホストは取得したホストコマンドを参照し、ネットワークインタフェース104にコマンドを送る必要があるか判定する(S111)。
【0123】
ホストがネットワークインタフェース104にホストコマンドを送る必要がある場合(S111:YES)、ホストは、ホスト受信キュー402にホストコマンドを積み込み(S112)、ホスト受信キュー402のTailを更新する(S113)。ホストが持つホスト受信キュー402の情報の更新に応答して、ネットワークインタフェース104も、それが持つホスト受信キュー402の情報を更新する。この更新は、ホストとネットワークインタフェース104が共通の情報を参照してもよく、更新情報をそれらの間で転送してもよい。
【0124】
ホスト受信キュー402のTail更新を受けて、いずれかのコアのホストキュー制御304は、DMA制御307によってDMAコントローラ205を使用して、ホスト受信キュー402に積まれたホストコマンドを、ネットワークインタフェース104に転送する(S114)。例えば、定期的に各コアがロックを取り合って、ホスト受信キューの更新がないかを見て、更新がある場合は転送処理をしてもよいし、ホスト受信キューの更新確認と転送を専用に行うコアを持ってもよいし、複数ホスト受信キューを作り、自分の担当の受信キューに更新があった場合は転送処理をするとしてもよい。ホストキュー制御304は、ホストからのホストコマンドを内部受信キュー372に積み込む(S115)。例えば、ホストコマンドの中を確認して、どの内部受信キュー372に積み込むかを判定してもよいし、複数ホスト受信キューがある場合は、対応した内部受信キュー372に積み込んでもよい。
【0125】
ホストコマンドの内部受信キュー372への積み込みに応答して、ホストキュー制御304は、内部受信キュー372のTailを更新し(S116)、さらに、ホスト受信キュー402のHeadを更新する(S117)。ホスト受信キュー402のHeadの更新方法は、ホスト受信キュー402のTailの更新について説明した通りである。
【0126】
コマンド処理305は、内部受信キュー372よりホストコマンドを取得して、処理を実行する(S118)。バッファを使用したデータ転送が必要な場合(S119:YES)、バッファ制御ステップS120が実行される。バッファ制御ステップS120の詳細は後述する。データ転送は、ネットワークからホストへのデータ転送又はホストからネットワークへのデータ転送である。
【0127】
バッファ確保に失敗した場合(S121:NO)、フローはステップS118に戻る。バッファ確保できた場合(S121:YES)、コマンド処理305は、DMA制御307によりDMAコントローラ205を使用してホストからデータをバッファに転送する、又は、ネットワークコントローラ203からのデータをバッファに格納し、バッファからホストにDMAコントローラ205を使用して転送する(S123)。データ転送に応答して、ホストキュー制御304は、内部受信キュー372のHeadを更新する(S124)。
【0128】
ステップS119に戻って、バッファを使用したデータ転送が不要な場合(S119:NO)、コマンド処理305は、データ転送の有無を判定する(S122)。バッファを使用しないデータ転送が必要である場合(S122:YES)、DMAコントローラ205は、バッファを介することなく、ネットワークコントローラ203とホストとの間でデータを転送する(S123)。バッファを使用しないデータ転送が不要である場合(S122:NO)、データ転送せずに次の処理を行う。ホストキュー制御304は、内部受信キュー372のHeadを更新する(S124)。
【0129】
次に、コマンド処理305は、ネットワークに対して通信パケットを送信する必要があるか判定する(S125)。不要である場合(S125:NO)、フローはステップS104に戻る。必要である場合(S125:YES)、コマンド処理305はプロトコル処理303に依頼し、プロトコル処理303がプロトコル処理を実行して通信パケットを生成し、ネットワークコントローラ203が通信パケットをネットワークに送信する(S126)。
【0130】
図11は、イニシエータのネットワークインタフェース104の処理フロー例を示す。例えば、ストレージコントローラ102にアクセスするサーバシステム100や、ストレージ間通信でのイニシエータのストレージコントローラ102に実装されたネットワークインタフェース104は、
図11に従って動作する。
【0131】
ホストは、ホスト受信キュー402にホストコマンドを積み込み(S151)、ホスト受信キュー402のTailを更新する(S152)。ホストが持つホスト受信キュー402の情報の更新に応答して、ネットワークインタフェース104も、それが持つホスト受信キュー402の情報を更新する。ホストとネットワークインタフェース104が共通の情報を参照してもよく、更新情報をそれらの間で転送してもよい。
【0132】
ホスト受信キュー402のTail更新を受けて、いずれかのコアのコマンド処理305は、DMA制御307によってDMAコントローラ205を使用して、ホスト受信キュー402に積まれたホストコマンドを、ネットワークインタフェース104に転送する(S153)。例えば、定期的に各コアがロックを取り合って、ホスト受信キューの更新がないかを見て、更新がある場合は転送処理をしてもよいし、ホスト受信キューの更新確認と転送を専用に行うコアを持ってもよいし、複数ホスト受信キューを作り、自分の担当の受信キューに更新があった場合は転送処理をするとしてもよい。
【0133】
ホストキュー制御304は、ホストからのホストコマンドを内部受信キュー372に積み込む(S154)。例えば、新しいセッションであれば、ラウンドロビンで積み込み先の内部受信キュー372を選択してもよいし、ホストコマンドの中を確認して、どの内部受信キュー372に積み込むかを判定してもよいし、複数ホスト受信キューがある場合は、対応した内部受信キュー372に積み込んでもよい。
【0134】
ホストコマンドの内部受信キュー372への積み込みに応答して、ホストキュー制御304は、内部受信キュー372のTailを更新し(S155)、さらに、ホスト受信キュー402のHeadを更新する(S156)。ホスト受信キュー402のHeadの更新方法は、ホスト受信キュー402のTailの更新について説明した通りである。
【0135】
コマンド処理305は、内部受信キュー372よりホストコマンドを取得して、処理を実行する(S157)。バッファを使用したデータ転送が必要な場合(S158:YES)、バッファ制御ステップS159が実行される。バッファ制御ステップS159の詳細は後述する。データ転送は、例えばホストからネットワークへのデータ転送又はホストからネットワークへのデータ転送である。
【0136】
バッファ確保に失敗した場合(S160:NO)、フローはステップS157に戻る。バッファ確保できた場合(S160:YES)、コマンド処理305は、DMA制御307によりDMAコントローラ205を使用して、データをバッファに転送する(S123)。データ転送に応答して、ホストキュー制御304は、内部受信キュー372のHeadを更新する(S163)。
【0137】
ステップS158に戻って、バッファを使用したデータ転送が不要な場合(S119:NO)、コマンド処理305は、データ転送の有無を判定する(S161)。バッファを使用しないデータ転送が必要である場合(S161:YES)、DMAコントローラ205は、バッファを介することなく、ネットワークコントローラ203とホストとの間でデータを転送する(S123)。バッファを使用しないデータ転送が不要である場合(S61:NO)、ホストキュー制御304は、内部受信キュー372のHeadを更新する(S163)。
【0138】
次に、コマンド処理305は、ネットワークに対して通信パケットを送信する必要があるか判定する(S164)。不要である場合(S164:NO)、フローはステップS166に進む。必要である場合(S164:YES)、コマンド処理305は、プロトコル処理303に依頼し、プロトコル処理303はプロトコル処理を実行して通信パケットを生成し、ネットワークコントローラ203が通信パケットをネットワークに送信する(S165)。
【0139】
次に、コマンド処理305は、ホストからのホストコマンドの処理結果を、ホストに通知するためのホストコマンドを生成する(S166)。処理結果の通知は、例えば、ネットワークに通信パケットを送信したことをホストに通知する。さらに、コマンド処理305は、生成したホストコマンドを、ネットワークインタフェース104内の内部送信キュー371に積み込む(S167)。ホストコマンドの積み込みに応答して、コマンド処理305は、内部送信キュー371のTailを更新する(S168)。
【0140】
内部送信キュー371のTail更新を受けて、ホストキュー制御304は、担当するコアの内部送信キュー371のTail更新を受けて、内部送信キュー371のホストコマンドを、DMA制御307を介してDMAコントローラ205を使用して、ホスト送信キューに転送する。(S169)。ホストデータの転送に応じて、ホストキュー制御304は、ホスト送信キュー401のTailを更新する(S170)。ホスト送信キュー401のTailやHeadの情報は、ネットワークインタフェース104とホストが同一情報を参照してもよく、それぞれが保持する情報を転送してもよい。さらに、ホストキュー制御304は、内部送信キューのHeadを更新する(S171)。
【0141】
ホストは、ホスト送信キュー401からホストコマンドを取得し、ホスト送信キューのHeadを更新する(S172)。
【0142】
以下において、
図10及び
図11におけるバッファ制御ステップS120、S159を含む、バッファ制御処理の詳細を説明する。
図12は、バッファ制御処理例のフローチャートを示す。まず、バッファ制御306は、例えばコマンド処理305から、バッファ確保要求を取得する(S201)。
【0143】
バッファ制御306は、バッファリスト判定ステップを実行する(S202)。バッファリスト判定ステップは、異なるサイズのバッファ群において、いずれのバッファ群を使用するか決定する。バッファリスト判定ステップの詳細は後述する。
【0144】
さらに、バッファ制御306は、選択したバッファ群のバッファリスト及びバッファ管理テーブル770を参照し、最大アクティブ数判定ステップを実行する(S203)。最大アクティブ数判定ステップの詳細は後述する。最大アクティブ数判定ステップは、今回のバッファ制御の実行又は待機を判定する。最大アクティブ数判定ステップS203において、バッファ制御を実行すると判定されると、フローは、ステップS204に進む。
【0145】
バッファ制御306は、バッファリスト判定ステップS202で決定されたバッファリストを参照し(S204)、当該バッファリストのバッファエントリヘッドアドレス751を取得する(S205)。バッファ制御306は、取得したバッファエントリヘッドアドレスにアクセスして、バッファエントリ703を取得する(S206)。
【0146】
バッファ制御306は、取得したバッファエントリ703から、ネクストバッファエントリアドレス763を取得し(S207)、さらに、バッファアドレス762を取得する(S208)。
【0147】
次に、バッファ制御306は、ネクストバッファエントリアドレス763を、バッファリスト管理情報750の、バッファエントリヘッドアドレス751に反映する(S209)。バッファ制御306は、使用したバッファリスト及びバッファエントリを、データ転送に関連するタスク情報として保持する(S210)。1又は複数のバッファリストそれぞれの1又は複数のエントリが、実行中(完了前)のタスクの情報として保持され得る。バッファ制御306は、バッファリスト管理情報750のバッファアクティブ数752をインクリメントする(S211)。
【0148】
バッファを使用したデータ転送が実行され(S212)、データ転送が完了すると(S213)、バッファ制御306は、ステップ210で保持されたデータ転送に関連するタスク情報より、データ転送が対応するバッファリスト及びバッファエントリを特定する。バッファ制御306は、そのバッファリストのバッファエントリヘッドアドレス751を取得する(S215)。
【0149】
バッファ制御306は、タスク情報から特定したバッファエントリのネクストバッファエントリアドレス763に、取得したバッファエントリヘッドアドレス751を反映する(S216)。バッファ制御306は、バッファエントリヘッドアドレス751に、タスク情報から特定したバッファエントリのアドレス761を設定する(S217)。最後に、バッファ制御306は、バッファリストのバッファアクティブ数752をデクリメントする。
【0150】
上記操作によると、直前にデータ転送が完了したバッファエントリが、バッファリストの先頭に戻る。次のデータ転送は、バッファリストの先頭バッファエントリから使用する。キャッシュ領域は、関連付けられているバッファ領域のデータを格納する。そのため、同じバッファを使いまわすことになり、そのバッファのデータがキャッシュされていた場合、キャッシュヒットする。これにより、メモリアクセス回数を減らすことができる。なお、解放されたバッファは、バッファリストに先頭と異なる位置に戻されてもよい。例えば、予め設定されている順より前に戻される。上記例においては先頭が予め設定されている順である。
【0151】
次に、バッファリスト判定ステップS202の処理を説明する。
図13は、バッファリスト判定処理例のフローチャートを示す。本例において、X、Y及びZの3種類の異なるサイズのバッファが、対応するバッファリストによって管理されているとする。大小関係は、次の通りとする、X<Y<Z。例えば、X=8KB、Y=32KB、Z=256KBであってもよい。なお、バッファサイズの種類数は任意であり、それぞれのサイズも任意である。
【0152】
バッファ制御306は、ホストコマンドから、転送するデータサイズを取得する(S251)。データサイズがX以下である場合(S252:YES)、バッファ制御306は、サイズXのバッファリストを選択する(S253)。データサイズがXより大きくY以下である場合(S252:NO、S254:YES)、バッファ制御306は、サイズYのバッファリストを選択する(S255)。
【0153】
データサイズがYより大きくZ以下である場合(S254:NO、S256:YES)、バッファ制御306は、サイズZのバッファリストを選択する(S253)。データサイズがZより大きい場合(S256:NO)、バッファ制御306は、Zより大きいロングサイズのバッファをメモリ208において確保する(S258)。
【0154】
上述のように、小さいサイズのバッファリストから順次判定することで、転送データサイズ以上のバッファサイズの内の最小バッファサイズのバッファが、転送データを格納するために選択される。これにより、効率的にバッファ領域を使用することができる。ロングサイズデータのバッファ領域をその場で確保するのは、長いデータサイズだとDMA205によるデータ転送時間が長くなり、データ転送中のプロセッサ負荷が低いため、その都度確保してもプロセッサ負荷が低いからである。また、ロングサイズのデータは、キャッシュから容易にあふれてメモリアクセスが発生するため、リスト管理しなくてもよいからである。
【0155】
次に、バッファリスト判定ステップS202と異なる方法でバッファリスト判定を行う例を説明する。
図12及び13を参照して説明した例は、転送データを一つのバッファ内に格納する。以下に説明する例は、大きい転送データを複数のバッファに分散して格納する。これにより、バッファリストで管理されているバッファサイズより大きい転送データを、バッファリストで管理しているバッファに格納できる。
【0156】
図14は、バッファ制御処理例のフローチャートである。
図12示すフローチャートからの相違を主に説明する。バッファ制御306は、バッファリスト判定ステップS271を実行する。バッファリスト判定ステップS271は、
図12のバッファリスト判定ステップS202と異なる。バッファ制御306は、ステップS211の後、ステップS273を実行し、ステップS218の後ステップS275を実行する。
【0157】
まず、バッファリスト判定ステップS271を説明する。
図15は、バッファリスト判定ステップS271における処理例のフローチャートを示す。バッファ制御306は、ホストコマンドから、転送するデータの残りデータサイズを取得する(S301)。残りデータサイズがX以下である場合(S302:YES)、バッファ制御306は、サイズXのバッファリストを選択し、さらに、残りデータサイズをXだけ削減する(S303)。
【0158】
残りデータサイズがXより大きくY以下である場合(S302:NO、S304:YES)、バッファ制御306は、サイズYのバッファリストを選択し、さらに、残りデータサイズをYだけ削減する(S305)。残りデータサイズがYより大きくZ以下である場合(S304:NO、S306:YES)、バッファ制御306は、サイズZのバッファリストを選択し、残りデータサイズをZだけ削減する(S307)。
【0159】
残りデータサイズがZより大きい場合(S306:NO)、又は、上記ステップS303、S306又はS307のいずれかが実行された後、バッファ制御306は、残りデータサイズが存在するか判定する(S308)。割り当てたバッファの総サイズが転送データサイズ以上である場合、残りデータサイズは0である。残りデータサイズが存在する場合(S308:YES)、フローはステップS302に戻る。残りデータサイズが存在しない場合(S308:NO)、当該バッファリスト判定処理は終了する。
【0160】
図15を参照して説明したように、大きいサイズの転送データは複数の部分データに分割され、それぞれに対応するサイズのバッファが割り当てられる。
図14に戻って、バッファ制御306は、ステップS204からS211を各部分データについて実行する。ステップS273は、全ての部分データについてステップS204からS211が実行されているか判定する。また、データ転送完了後、バッファ制御306は、ステップS215からS218を各部分データについて実行する。ステップS275は、全ての部分データについてステップS215からS218が実行されているか判定する。
【0161】
以下において、
図12及び14の最大アクティブ数判定ステップS203の処理を説明する。
図16は、最大アクティブ数判定処理例のフローチャートを示す。以下において、各コア241に対して、個別のキャッシュ閾値と個別のバッファリスト群が割り当てられているとする。
【0162】
バッファ制御306は、バッファリスト判定結果を取得する(S401)。次に、バッファ制御306は、各バッファリストのバッファリスト管理情報750から、バッファアクティブ数752を取得する(S402)。
【0163】
バッファ制御306は、バッファリスト判定結果が示す各使用予定バッファリストについて、バッファアクティブ数752と使用予定バッファ数の総数(予定アクティブバッファ数)を計算し、その総数と最大アクティブ数774とを比較する(S403)。いずれかのバッファリストの予定アクティブバッファ数が最大アクティブ数774を超えている場合(S403:YES)、バッファ制御306は処理を中断して所定時間だけ待機すると判定する(S404)。この後、フローはバッファリスト判定ステップS202、S271に戻る。
【0164】
各バッファリストの予定アクティブバッファ数が対応する最大アクティブ数774以下である場合(S403:NO)、バッファ制御306は、今回使用予定バッファ量を含めてアクティブなバッファの総量を計算する(S405)。具体的には、バッファ制御306は、当該コアに割り当てられているバッファリストのサイズとバッファアクティブ数の積和((Xサイズ×Xアクティブ数)+(Yサイズ×Yアクティブ数)+(Zサイズ×Zアクティブ数))を計算する。バッファ制御306は、この積和に、今回使用予定のバッファ量を加算する。
【0165】
次に、バッファ制御306は、アクティブなバッファ総量と当該コアに割り当てられているキャッシュ閾値とを比較する(S406)。キャッシュ閾値は、当該コアに割り当てられているキャッシュ容量以下に値である。アクティブなバッファ総量がキャッシュ閾値以下である場合(S406:NO)、本最大アクティブ数判定処理は終了する。アクティブなバッファ総量がキャッシュ閾値より大きい場合(S406:YES)、バッファ制御306は処理を中断して待機すると判定する(S404)。この後、所定時間をおいて、バッファ制御処理が再度開始される。
【0166】
上述のように、ネットワークインタフェース104は、キャッシュ容量とアクティブなバッファ使用量の合計の差から、起動できるコマンド処理をコントロールする。キャッシュをなるべく溢れないように、同時に処理するデータ転送数を制限し、バッファ使用数を制限する。これにより、キャッシュヒットしてメモリアクセスを減らすことでメモリ帯域圧迫による性能低下を防ぐことができる。
【0167】
上記例において、コアそれぞれに、バッファリスト群及びキャッシュ閾値が個別に割り当てられている。各コアに対して個別のキャッシュ領域が割り当てられてもよく、一つのキャッシュ領域が複数のコアによって共有されている、つまり複数のコアによって使用されてもよい。
【0168】
他の例において、キャッシュ領域及び全てのバッファリストが全てのコアに共有され、さらに、キャッシュ閾値が共有されているキャッシュ領域に対して定義されている、つまり、キャッシュ閾値がコアによって共有されていてもよい。この構成例において、各コアは、
図16を参照して説明したように最大アクティブ数判定処理を実行してよい。
【0169】
他の例において、キャッシュ領域が全てのコアに共有され、キャッシュ閾値が共有されているキャッシュ領域に対して定義され、バッファリスト群がコア毎に割り当てられていてもよい。この構成例において、各コアは、自コアに割り当てられているバッファリスト群に加えて、他のコアに割り当てられているバッファリスト群の情報を参照して、アクティブなバッファ総量を計算する。
【0170】
他の構成例において、キャッシュ閾値が各コアに個別に設定され、バッファリスト群がコアによって共有されていてもよい。各コアは、タスク情報として使用しているバッファの情報を保持し、使用しているバッファ総量と個別のキャッシュ閾値とを比較してよい。
【0171】
他の構成例において、コアが複数のグループにグループ化され、各グループに対してキャッシュ領域が割り当てられていてもよい。例えば、キャッシュ閾値及びバッファリスト群は、グループ毎に割り当てられる。各コアは、同一グループのバッファリスト群及びキャッシュ閾値を使用して、
図16を参照して説明したように最大アクティブ数判定処理を実行してよい。
【0172】
図16を参照して説明した例は、バッファリスト毎に設定された最大アクティブ数に基づいてバッファ確保の許否を判定している(S403)。他の例において、このステップS403は省略され、キャッシュ使用量のみに基づいてバッファ確保の許否を判定してもよい。
【0173】
上述のように、コアは複数のグループに分割され、グループに対してそれぞれ異なるキャッシュ領域が割り当てられていてもよい。この構成において、ネットワークインタフェース104は、複数のネットワークポート間の性能バランシングを実行してもよい。これにより、ネットワークインタフェース104の性能を向上できる。
【0174】
例えば、8つのコア0~コア7が存在し、二つのコアが各グループを構成するとする。ここでは、コア0及びコア1が1グループを構成し、コア2及びコア3が1グループを構成し、コア4及びコア5が1グループを構成し、コア6及びコア7が1グループを構成するとする。各グループに対してキャッシュ領域及びバッファリスト群が割り当てられているとする。ネットワークインタフェース104は、二つのポート0、ポート1を有するとする。
【0175】
ネットワークインタフェース104は、各グループのコアを異なるポートに割り当てる。例えば、コア0、コア2、コア4、コア6がポート0に割り当てられ、コア1、コア3、コア5、コア7がポート1に割り当てられる。例えば、各グループにおいて、コアそれぞれにキャッシュ容量の半分のキャッシュ閾値が割り当てられる。これにより、ポート0及びポート1それぞれが使用するキャッシュ量を均等化して性能をバランシングできる。なお、各具グループにおけるコアのキャッシュ閾値は同一でなくてもよい。
【0176】
または、ネットワークインタフェース104は、グループのコアを同一のポートに割り当ててもよい。例えば、コア0、コア1、コア2、コア3がポート0に割り当てられ、コア4、コア5、コア6、コア7がポート1に割り当てられる。各グループにおいて、ポートそれぞれにキャッシュ閾値が設定されてもよく、キャッシュ領域に対して設定されたキャッ閾値が二つのコア双方に使用されてもよい。
【0177】
以下において、最大アクティブ数判定処理の他の例を説明する。
図17は、他の最大アクティブ数判定処理例のフローチャートを示す。以下において、
図16に示す処理例との相違を主に説明する。本最大アクティブ数判定処理例は、
図13を参照して説明したバッファリスト判定処理と共に実行される。本処理例は、新規バッファ領域が確保された場合(
図13におけるステップS258)、キャッシュ残量について判定を行うことなくデータ転送を行う。転送データサイズが大きい場合、キャッシュからあふれる可能性が高い。本例は、最大アクティブ数判定処理を効率化できる。
【0178】
図17を参照して、バッファ制御306は、バッファリスト判定結果を取得した(S401)後、新規バッファ領域が確保されているか判定する(S411)。確保されていない場合(S411:NO)、バッファ制御306は、ステップS402以降を実行する。これらステップは
図16を参照して説明した通りである。新規バッファ領域が確保されている場合(S411:YES)、最大アクティブ数判定処理は完了する。
【0179】
図18は、他の最大アクティブ数判定処理例のフローチャートを示す。以下において、
図16に示す処理例との相違を主に説明する。本例は、最大バッファサイズを超えたデータ転送要求の時、キャッシュ残量について判定を行うことなくデータ転送を行う。これにより処理が効率化される。
【0180】
図18を参照して、バッファ制御306は、バッファリスト判定結果を取得した(S401)後、転送データサイズが最大バッファサイズを超えているか判定する(S421)。超えていない場合(S421:YES)、バッファ制御306は、ステップS402以降を実行する。これらステップは
図16を参照して説明した通りである。転送データサイズが最大バッファサイズを超えている場合(S421:NO)、最大アクティブ数判定処理は完了する。
【0181】
なお、本発明は上記した実施形態に限定されるものではなく、様々な変形例が含まれる。例えば、上記した実施形態は本発明を分かりやすく説明するために詳細に説明したものであり、必ずしも説明したすべての構成を備えるものに限定されるものではない。また、ある実施形態の構成の一部を他の実施形態の構成に置き換えることが可能であり、また、ある実施形態の構成に他の実施形態の構成を加えることも可能である。また、各実施形態の構成の一部について、他の構成の追加・削除・置換をすることが可能である。
【0182】
また、上記の各構成・機能・処理部等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、上記の各構成、機能等は、プロセッサがそれぞれの機能を実現するプログラムを解釈し、実行することによりソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリや、ハードディスク、SSD(Solid State Drive)等の記録装置、または、ICカード、SDカード等の記録媒体に置くことができる。
【0183】
また、制御線や情報線は説明上必要と考えられるものを示しており、製品上必ずしもすべての制御線や情報線を示しているとは限らない。実際には殆どすべての構成が相互に接続されていると考えてもよい。
【符号の説明】
【0184】
100 サーバシステム、101 ストレージ装置、102 ストレージコントローラ、104 ネットワークインタフェース、201 ホストバス、200 ネットワークパス、202 データプロセッシングユニット、208 メモリ、208 メモリコントローラ、203 ネットワークコントローラ、204 プロセッサ、205 DMAコントローラ、206 キャッシュ、241 プロセッサコア、301 ネットワークコントローラドライバ、303 プロトコル処理、305 コマンド処理、307 DMA制御、304 ホストキュー制御、306 バッファ制御、307 DMA制御、371 内部送信キュー、372 内部受信キュー、401 ホスト送信キュー、402 ホスト受信キュー、400 ホスト、450 リモートサイト、700-702 バッファリスト、703 バッファエントリ、750 バッファリスト管理情報、770 バッファ管理テーブル