(57)【特許請求の範囲】
【請求項１】
データ・ストレージとデータ処理システムにおける書き込みキャッシュデータの転送方法であって、
第一のＩ／Ｏノードにおいて、書き込みデータを含む書き込み要求を計算ノードから受領するステップと、
書き込みデータを第一のＩ／Ｏノードから第二のＩ／Ｏノードに転送するステップと、
確認メッセージを第二のＩ／Ｏノードから計算ノードに送信するステップと、を含み、
確認メッセージを第二のＩ／Ｏノードから計算ノードに送信する場合には、確認メッセージを第一のＩ／Ｏノードから計算ノードに送信しないことを特徴とするキャッシュデータの転送方法。
【請求項２】
更に、排除要求を第一のＩ／Ｏノードから第二のＩ／Ｏノードに送信するステップを含むことを特徴とする、請求項１記載のキャッシュデータの転送方法。
【請求項３】
前記排除要求が、第一のＩ／Ｏノードの不揮発性ストレージに書き込みデータが保存された時に送信される、ことを特徴とする請求項２記載の方法。
【請求項４】
前記排除要求が、第一のＩ／Ｏノードが第一の書き込み要求に続く第二の書き込み要求を受領した後で送信される、ことを特徴とする請求項２記載のキャッシュデータの転送方法。
【請求項５】
前記第二の書き込み要求が第二の書き込みデータを含み、
更に、第二の書き込みデータと排除要求を単一のデータ割り込みによって第二のＩ／Ｏノードに送信するステップを含む、
ことを特徴とする請求項４記載のキャッシュデータの転送方法。
【請求項６】
前記計算ノードと第一のＩ／Ｏノード及び第二のＩ／Ｏノードが、インターコネクト・ファブリックを介して通信上で結合されている、ことを特徴とする請求項１記載のキャッシュデータの転送方法。
【請求項７】
前記計算ノードが第一のＩ／Ｏノード及び第二のＩ／Ｏノードにインターコネクト・ファブリックを介して結合されており、
前記インターコネクト・ファブリックが、前記計算ノードとＩ／Ｏノードを複数のネットワーク入力ポート及び複数のネットワーク出力ポートを介して接続するネットワークであって、ｂをスイッチノードの入出力ポートの合計数、Ｎをネットワーク入出力ポートの合計数、ｇ（ｘ）を引数ｘより大きな最小の整数を得るための切り上げ関数としたとき、ｇ（ｌｏｇｂＮ）以上のスイッチノードステージに配列された複数のスイッチノードで構成されるネットワークにおいて、スイッチノードステージがこれによって任意のネットワーク入力ポートとネットワーク出力ポート間に複数のパスを提供し、スイッチノードステージがネットワークの最高スイッチノードステージに複数の跳ね返り点を提供する、ネットワークを備えたことを特徴とする、請求項１記載のキャッシュデータの転送方法。
【請求項８】
データ・ストレージとデータ処理システムにおける書き込みキャッシュデータの転送装置であって、
第一のＩ／Ｏノードにおいて、書き込みデータを含む書き込み要求を計算ノードから受領する手段と、
書き込みデータを第一のＩ／Ｏノードから第二のＩ／Ｏノードに転送する手段と、
確認メッセージを第二のＩ／Ｏノードから計算ノードに送信する手段と、
を備え、
確認メッセージを第二のＩ／Ｏノードから計算ノードに送信する場合には、確認メッセージを第一のＩ／Ｏノードから計算ノードに送信しないことを特徴とするキャッシュデータの転送装置。
【請求項９】
更に、排除要求を第一のＩ／Ｏノードから第二のＩ／Ｏノードに送信する手段を備えた、ことを特徴とする請求項８記載のキャッシュデータの転送装置。
【請求項１０】
更に、第一のＩ／Ｏノードの不揮発性ストレージで書き込みデータを保存する時期を判断する手段と、
不揮発性ストレージに書き込みデータが保存されたときに排除要求を送信する手段と、
を備えたことを特徴とする請求項９記載のキャッシュデータの転送装置。
【請求項１１】
更に、第二の書き込み要求を受領する時期を判断する手段と、
第二の書き込み要求と一緒に第二のＩ／Ｏノードへ排除要求を送信する手段と、を備えたことを特徴とする請求項９記載のキャッシュデータの転送装置。
【請求項１２】
前記計算ノードと第一のＩ／Ｏノード及び第二のＩ／Ｏノードが、インターコネクト・ファブリックを介して通信上で結合されている、ことを特徴とする請求項８記載のキャッシュデータの転送装置。
【請求項１３】
前記計算ノードと第一のＩ／Ｏノード及び第二のＩ／Ｏノードが、インターコネクト・ファブリックを介して結合されており、
前記インターコネクト・ファブリックが、前記計算ノードとＩ／Ｏノードを複数のネットワーク入力ポート及び複数のネットワーク出力ポートを介して接続するネットワークであって、ｂをスイッチノードの入出力ポートの合計数、Ｎをネットワーク入出力ポートの合計数、ｇ（ｘ）を引数ｘより大きな最小の整数を得るための切り上げ関数としたとき、ｇ（ｌｏｇｂＮ）以上のスイッチノードステージに配列された複数のスイッチノードで構成されるネットワークにおいて、スイッチノードステージがこれによって任意のネットワーク入力ポートとネットワーク出力ポート間に複数のパスを提供し、スイッチノードステージがネットワークの最高スイッチノードステージに複数の跳ね返り点を提供する、ネットワークを備えたことを特徴とする、請求項８記載のキャッシュデータの転送装置。
【請求項１４】
コンピュータによる読み出しが可能で、請求項１乃至７の何れかに記載のキャッシュデータの転送方法を遂行するためのプログラムを格納するプログラム・ストレージ・デバイス。
【発明の詳細な説明】
【０００１】
【発明が属する技術分野】
本発明は、一般に計算システムに関し、特にデータ・ストレージとデータ処理システムにおける書き込みキャッシュデータの転送方法及び装置に関する。これは、プロセッサやメモリキャビネットの境界に関係なく、運用上において、仮想ストレージ割り当ての単一の視点を提供する。
【０００２】
【従来の技術】
テクノロジの進化は、無関係に見える一連の技術開発の成果であることが多い。こうした無関係の開発はそれぞれ意義深いものかもしれないが、これらが結合することで、大きなテクノロジの進化の基盤を形成することができる。歴史的に見て、大きく複雑なコンピュータシステムの構成要素では、不均一な技術的成長がなされてきた。これには例えば、（１）ディスクＩ／Ｏ性能に比較して急速なＣＰＵ性能の進歩、（２）進化する内部ＣＰＵアーキテクチャ、（３）インターコネクト・ファブリックが含まれる。
【０００３】
過去１０年間に渡り、ディスクＩ／Ｏ性能が向上する割合は、ノードのそれに比べ、かなり遅かった。ＣＰＵ性能は１年に４０％〜１００％の割合で増加してきたが、ディスクのシークタイムが改善される割合は１年にわずか７％だった。
この傾向が予測通りに継続すれば、代表的なサーバノードが動かすことのできるディスクドライブの数は、ほとんどの大規模システムの量と価値の両方において、ディスクドライブが最も影響の大きな構成要素となるほどに上昇する。この現象はすでに既存の大規模システムの導入において現実のものになっている。
【０００４】
不均一な性能の向上はＣＰＵの中でも発生している。ＣＰＵ性能を改善するために、ＣＰＵベンダはクロック速度の増加とアーキテクチャの変更を組み合わせて利用している。こうしたアーキテクチャ変更の多くは、並行処理コミュニティの影響による証明されたテクノロジである。こうした変更はアンバランスな性能を生み出し、期待されるほどの性能の向上につながらない可能性もある。単純な例としては、ＣＰＵが割込みを処理できる割合は、基本命令のそれと同じ速度で向上してはいない。したがって、割込み性能に依存するシステム機能（Ｉ／Ｏなど）は計算能力と一緒に向上してはいない。
【０００５】
インターコネクト・ファブリックも不均一なテクノロジ成長の特徴を示している。これは長年に渡り、１０〜２０ＭＢ／秒ほどの性能レベルにあったが、過去１年間に、帯域幅において１００ＭＢ／秒（以上）レベルの大きな飛躍も起こっている。
【０００６】
この大きな性能の向上により、大規模並行処理システムの経済的な配置が可能になった。
【０００７】
この不均一な性能はアプリケーション・アーキテクチャ及びシステム構成のオプションに悪い影響を与える。例えば、アプリケーション性能に関して言えば、ＣＰＵ性能の増加といった、システムのいくつかの部分における性能改善を利用するために仕事量を増やす試みは、ディスク・サブシステムにおいて同等の性能改善がなされていないために阻害されることが多い。ＣＰＵが１秒間に行うデータ処理の数を２倍にできたとしても、ディスク・サブシステムはその増加分の一部しか扱うことができない。不均一なハードウェア性能の成長による全体的な影響は、アプリケーション性能が特定の仕事の特徴に依存する度合いが高まっていることにある。
【０００８】
プラットフォーム・ハードウェア・テクノロジの不均一な成長は別の深刻な問題も生み出している。マルチノードシステムの構成に利用できるオプションの数の減少である。この良い例は、ストレージ・インターコネクト・テクノロジの変化によってＴＥＲＡＤＡＴＥ４ノード・クリークのソフトウェア・アーキテクチャが受けた影響である。ＴＥＲＡＤＡＴＥのクリークモデルでは、シングル・クリークのノード間での均一なストレージ接続を期待していた。この場合、すべてのノードから各ディスクドライブにアクセスすることが可能である。したがって、一つのノードが止まった場合、そのノード用のストレージは残りのノードが分割できる。ストレージ及びノードテクノロジの不均一な成長により、ストレージ共有環境において、一つのノードに接続できるディスクの数は制限されている。
この制限は、一つのＩ／Ｏチャンネルに接続できるドライブの数及び４ノード共有Ｉ／Ｏトポロジにおいて接続可能なバスの物理的な数によって生じている。ノード性能の改善が続くにつれ、私たちは性能向上を実現するために、一つのノードに接続するディスクスピンドルの数を増加させなくてはいけない。
【０００９】
クラスタ及び大規模並行処理（ＭＰＰ）の設計は、上述の問題の解決を試みたマルチノードシステム設計の例である。クラスタは限られた拡張性が欠点であり、ＭＰＰシステムには、十分にシンプルなアプリケーションモデルを提供するための追加ソフトウェアが必要である（市販のＭＰＰシステムでは、このソフトウェアは通常ＤＢＭＳ）。ＭＰＰシステムでは、非常に高い可用性を提供するために、内部クラスタリングの形式（クリーク）も必要になる。どちらのソリューションにおいても、いまだにディスクドライブの多数化の可能性を管理する上で課題が生じている。こうしたディスクドライブは、電気機械装置であり、十分に予測可能なほどの故障率を有している。ＭＰＰシステムでは、通常ノード数が大きいため、ノードのインターコネクトの問題はより悪化することになる。また、どちらのアプローチにおいても、ディスク接続性の課題が生じており、これも非常に大きなデータベースを保存するのに必要なドライブの数の多さが原因となっている。
【００１０】
上述の問題は、ストレージ装置と計算装置が、高性能の接続ファブリックで計算を行い、アーキテクチャ上の同等の存在として働くアーキテクチャでは改善される。このアーキテクチャでは、ストレージ及び計算リソースの管理における柔軟性を増加させることができる。しかし、この柔軟性により、いくつかの独特な問題が現れる。こうした問題の一つは、このアーキテクチャが提供する速度と柔軟性を維持しながら、安全なデータ・ストレージを確保することである。
【００１１】
従来のアーキテクチャでは、書き込みキャッシュのテクニックにより効率的なデータ・ストレージが可能となる。ＣＰＵによって通常はディスクに書き込まれるデータは、まず書き込みキャッシュに書き込まれる。そして、このデータはＣＰＵのアイドル・サイクル中にディスクに書き込まれる。書き込みキャッシュへの書き込みはディスクやＲＡＭへの書き込みよりも速いため、このテクニックによって性能が向上する。
【００１２】
ディスクのために書き込みキャッシュを使用するのには一定のリスクも伴う。
ディスクメディアに書き込まれる前に、データがディスク装置の揮発性メモリに長い時間とどまることになるからである。これに要する時間は、普通は長くとも数秒だが、データが不揮発性のストレージに書き込まれる前にクラッシュやシステム不良が起これば、そのデータは失われる可能性がある。
【００１３】
書き込みキャッシュは高度な分散アーキテクチャでも使用することができる。
しかし、こうしたアーキテクチャに書き込みキャッシュ・プロトコルを導入した場合、計算ノードとストレージ・メディアの間で通信及び処理に関する大量のオーバーヘッドが必要になり、システムの速度と効率が減少してしまう。
【００１４】
【発明が解決しようとする課題】
本発明の目的は、分散アーキテクチャにおける効率的なデータ書き込みキャッシュのプロトコルを提供して、上述の欠点を改善することである。
【００１５】
【課題を解決するための手段】
第一の観点によれば、本発明は、データ・ストレージとデータ処理システムにおける書き込みキャッシュデータの転送方法であって、第一のＩ／Ｏノードにおいて、書き込みデータを含む書き込み要求を計算ノードから受領するステップと、書き込みデータを第一のＩ／Ｏノードから第二のＩ／Ｏノードに転送するステップと、確認メッセージを第二のＩ／Ｏノードから計算ノードに送信するステップと、を含み、確認メッセージを第二のＩ／Ｏノードから計算ノードに送信する場合には、確認メッセージを第一のＩ／Ｏノードから計算ノードに送信しないことを特徴とするキャッシュデータの転送方法を提供するものである。
【００１６】
データが第一のＩ／Ｏノードの不揮発性ストレージに書き込まれた後、第二のＩ／Ｏノードの揮発性メモリから書き込みデータを排除するために、第二のＩ／Ｏノードに排除要求又はコマンドが送られる。実施形態によっては、排除要求は第一のＩ／Ｏノードが第二の書き込み要求を受け取るまで送られず、この場合、排除要求は第二の書き込み要求の書き込みデータと同じ割込みの中で送られる。
このデータ処理システムは第一の及び第二のＩ／Ｏノードで構成され、各ノードは計算ノードからの書き込み要求を受領し、別のＩ／Ｏノードへ書き込みノードを転送するための手段を有している。また、各Ｉ／Ｏノードには、書き込みデータを送ったＩ／Ｏノードを介して確認メッセージを送信するのではなく、計算ノードに直接確認メッセージを送る手段も有している。この成果が、データ保存に要する割込み回数を減らしながら、書き込みキャッシュを導入してストレージ速度及びターンアラウンドを改善するＩ／Ｏプロトコルである。
【００１７】
第二の観点によれば、本発明は、データ・ストレージとデータ処理システムにおける書き込みキャッシュデータの転送装置であって、第一のＩ／Ｏノードにおいて、書き込みデータを含む書き込み要求を計算ノードから受領する手段と、書き込みデータを第一のＩ／Ｏノードから第二のＩ／Ｏノードに転送する手段と、確認メッセージを第二のＩ／Ｏノードから計算ノードに送信する手段と、を備え、確認メッセージを第二のＩ／Ｏノードから計算ノードに送信する場合には、確認メッセージを第一のＩ／Ｏノードから計算ノードに送信しないことを特徴とするキャッシュデータの転送装置を提供するものである。
【００１８】
更に、別の観点によれば、本発明は、コンピュータによる読み出しが可能で、上記したキャッシュデータの転送を遂行するために、コンピュータにより実行可能な一つ以上の命令プログラムを確実に具現するプログラム・ストレージ・デバイスを提供するものである。
【００１９】
【発明の実施の形態】
以下、本発明の一実施形態について、添付図面を利用して例示的に説明する。
【００２０】
Ａ．  概要
図１は、本発明の同列間データ処理アーキテクチャの概観である。このアーキテクチャ１００は１つ以上の計算リソース１０２及び一つ以上のストレージリソース１０４で構成され、ストレージリソース１０４は１つ以上のインターコネクト・ファブリック１０６及び通信パス１０８を介して計算リソース１０２と通信上で対になっている。ファブリック１０６はすべてのノードとストレージに通信媒体を与えているため、計算リソース１０２とストレージ・リソース１０４間の均一な同列アクセスを可能にしている。
【００２１】
図１のアーキテクチャでは、ストレージは最新のノード中心アーキテクチャ内にあるため、単一のノードセットに限定されてはおらず、各ノードがすべてのストレージと通信することができる。これは、物理システムトポロジがストレージとノードの通信を制限し、仕事量に応じて異なるトポロジが必要になることの多い、今日のマルチノード・システムとは対照的である。図１のアーキテクチャでは、広範囲のシステム・トポロジをサポートする単一の物理アーキテクチャを提供しているため、アプリケーション・ソフトウェアの通信パターンは、あらゆる時期においてシステムのトポロジを決定し、不均一なテクノロジの成長を受け入れることが可能である。ファブリック１０６が与える分離によって、各主要システム・コンポーネントのための詳細なスケーリングが可能である。
【００２２】
図２は、本発明の同列アーキテクチャの詳細な説明を表している。計算リソースは、１つ以上の計算ノード２００で定義され、それぞれがＯＳ２０２の管理下にある１つ以上のアプリケーション２０４を実行する１つ以上のプロセッサ２１６を有している。テープドライブ、プリンタその他のネットワークといった周辺機器２０８は計算ノード２００と運用上で対になっている。さらに、ＯＳ２０２、アプリケーション２０４その他の情報を構成する命令といった、計算ノード２００固有の情報を保存するハードディスクなどのローカルストレージ装置２１０も、計算ノード２００と運用上で対になっている。アプリケーション命令は、分散処理の形式で、１つ以上の計算ノード２００で保存や実行が行われる。実施形態では、プロセッサ２０６はＩＮＴＥＬ Ｐ６のような既製の市販多目的プロセッサと、付随するメモリやＩ／Ｏ要素で構成される。
【００２３】
ストレージ・リソース１０４は、クリーク２２６で定義され、このそれぞれには第一のＩ／Ｏノード又はＩＯＮ２１２と第二のＩ／Ｏノード又はＩＯＮ２１４が含まれ、そのそれぞれがシステム・インターコネクト２２８によってインターコネクト・ファブリック１０５と運用上で対になっている。第一のＩＯＮ２１２及び第二のＩＯＮ２１４は運用上、１つ以上のストレージディスク２２４（「一群のディスク」又はＪＢＯＤとして知られる）と対になっており、これにはＩＢＯＤエンクロージャ２２２が付随している。
【００２４】
図２は、中規模システムを表しており、ＩＯＮ２１２と計算ノードは代表的な２対１の割合になっている。本発明のクリーク２２６には、３つ以上のＩＯＮ２１４を導入したり、ストレージ・ノードの可用性が不足している場合は、単一のＩＯＮ２１２を導入することもできる。クリーク２２６内の数は、ＩＯＮ２１２内で共有されるハードウェアは無いため、純粋にソフトウェアの問題である。ペアになったＩＯＮ２１２は「ダイポール」と呼ばれることもある。
【００２５】
本発明の構成要素には、計算ノード２００、ＩＯＮ２１２、インターコネクト・ファブリック１０６を接続する管理コンポーネント又はシステム管理者２３０も含まれる。
【００２６】
ＩＯＮ２１２とＪＢＯＤ２２２の接続は、ここでは簡単な形式で示してある。
実際の接続では、図の構成にあるストレージ・ディスク２２４のそれぞれの階層（列、ここでは４列）にファイバ・チャンネル・ケーブルを使用する。実際には、各ＩＯＮ２１２が管理するストレージ・ディスクの数は、図の実施形態のように２０ではなく、４０〜８０になると思われる。
【００２７】
Ｂ．  ＩＯＮ（ストレージ・ノード）
１．  内部アーキテクチャ
ａ）  ハードウェア・アーキテクチャ
図３は、ＩＯＮ２１２の構成とＪＢＯＤ２２２とのインターフェースに関する詳細な図である。各ＩＯＮ２１２は、ＪＢＯＤインターコネクト２１６を介してＪＢＯＤ２２２アレイ内のストレージ・ディスク２２４との通信接続を行うＩ／Ｏ接続モジュール３０２、ＩＯＮ２１２の機能を実行し、本文書で説明するＩＯＮ物理ディスクドライバ５００の導入を行うＣＰＵ及びメモリ３０４、ＩＯＮ２１２の動作をサポートする電力を供給する電源モジュール３０６で構成される。
【００２８】
ｂ）  ＪＢＯＤ
図４は、ＪＢＯＤエンクロージャ２２２の詳細を示す図である。モニター又はコントロールの可能なＪＢＯＤエンクロージャ２２２のすべての構成要素はエレメント４０２〜４２４と呼ばれる。任意のＪＢＯＤエンクロージャのあらゆるエレメント４０２〜４２４は、受領診断結果コマンドを通じて、構成ページコードと共に返送される。ＩＯＮ２１２はこのエレメントの順序リストを利用して、エレメントに番号を付ける。図の第一のエレメント４０２はエレメント０、二番目のエレメント４０４はエレメント１等となる。こうしたエレメント番号は、本文書で説明する管理サービスレイヤ７０６がコンポーネントのアドレスに使用するＬＵＮ_Ｃを作成する際に使用される。
【００２９】
【表１】
0004567125.tif 000002
【００３０】
エンクロージャ内では、エレメントの位置は、上の表Ｉにあるように、ラック、シャシ、エレメントの番号で特定される。ラック番号は、ダイポールに属するラックに割り当てられたダイポール内部の番号である。シャシ位置は、キャビネット管理デバイスが報告した高さを表す。エレメント番号は、ＳＥＳ構成ページが返送したエレメント・リストのインデックスである。これらのフィールドはＬＵＮ_Ｃフォーマットを形成する。
【００３１】
ｃ）Ｉ／Ｏインターフェース・ドライバ・アーキテクチャ
図５は、ＩＯＮ２１２の「ＳＣＳＩドライバ」として働くＩＯＮ物理ディスクドライバ５００を含めた、ＩＯＮ２１２のＩ／Ｏアーキテクチャを示す図である。ＩＯＮ物理ディスクドライバ５００は、ＲＡＩＤ（安価ディスクのリダンダント・アレイ）ソフトウェアドライバやシステム管理者２３０の管理ユーティリティからのＩ／Ｏ要求の取り込みを管理し、ＪＢＯＤインターコネクト２１６のデバイス側にあるデバイスで要求を実行する。
【００３２】
本発明の物理ディスクドライバ５００には３つの主要なコンポーネントが含まれる。これは、高レベルドライバ（ＨＤＬ）５０２、デバイス固有高レベルドライバ５０４、低レベルドライバ５０６である。ＨＬＤ５０２は、共通部分５０３とデバイス固有高レベル部分５０４、及び低レベルドライバ５０６で構成される。共通及びデバイス固有高レベルドライバ５０２及び５０４は、アダプタに依存せず、新しいアダプタ・タイプのための修正は必要ない。ファイバ・チャンネル・インターフェース（ＦＣＩ）低レベルドライバ５０６は、ファイバ・チャンネル・アダプタをサポートしており、そのためアダプタ固有ではなくプロトコル固有である。
【００３３】
ＦＣＩ低レベルドライバ５０６はＳＣＳＩ要求をＦＣＰフレームにトランスレートし、ＬｏｇｉｎやＰｒｏｃｅｓｓ Ｌｏｇｉｎといったファイバ・チャンネル共通サービスを扱う。ＦＣＩ低レベルドライバ５０６が運用上で対になっているのは、ハードウェア・インターフェース・モジュール（ＨＩＭ）インターフェース５０８で、これはファイバ・チャンネル・プロトコル操作とアダプタ固有ルーチンを分離する。上述のコンポーネントの詳しい説明は以下に記述する。
【００３４】
（１）  高レベルドライバ
高レベルドライバ（ＨＬＤ）５０２は、アクセスしているデバイスのタイプに関係なく、ＩＯＮ２１２に対するすべての要求の入口点である。デバイスがオープンになると、ＨＬＤ５０２はそのデバイスにコマンドページを結びつける。こうしたベンダ固有のコマンドページは、特定のＳＣＳＩ機能に対して、どのようにＳＣＳＩコマンド記述子ブロックを形成するかを指示する。コマンドページにより、ドライバは、特定のＳＣＳＩ機能を異なる方法で扱うデバイスを、ＳＣＳＩ仕様による指定よりも容易にサポートすることができる。
【００３５】
（ａ）  共通（非デバイス固有）部分
ＨＬＤ５０２の共通部分には以下の入口点が含まれる。
【００３６】
・  ｃｓ_ｉｎｉｔ  ドライバ構造を初期化し、リソースを割り当てる。
【００３７】
・  ｃｓ_ｏｐｅｎ  デバイス使用の準備をする。
【００３８】
・  ｃｓ_ｃｌｏｓｅ  Ｉ／Ｏを完了し、サービスからデバイスを除去する。
【００３９】
・  ｃｓ_ｓｔｒａｔｅｇｙ  デバイスの読み出し／書き込みエントリをブロックする（Ｂｕｆ_ｔインターフェース）。
【００４０】
・  ｃｓ_ｉｎｔｒ  ハードウェアの割込みを支援する。
【００４１】
これらのルーチンはあらゆるデバイスのタイプで同じ機能を実行する。こうしたルーチンのほとんどでは、デバイスのタイプ（ディスク、テープ、ＷＯＲＭ、ＣＤ−ＲＯＭなど）によって示されるスイッチテーブルを利用し、デバイス固有のルーチンを呼び出して、デバイス固有の要件を取り扱う。
【００４２】
ｃｓ_ｏｐｅｎ機能はデバイスが存在しており、そこでＩ／Ｏ作業を行う準備ができていることを保証する。現行のシステムアーキテクチャとは違い、この共通部分５０３は、オペレーティング・システム（ＯＳ）の初期化中に既知デバイスの表を作成しない。代わりに、ドライバ共通部分５０３は自己構成を行う。ドライバ共通部分５０３は、デバイスが最初にオープンになる間に、そのデバイスの状態を判断する。これにより、ドライバ共通部分５０３では、ＯＳ２０２の初期化段階の後でオンラインに存在するであろうデバイスを「確認」することが可能になる。
【００４３】
最初にオープンになる間、ＳＣＳＩデバイスは、ターゲットデバイスに対するＳＣＳＩ問合わせコマンドの発行によって、コマンドページと結びつけられる。
デバイスが肯定の反応を示した場合、ＳＣＳＩ構成モジュール５１６内で、応答データ（ベンダＩＤ、製品ＩＤ、ファームウェア改訂レベルなどの情報を含む）が既知デバイスの表と比較される。一致が見つかった場合、デバイスは、その表エントリが指定するコマンドページと明確に結びつけられる。一致が見つからなかった場合、デバイスは、応答データのフォーマットに基づいて、一般的なＣＣＳ（共通コマンドセット）又はＳＣＳＩ ＩＩコマンドページに不明確に結びつけられる。ドライバ共通部分５０３には、リソースの割り当て、分散収集作業用のＤＭＡリストの作成、ＳＣＳＩ作業の完了のために、低レベルドライバ５０６が使用するルーチンとコマンドページ機能が含まれる。
【００４４】
すべてのＦＣＩ低レベルドライバ５０６ルーチンは、ドライバ共通部分５０３から呼び出される。ドライバ共通部分５０３は、ハードウェアをセットアップして作業を開始するハードウェア・インターフェース・モジュール（ＨＩＭ）内の適切な低レベルドライバ（ＬＬＤ）ルーチンを呼び出すことで、ＳＣＳＩ作業を開始する唯一のレイヤである。また、ＬＬＤルーチンは、ＳＣＳＩ構成モジュール５１６から構成中に割り当てられるドライバＩＤが示すスイッチ表によってもアクセスされる。
【００４５】
（ｂ）  デバイス固有部分
共通部分５０２とデバイス固有ルーチン５０４のインターフェースは、共通部分とのインターフェースと同様で、ｃｓｘｘ_ｉｎｔｔ、ｃｓｘｘ_ｏｐｅｎ、ｃｓｘｘ_ｃｌｏｓｅ、ｃｓｘｘ_ｓｔｒａｔｅｇｙのコマンドが含まれる。「ｘｘ」の指定箇所はストレージ・デバイスのタイプ（ディスクの「ｄｋ」やテープの「ｔｐ」）を示す。これらのルーチンはあらゆるデバイス固有要件を扱う。例えば、デバイスがディスクの場合、ｃｓｄｋ_ｏｐｅｎはディスクの特定のエリアからパーティション・テーブルの情報を読み出し、ｃｓｄｋ_ｓｔｒａｔｅｇｙはパーティション・テーブルの情報を利用してブロックが境界外にあるかどうかを判断することになる。（パーティション・テーブルは、特定の物理ディスクごとに、論理ディスクから物理ディスクのブロックマッピングを定義する）
（ｃ）  高レベルドライバのエラー／フェールオーバの処理
（ｉ）  エラーの処理
（ａ）  再試行
ＨＬＤ５０２の最も一般的な復旧措置では、失敗したＩ／Ｏの再試行を利用する。特定のコマンド・タイプの再試行の回数は、コマンドページによって指定されている。例えば、読み出しや書き込みコマンドは非常に重要とみなされるため、これに関連するコマンドページでは再試行回数を３に設定する場合もある。問合わせコマンドはそれほど重要ではなく、その日の第一の作業中に継続的に再試行を行うとシステムがスローダウンする可能性があるため、再試行回数を０に設定する場合もある。
【００４６】
要求が初めて発行されるとき、その再試行回数は０に設定される。要求が失敗し、復旧スキムが繰り返される度に、再試行の回数は増えていく。再試行の回数が、コマンドページで指定された最大再試行回数を上回ると、Ｉ／Ｏは失敗に終わり、要求者にメッセージが返信される。これがない場合は、要求の再発行が行われる。このルールの唯一の例外は、ユニット・アテンションに関するもので、通常はエラーではなくイベントの通知である。ユニット・アテンションをコマンドとして受け取り、その最大再試行回数が０又は１に設定されていた場合、高レベルドライバ５０２は、このＩ／Ｏに関する最大再試行回数を２に設定する。こうして、ユニット・アテンション状態の影響でＩ／Ｏの失敗が早くなるのを防止する。
【００４７】
遅延再試行も、一定の時間、待ち行列上で再試行の置き換えが行われない点を除き、上述の再試行スキムと同様に扱われる。
【００４８】
（ｂ）  失敗したＳｃｓｉ_ｏｐ
ＦＣＩ低レベルドライバ５０６に対して発行されたＳｃｓｉ_ｏｐは、いくつかの状況により失敗することがある。表ＩＩは、ＦＣＩ低レベルドライバ５０６がＨＬＤ５０２に戻すことのできる失敗のタイプを示している。
【００４９】
【表２】
0004567125.tif 000003
【００５０】
（ｃ）  リソース不足
リソース不足のエラーは、いくつかの希望するリソースが要求時に利用できなかった際に起こる。普通、こうしたリソースはシステムメモリ及びドライバ構造メモリである。
【００５１】
システムメモリ不足の処理は、セマフォ・ブロックによって行われる。メモリリソースをブロックするスレッドは、すべての新しいＩ／Ｏの発行を妨げる。このスレッドは、Ｉ／Ｏが完了してメモリがフリーになるまでブロックを続ける。
【００５２】
ドライバ構造リソースは、Ｓｃｓｉ_ｏｐ及びＩ／Ｏベクトル（ＩＯＶ）リストプールに関連している。ＩＯＶリストは、ディスクが送受信するメモリの開始値及び長さの値のリストである。このメモリプールは、プールのサイズを指定する調整可能なパラメータを利用して、その日の最初に初期化される。Ｓｃｓｉ_ｏｐ又はＩＯＶプールが空の場合、新しいＩ／Ｏによって、これらのプールが増加する。どちらかのプールを増加させるために、一度に１ページ（4096バイト）のメモリが割り当てられる。新しいページのすべてのＳｃｓｉ_ｏｐ又はＩＯＶプールがフリーになるまで、このページはフリーにならない。ＩＯＮ２１２が、Ｓｃｓｉ_ｏｐのページの割り当てとフリー化を行っている場合やページの割り当てとフリー化を絶えず行っている場合は、関連するパラメータの調整が望ましい。
【００５３】
リソース不足の処置はすべてイベントを通じて記録される。
【００５４】
（ｉｉ）  その日の第一の処理
その日の最初に、ＨＬＤ５０２は必要な構造とプールを初期化し、アダプタ固有のドライバ及びハードウェアを初期化するために呼び出しを行う。その日の第一の処理は、ｃｓ_ｉｎｉｔ（）の呼び出しによって始まり、これは（１）Ｓｃｓｉ_Ｏｐプールの割り当て、（２）ＩＯＶプールの割り当て、（３）ファイバ・チャンネル構造及びハードウェアの初期化を行うＦＣＩｈｗ_ｉｎｔ（）の呼び出し、（４）割込みサービスルーチンｃｓ_ｉｎｔｒ（）と該当する割込みベクトルとの結びつけを行う。
【００５５】
（ｉｉｉ）  フェールオーバ処理
ＩＯＮ２１２のダイポールの半分はどちらも共通のディスクデバイスセットに接続されている。ダイポール２２６のＩＯＮ２１２及び２１４は常にすべてのデバイスにアクセスできなくてはいけない。ＨＬＤ５０２から見て、特別なフェールオーバの処理は存在しない。
【００５６】
（２）コマンドページ
本発明のＩＯＮ２１２は、ＳＣＳＩコマンドの実際の組立から、共通部分とデバイス固有部分を抽象化するコマンドページ法を使用する。コマンドページは機能のポインタのリストで、各機能はＳＣＳＩコマンド（ＳＣＳＩ_2_Ｔｅｓｔ_ＵｎｉｔＲｅａｄｙなど）を意味する。上述のように、デバイスには、第一のオープン時又はそのデバイスのアクセス時に特定のコマンドページが結びつけられる。ベンダー独自や非対応の特殊なＳＣＳＩデバイスは、そのデバイスの固有コマンドページで参照される機能によって管理する。通常のシステムは、出荷時に、コマンドコントロールセット（ＣＣＳ）、ＳＣＳＩ Ｉ及びＳＣＳＩ ＩＩページ、ベンダー独自のページが入っており、非対応ＳＣＳＩデバイス又はベンダ独自のＳＣＳＩコマンドの統合を可能にしている。
【００５７】
コマンドページ機能は、デバイス共通部分５０３、デバイス固有部分５０４、ＦＣＩ低レベルドライバ５０６（Ｒｅｑｕｅｓｔ Ｓｅｎｓｅ）から、仮想デバイス（ＶＤＥＶ）インターフェースと呼ばれるインターフェースを通じて実施される。このレベルでは、ソフトウェアは、デバイスがどのＳＣＳＩ言語を使用しているかではなく、デバイスが意図した機能を実施しているかどうかのみを問題にする。
【００５８】
各コマンドページ機能はＳＣＳＩコマンドを組み立て、必要があればダイレクト・メモリ・アクセス（ＤＭＡ）データの転送にメモリを割り当てる。次にこの機能はドライバ共通部分５０３にコントロールを戻す。ドライバ共通部分５０３は、ＳＣＳＩ作業を待ち行列に加え（必要であればここでソートする）、ＦＣＩ低レベルドライバ５０６の開始ルーチンを呼び出して、このコマンドを実施する。コマンドが実行された後、「コール・オン・インタラプト」（ＣＯＩ）ルーチンがコマンドページ機能に存在していたら、ドライバのドライバ共通部分５０３が完了したコマンドのデータ／情報を検査する前にＣＯＩが呼び出される。返信データ／情報を操作することで、ＣＯＩは一致しないＳＣＳＩデータ／情報を標準のＳＣＳＩデータ／情報に変換できる。例えば、デバイスの問合わせデータに、バイト８ではなくバイト１２で始まるベンダＩＤが含まれる場合、問い合わせのコマンドページ機能には、返信の問合わせデータのベンダＩＤをバイト８に変えるＣＯＩが含まれる。ドライバ共通部分５０３は常にバイト８で始まるベンダＩＤ情報を抽出するため、一致しないデバイスについて知る必要はなくなる。
【００５９】
（３）  ＩＢＯＤとＳＣＳＩ構成モジュール
ＲＡＩＤコントローラの重要な機能はデータを損失から守ることである。この機能を実行するために、ＲＡＩＤソフトウェアはディスクデバイスがどこにあり、そのケーブルがどのように接続されているかを、物理的に知らなくてはいけない。したがって、ＲＡＩＤコントローラのテクニックを実施する上での重要な要件は、ストレージ・デバイスの構成をコントロールする能力である。
【００６０】
ＪＢＯＤ及びＳＣＳＩ構成モジュール５１６のＪＢＯＤ部分にはＩＯＮ２１２のスタティックＩＢＯＤ構成の定義のタスクがある。ＪＢＯＤ及びＳＣＳＩ構成モジュール５１６が記述する構成情報を表ＩＩＩに示す。
【００６１】
【表３】
0004567125.tif 000004
【００６２】
アダプタ、ＪＢＯＤエンクロージャ２２２、ストレージディスク２２４の物理的な位置情報に加え、ＦＣＩ低レベルドライバ５０６及びドライバデバイス固有部分５０４の入口点といったその他の構成情報やコマンドページの定義も記述しなくてはいけない。この情報の提供にはｓｐａｃｅ．ｃファイルが使用され、ＩＯＮ２１２はＩＯＮ物理ディスクドライバ５００のコンパイル時に構成情報を組み立てる。サポートするＩＯＮ２１２の構成が変化した場合は、新しいバージョンのＩＯＮ物理ディスクドライバ５００をコンパイルしなくてはいけない。
【００６３】
（４）  ファイバ・チャンネル・インターフェース（ＦＣＩ）低レベルドライバ
ＦＣＩ低レベルドライバ５０６は高レベルドライバ５０２のためにＳＣＳＩインターフェースを管理する。ドライバ共通部分５０３とＦＣＩ低レベルドライバ５０６のインターフェースには、以下のルーチンが含まれる。なお「ｘｘ」の指定箇所には、ＦＣＩ低レベルドライバ５０６がコントロールするハードウェア固有の識別子が入る（ＦＣＩｈｗ_ｉｎｉｔなど）。
【００６４】
・  ｘｘｈｗ_ｉｎｉｔ  ハードウェアを初期化する。
【００６５】
・  ｘｘｈｗ_ｏｐｅｎ  ホストアダプタの現在の状況を判断する。
【００６６】
・  ｘｘｈｗ_ｃｏｎｆｉｇ  ホストアダプタの構成情報をセットアップする（ＳＣＳＩ ＩＤなど）。
【００６７】
・  ｘｘｈｗ_ｓｔａｒｔ  可能ならば、ＳＣＳＩ作業を開始する。
【００６８】
・  ｘｘｈｗ_ｉｎｔｒ  すべてのＳＣＳＩ割込みを処理する。
【００６９】
低レベルドライバは、デバイスの仕様を認識したり問題にしたりせず、単純に上のレベルからのＳＣＳＩコマンドの経路となっている点では、純粋なＳＣＳＩドライバである。このレイヤには割込みサービスルーチン、ハードウェアの初期化、マッピング、アドレス・トランスレート、エラー復旧ルーチンがある。加えて、同じシステムに複数タイプの低レベルドライバが共存できる。こうした、ドライバのハードウェア管理レイヤとその他の分割により、同じ高レベルドライバを異なるマシンで実行することが可能になる。
【００７０】
ＦＣＩモジュールの基本機能は（１）ＳＣＳＩ ＯｐをＦＣＩ作業オブジェクト構造（Ｉ／Ｏブロック（ＩＯＢ））にトランスレートするためのＳＣＳＩ高レベルドライバ（ＳＨＬＤ）とのインターフェース、（２）異なるＨＩＭ５０８を通じた新しいファイバ・チャンネル・アダプタのサポートを容易にする共通インターフェースの提供、（３）いずれかのＦＣ−４プロトコルレイヤ（図のファイバ・チャンネル・プロトコル（ＦＣＰ））が使用するＦＣ−３共通サービスの提供、（４）ＨＩＭ508又はハードウェアが応答しない場合にＨＩＭに送る非同期コマンド（ＦＣＰコマンド、ＦＣ−３コマンド、ＬＩＰコマンド）を保護するためのタイマーサービスの提供、（５）（ａ）Ｉ／Ｏ要求ブロック（ＩＯＢ）、（ｂ）ベクトル表、（ｃ）ＨＩＭ５０８リソース（ホストアダプタメモリ、ＤＭＡチャンネル、Ｉ／Ｏポート、スクラッチメモリなど）を含むファイバ・チャンネル・ドライバ全体（ＦＣＩ及びＨＩＭ）のリソース管理、（６）ファイバ・チャンネルの（ファイバ・チャンネル・ファブリックに対する）アービトレイト・ループ使用の最適化
ＦＣＩ低レベルドライバ５０６の重要なデータ構造のリストを下の表ＩＶに示す。
【００７１】
【表４】
0004567125.tif 000005
【００７２】
（ａ）  エラー処理
ＦＣＩ低レベルドライバ５０６が扱うエラーは、ファイバチャンネルやＦＣＩ自身に固有のエラーとなる傾向がある。
【００７３】
（ｉ）  複数段階のエラー処理
ＦＣＩ低レベルドライバ506は特定のエラーを複数ステージ処理で扱う。これにより、エラーのタイプによってエラー処理テクニックを最適化することができる。例えば、破壊的でない手順を使用して効果がない場合は、さらに抜本的なエラー処理テクニックを行ったりする。
【００７４】
（ｉｉ）  失敗したＩＯＢ
すべてのＩ／Ｏ要求は、Ｉ／Ｏ要求ブロックを通じて、ＨＩＭ５０８へ送られる。以下は、ＨＩＭ５０８が返信する可能性のあるエラーである。
【００７５】
【表５】
0004567125.tif 000006
【００７６】
（ｉｉｉ）  リソース不足
ＦＣＩ低レベルドライバ５０６はＩＯＢのリソースプールとベクトル表を管理する。こうしたプールのサイズはＩＯＮ２１２の構成に同調するため、こうしたリソースが足りなくなる可能性はないはずであるため、簡単な復旧手順が実施される。
【００７７】
ＩＯＢやベクトル表の要求が行われ、この要求を満たすのに十分なリソースがない場合は、Ｉ／Ｏを待ち行列に戻し、Ｉ／Ｏを再試行するためのタイマーを設定する。リソース不足の発生は記録される。
【００７８】
（ｂ）その日の第一の処理
その日の最初に、高レベルドライは５０２は、サポートするそれぞれの低レベルドライバ（ＦＣＩ低レベルドライバ５０６を含む）に対して呼び出しを行う。
ＦＣＩの低レベルドライバ５０６のその日の第一の処理は、ＦＣＩｈｗ_ｉｎｔ（）ルーチンの呼び出しで始まり、これは以下の作業を行う。
まず、指定されたＰＣＩバスとデバイスのために、ＨＩＭ_ＦｉｎｄＣｏｎｔｒｏｌｌｅｒ（）関数が呼び出される。これはＦｉｎｄＣｏｎｔｒｏｌｌｅｒ（）のバージョンを呼び出す。ＪＢＯＤ及びＳＣＳＩ構成モジュール５１６は、探索のためにＰＣＩバスとデバイスを指定する。次に、アダプタ（ＡＤＡＰＴＥＣから￥利用できるものなど）が見つかった場合は、ＨＣＢを割り当て、アダプタ用に初期化する。そして、スクラッチメモリ、メモリマップＩ／Ｏ、ＤＭＡチャンネルといったアダプタ固有リソースを得るために、ＨＩＭ_ＧｅｔＣｏｎｆｉｇｕｒａｔＩＯＮ（）を呼び出す。次に、リソースを割り当てて初期化し、ＡＤＡＰＴＥＣ ＨＩＭとハードウェアを初期化するために、ＨＩＭ_Ｉｎｉｔｉａｌｉｚｅ（）を呼び出す。最後に、ＩＯＢとベクトル表を割り当てて初期化する。
【００７９】
（ｃ）  フェールオーバ処理
ＩＯＮ２１２のダイポールの半分はどちらも共通のディスクデバイスセットに接続されている。両方のＩＯＮ２１２は常にすべてのデバイスにアクセスできなくてはいけない。ＦＣＩ低レベルドライバ５０６から見て、特別なフェールオーバの処理は存在しない。
【００８０】
（５）  ハードウェア・インターフェース・モジュール（ＨＩＭ）
ハードウェア・インターフェース・モジュール（ＨＩＭ）５０８はＡＤＡＰＴＥＣのＳｌｉｍＨＩＭ５０９とインターフェースするように設計されている。ＨＩＭ５０８モジュールは、ＦＣＩ低レベルドライバ５０６からの要求を、ＳｌｉｍＨＩＭ５０９が理解してハードウェアに発行できる要求にトランスレートすることに主な責任を有している。これには、Ｉ／Ｏブロック（ＩＯＢ）要求の取り込みと、ＳｌｉｍＨＩＭ５０９が理解可能な、対応する転送コントロールブロック（ＴＣＢ）要求へのトランスレートが含まれる。
【００８１】
ＨＩＭ５０８の基本機能に含まれるのは（１）検索、構成、初期化、アダプタへのＩ／Ｏの送信を行うハードウェア固有関数に対する、低レベル・アプリケーション・プログラム・インターフェース（ＡＰＩ）の定義、（２）Ｉ／ＯブロックをＳｌｉｍＨＩＭ／ハードウェアが理解できるＴＣＢ要求（ＦＣプリミティブＴＣＢ、ＦＣ拡張リンクサービス（ＥＬＳ）ＴＣＢ、ＳＣＳＩ−ＦＣＰ作業ＴＣＢなど）にトランスレートするためのＦＣＩ低レベルドライバ５０６とのインターフェース、（３）ＳｌｉｍＨＩＭに対して発行されたコマンド（ＴＣＢ）の配信と完了の追跡、（４）ＳｌｉｍＨＩＭ５０９からの割り込みやイベント情報の解釈やＦＣＩ低レベルドライバ５０６に関する適切な割り込み処理やエラー復旧の実行である。ＴＣＢのデータ構造を下の表ＶＩに示す。
【００８２】
【表６】
0004567125.tif 000007
【００８３】
（ａ）  その日の第一の処理
ＨＩＭ５０８は、その日の第一の処理中に使用する３つの入口点を定義する。
第一の入口点はＨＩＭ_ＦｉｎｄＡｄａｐｔｅｒで、これはＦＣＩｈｗ_ｉｎｔ（）によって呼び出され、ＰＣＩ ＢＩＯＳルーチンを使用して、与えられたＰＣＩバス及びデバイス上にアダプタがあるかどうかを判断する。アダプタの存在の判断には、アダプタのＰＣＩベンダ及び製品ＩＤを使用する。
【００８４】
二番目の入口点はＨＩＭ_ＧｅｔＣｏｎｆｉｇｕｒａｔＩＯＮで、これはアダプタが存在する場合にＦＣＩｈｗ_ｉｎｉｔ（）によって呼び出され、提供されたＨＣＢにリソース要件を加える。ＡＤＡＰＴＥＣの場合、このリソースにはＩＲＱ、スクラッチ、ＴＣＢメモリが含まれる。この情報はＳｌｉｍＨＩＭ５０９への呼び出しを行うことで見つかる。
【００８５】
三番目の入口点はＨＩＭ_Ｉｎｉｔｉａｌｉｚｅで、これはリソースの割り当てと初期化が終わった後でＦＣｉｈｗ_ｉｎｔ（）によって呼び出され、スクラッチメモリ、ＴＣＢ、ハードウェアの初期化を行うためにＳｌｉｍＨＩＭへの呼び出しを行うＴＣＢメモリプールを初期化する。
【００８６】
（ｂ）  フェールオーバ処理
ＩＯＮ２１２のダイポールの半分はどちらも共通のディスクデバイスセットに接続されている。ＩＯＮ２１２、２１４の両方は常にすべてのデバイスにアクセスできなくてはいけない。ＨＩＭ５０９から見て、特別なフェールオーバの処理は存在しない。
【００８７】
（６）  ＡＩＣ−１１６０ ＳｌｉｍＨＩＭ
ＳｌｉｍＨＩＭ５０９モジュールの最終的な目的は、アダプタ（図ではＡＤＡＰＴＥＣ ＡＩＣ−１１６０）のハードウェア抽象を提供することである。ＳｌｉｍＨＩＭ５０９の主な役割には、ＡＩＣ−１１６０アダプタへのファイバ・チャンネル要求の転送、割り込みのサービス、ＳｌｉｍＨＩＭ５０９インターフェースを通じてのＨＩＭモジュールへのステータス報告の返信がある。
【００８８】
さらに、ＳｌｉｍＨＩＭ５０９は、ＡＩＣ−１１６０ハードウェアの管理と初期化、ファームウェアのロード、ランタイム作業の実行を行い、ＡＩＣ−１１６０のエラーの際にはＡＩＣ−１１６０ハードウェアをコントロールする。
【００８９】
２．  外部インターフェースとプロトコル
ＩＯＮ物理ディスクドライバ・サブシステム５００のすべての要求は、共通高レベルドライバ５０２を通じて行われる。
【００９０】
ａ）  初期化（ｃｓ_ｉｎｉｔ）
サブシステムへの単一呼び出しにより、デバイスがＩ／Ｏの準備をするのに必要なすべての初期化が行われる。サブシステムの初期化中には、すべてのドライバ構造とデバイス又はアダプタ・ハードウェアの割り当てと初期化が行われる。
【００９１】
ｂ）  オープン／クローズ（ｃｓ_ｏｐｅｎ/ｃｓ_ｃｌｏｓｅ）
オープン／クローズ・インターフェース５１０は、デバイスにアクセスするのに必要な構造の初期化と分類を行う。インターフェース５１０は一般的なオープン／クローズ・ルーチンと異なり、すべての「オープン」と「クローズ」が明確に階層化されている。したがって、Ｉ／Ｏ物理インターフェースドライバ５００が受領したすべての「オープン」には、受領した関連する「クローズ」が伴わなくてはならず、デバイス関連構造はすべての「オープン」が「クローズ」するまではフリーにならない。オープン／クローズ・インターフェース５１０は、要求の完了を示す「オープン」又は「クローズ」の返信については同期式である。
【００９２】
ｃ）  Ｂｕｆ_ｔ（ｃｓ_ｓｔｒａｔｅｇｙ）
Ｂｕｆ_ｔインターフェース５１２はデバイスに対する論理ブロックの読み出し及び書き込み要求の発行を可能にする。要求者は、そのＩ／Ｏを記述したＢｕｆ_ｔ構造を伝える。デバイスＩＤ、論理ブロックアドレス、データアドレス、Ｉ／Ｏタイプ（読み出し／書き込み）、コールバック・ルーチンといった属性はＢｕｆ_ｔによって記述される。要求が完了すると、要求者がコールバックで指定した関数が呼び出される。Ｂｕｆ_ｔンターフェース５１２は非同期インターフェースである。要求者への関数の返信は要求の完了を示すものではない。関数が戻された時には、Ｉ／Ｏがデバイスで実行中の可能性もあり、そうではない可能性もある。その要求は待ち行列上で実行されるのを待っている可能性もある。
その要求は、コールバック関数が呼び出されるまでは完了しない。
【００９３】
ｄ）  ＳＣＳＩＬｉｂ
ＳＣＳＩＬｉｂ５１４は、通常の読み出し及び書き込みを除くＳＣＳＩコマンド記述子ブロック（ＣＤＢ）のデバイスへの送信を可能にするインターフェースを提供する。このインターフェースを通じて、ディスクのスピンやスピンダウンのためにユニットの開始及び停止といった要求が利用されたり、エンクロージャ・デバイスのモニタや管理のために診断の送信又は受領といった要求が利用される。すべてのＳＣＳＩＬｉｂルーチンは同期式である。呼び出した関数の返信が要求の完了を意味する。
【００９４】
ｅ）  割り込み（ｃｓ_ｉｎｔｒ）
ＩＯＮ物理ディスクドライバ５００は、すべてのＳＣＳＩ及びファイバ・チャンネル・アダプタの割り込みの中心的なディスパッチャである。実施形態では、フロントエンド／バックエンド割り込みスキムが利用されている。この場合、割り込みがサービスされると、フロントエンド割り込みサービスルーチンが呼び出される。フロントエンドは割り込みスタックから実行され、割り込みのソースのクリア、アダプタによる更なる割り込み生成の無効化、バックエンド割り込みサービスルーチンのスケジュールに責任を有する。バックエンドは、（アダプタの割り込み無効化とバックエンド・タスク開始の間に発生した他の割り込みと共に）実際に割り込みを扱う優先度の高いタスクとして実行される。
【００９５】
３．  ＩＯＮの機能
ＩＯＮ２１２は主に５つの機能を果たす。この機能は以下の通りである。
【００９６】
ストレージのネーミングと射影：ストレージディスク２２４に保存されるストレージ・リソース・オブジェクトのイメージを計算ノード２００に射影して、一貫したストレージのネーミングを行うために、計算ノード２００と協力する。
【００９７】
ディスク管理：ＩＯＮ２１２と運用上で対になっているストレージディスクドライブ２２４にデータ分配及びデータ冗長テクニックを実施する。
【００９８】
ストレージ管理：ストレージのセットアップ、計算ノード２００からのＩ／Ｏ要求の処理を含むデータ移動、性能の計測、イベント分配を取り扱う。
【００９９】
キャッシュ管理：アプリケーション・ヒント・プレフェッチのようなキャッシュ充足作業を含むキャッシュデータの読み出しと書き込み。
【０１００】
インターコネクト管理：性能の最適化のための計算ノード２００のデータフローの制御及び要求の経路選択の制御と、それに伴うダイポール２２６の２つのＩＯＮ２１２の間のストレージ分配の制御。
【０１０１】
ａ）ストレージのネーミングと射影
ＩＯＮ２１２はストレージディスク２２４に保存されるストレージ・リソース・オブジェクトを計算ノード２００に射影する。この機能の重要な部分は、ＩＯＮ２１２が管理する各ストレージリソース（仮想ファブリックディスクを含む）に、大域的にユニークな名前、ファブリックでユニークなＩＤ、ボリュームセット識別子（ＶＳＩ）のいずれかの作成と割り当てである。
【０１０２】
図６は、ＶＳＩ６０２と関連データの構造と内容を示す図である。ＶＳＩ６０２がユニークで競合がないことが重要であるため、各ＩＯＮ２１２は、そのＩＯＮ２１２がローカルで管理するストレージリソースのために、大域的にユニークな名前を作成し割り当てることに責任を有する。また、ストレージ・リソース・オブジェクトを保存しているストレージリソースを管理するＩＯＮ２１２のみが、そのストレージリソースにＶＳＩ６０２を割り当てることができる。ＶＳＩ602の作成と割り当てができるのは常駐するストレージリソースを管理するＩＯＮのみだが、他のＩＯＮ２１２もその後のストレージリソースの保存と検索の管理をすることがある。これは、ＩＯＮが割り当てたＶＳＩ６０２が、他のＩＯＮによって管理されるストレージリソースに移動したとしても、特定のデータオブジェクトのＶＳＩ６０２を変更する必要がないためである。
【０１０３】
ＶＳＩ６０２は、ＩＯＮ識別子６０４とシーケンス番号５０６の２つの部分を含む64ビットの数字として導入される。ＩＯＮ識別子は各ＩＯＮ２１２に割り当てられた、大域的にユニークなＩＤ番号である。大域的にユニークなＩＯＮ識別子６０４を入手するテクニックの１つでは、実時間時計チップにストアされることの多い電子的に読み出し可能なマザーボードのシリアル番号を使う。唯一のマザーボードに割り当てられるため、シリアル番号はユニークである。ＩＯＮ識別子６０４は大域的にユニークな番号であるため、各ＩＯＮ２１２は、ローカルでのみユニークなシーケンス番号６０６を割り当てることで、大域的にユニークなＶＳＩ６０２を作成できる。
【０１０４】
ＶＳＩ６０２をＩＯＮ２１２上のストレージリソースに結びつけた後、ＩＯＮ２１２はストレージリソース１０４へのアクセスを可能にするために、同報メッセージを通じて、ファブリックのすべてのノードにＶＳＩ６０２をエキスポートする。このプロセスは、本文書のＩＯＮ名のエキスポートのセクションで詳しく論じる。
【０１０５】
エキスポートしたＶＳＩ６０２を使用して、計算ノード２００のソフトウェアは、ローカル接続された他のすべてのストレージデバイスからは区別できないという点で意味的に透過なストレージリソースのために、ローカル入口点を作成する。例えば、計算ノードのＯＳ２０２がＵＮＩＸであれば、周辺機器１０８やディスク２１０といったローカル接続デバイスと同様に、ブロックデバイスと未使用デバイスの入口がデバイスディレクトリに作成される。その他のＯＳ２０２でも、同様の意味的な同値性が守られる。異なるＯＳ２０２を実行する計算ノード２００間でも、この複合コンピューティング環境での最善のサポートを行うために、ルート名の一貫性が維持される。計算ノード２００のローカル入口点は、エキスポートしたストレージリソース１０４の現在の可用性を追跡するために、動的に更新される。計算ノード２００で稼働するＯＳ依存のアルゴリズムはＶＳＩ６０２を使用して、インポートしたストレージリソースのデバイス入口点名を作成する。この方法により、共通のＯＳを共有するノード間での名前の一貫性が保証される。これによりシステムは、各計算ノード２００上の大域的な名前の付いたストレージリソースのローカル入口点を（静的ではなく）動的に作成することで、複合コンピューティング環境をサポートするルート名の一貫性を維持できる。
【０１０６】
上述のように、ストレージリソース１０４のＶＳＩ６０２作成の詳細は、ストレージリソース１０４をエキスポートしているＩＯＮ２１２が直接コントロールしている。計算ノード２００内でのＯＳ１０４の相違の可能性を考慮して、各ＶＳＩ６０２には１つ又は複数の記述ヘッダが結びついており、ＩＯＮ２１２上のＶＳＩ６０２と共にストアされている。各ＶＳＩ６０２記述子６０８にはオペレーティングシステム（ＯＳ）従属データセクション６１０が含まれており、これは特定のＶＳＩ６０２のために計算ノード２００上でデバイス入口点の作成を一貫して（名前と運用上の意味を計算ノード２００全体で同じにして）行う上で必要になる、十分なＯＳ２０２従属データをストアするためである。このＯＳ従属データ６１０に含まれるのは、例えば、データ記述ローカルアクセス権６１２や所有者情報６１４である。ＶＳＩ６０２がＩＯＮ２１２によって確立され、計算ノード２００によってインポートされた後で、ＶＳＩ６０２に結びつくストレージリソース１０４の入口点が作成される前に、ＩＯＮ２１２は該当するＯＳ固有データ６１０を計算ノード２００に送る。ＶＳＩ６０２の複数の記述ヘッダは、異なるＯＳ（各ＯＳは独自の記述ヘッダを持つ）を使用する複合計算ノード２００の同時サポートと、異なる計算ノード２００グループ内の分離アクセス権のサポートを可能にする。同じ記述ヘッダを共有する計算ノード２００は、デバイス入口点の作成を共通する一貫した方法で行う。そのため、共通のアクセス権を共有するすべての計算ノード２００において、名前と運用上の意味の一貫性が守られる。
【０１０７】
ＶＳＩ記述子６０８にはエイリアス・フィールド６１６が含まれ、これは人間が読めるＶＳＩ６０２名を計算ノードに表示するのに使用される。例えば、ＶＳＩ１９８４のエイリアスが「ｓｏｍａ」の場合、計算ノード２００は１９８４と「ｓｏｍａ」の両方のディレクトリ・エントリを持つことになる。ＶＳＩ記述子６０８はＶＳＩ６０２と一緒にＩＯＮ上でストアされるため、同じエイリアス及びローカルアクセス権が、ＶＳＩ６０２をインポートする各計算ノード上に現れる。
【０１０８】
上述のように、本発明では分散割り当てスキムに適したネーミング方法を使用する。この方法では、大域的なユニーク性を保証するアルゴリズムに従って、名前をローカルで生成する。これのバリエーションとして、中央ネームサーバが各システムに存在する、ローカルな中央化の方法があるが、純粋な分散式の方法に比べて可用性と堅牢性の要件が大きくなる。上述の方法により、本発明では、大域的なユニーク性を保証するローカル実行のアルゴリズムを作成できる。
【０１０９】
大域的に一貫したストレージシステムの作成には、単に計算ノード２００での名前の一貫性を維持する以上のサポートが必要である。名前と密接な関係にあるのはセキュリティの問題であり、本発明では二つの形をとる。一つはＩＯＮ２１２と計算ノード２００間のインターフェースのセキュリティであり、二つ目は計算ノード２００内からのストレージのセキュリティである。
【０１１０】
ｂ）ストレージの認証と許可
ＶＳＩ６０２リソースは２種類のメカニズム、認証、許可によって保護される。ＩＯＮ２１２が計算ノード２００を認証した場合、ＶＳＩ名は計算ノード２００にエキスポートされる。エキスポートしたＶＳＩ６０２は計算ノード２００上でデバイス名となる。計算ノード上のアプリケーション・スレッドは、このデバイス名で作業を試みることができる。デバイス入口点のアクセス権と計算ノード２００のＯＳ意味は、アプリケーション・スレッドが特定の許可の実施を許可されているかどうかを判断する。
【０１１１】
この許可の方法は、インターコネクト・ファブリック１０６がアクセスできる位置にあるストレージリソース１０４の、計算ノード２００による許可を拡大する。しかし、本発明は、計算ノード２００が本発明のストレージリソース１０４を直接管理しない点において、他のコンピュータアーキテクチャとは異なっている。この違いにより、ローカルの許可データを単純にファイルシステムと結びつけるのは実用的ではなくなる。代わりに、本発明では、計算ノード２００の許可方針データをＩＯＮ２１２のＶＳＩ６０２と結びつけ、計算ノード２００とＩＯＮ２１２が相互信頼のレベルを共有する２段階のアプローチを使用する。ＩＯＮ２１２は各計算ノード２００による特定のＶＳＩ６０２へのアクセスを許可するが、ＶＳＩが指定するデータへの特定のアプリケーション・スレッドの許可の詳細化は計算ノード２００の責任である。計算ノード２００は、ＩＯＮ２１２にストアされた許可メタデータに含まれる方針を使用して、ストレージ１０４に許可方針を強制する。したがって、計算ノード２００はＩＯＮ２１２によるメタデータの維持を信頼する必要があり、ＩＯＮ２１２に計算ノード２００による許可の強制を信頼させる必要がある。この方法の利点の一つは、ＩＯＮ２１２がメタデータの解釈方法に関する知識を持つ必要がないことである。そのため、ＩＯＮ２１２は、計算ノード２００が使用する異なるＯＳ２０２がインポーズする異なる許可の意味によってインポーズされる特定の許可の意味の強制から分離される。
【０１１２】
ＶＳＩ６０２に関連するすべてのデータ（アクセス権を含む）はＩＯＮ２１２にストアされるが、アクセス権データの内容を管理する責務は計算ノード２００にある。さらに詳しく言えば、ＩＯＮ２１２がエキスポートしているＶＳＩ６０２のリストを計算ノード２００に送る時、各ＶＳＩ６０２に結びつくのは、計算ノード２００がローカルでの許可を強制するのに必要なすべてのＯＳ指定データである。例えば、ＵＮＩＸを動かす計算ノード２００は名前、グループ名、ユーザＩＤ、つまりファイルシステムにデバイス・エントリ・ノードを作成するのに十分なデータを送信される。計算ノードＯＳ２０２に固有の（又は計算ノード２００に固有の）ＶＳＩ６０２の代替名は、各ＶＳＩ６０２に含まれる。ストレージデバイスのアクセス権を変更するローカルＯＳ固有コマンドは、計算ノード２００のソフトウェアが捕獲し、ＩＯＮ２１２へ送るメッセージに変換される。このメッセージは、そのＯＳバージョン固有のＶＳＩアクセス権をアップデートする。この変更が完了すると、ＩＯＮ２１２は、システムのＯＳを使用するすべての計算ノード２００に、アップデートを送信する。
【０１１３】
計算ノード（ＣＮ）２００は、オンラインになると、「自分はここにいる」というメッセージを各ＩＯＮに送信する。このメッセージは計算ノード２００を識別するデジタル署名を含んでいる。ＩＯＮ２１２が計算ノード２００を認識すると（ＩＯＮ２１２が計算ノード２００を承認すると）、ＩＯＮ２１２は計算ノード２００がアクセス権を持っているすべてのＶＳＩ名をエキスポートする。計算ノード２００は、このＶＳＩ６０２名のリストを使用して、システムストレージのローカルアクセス入口点を組み立てる。計算ノード２００内のアプリケーション２０４が最初にローカル端点を参照した時、計算ノード２００はインターコネクト・ファブリック１０６を通じて、そのＶＳＩ６０２のアクセス権記述データをＩＯＮ２１２に要求する。この要求メッセージには、要求している計算ノード２００のデジタル署名が含まれる。ＩＯＮ２１２はメッセージを受領し、デジタル署名を使用して返信すべき該当ＶＳＩアクセス権のセットを見つけて、インターコネクト・ファブリック１０６を介して、要求した計算ノード２００にそのデータを送信する。しかし、ＩＯＮ２１２は計算ノード２００に送信するアクセス権を解釈せず、データの送信のみを行う。計算ノード２００のソフトウェアは、このデータを利用して、該当するローカルアクセス権のセットを、この対象ストレージ・オブジェクトのローカル入口点に結びつける。
【０１１４】
計算ノード２００のセットは、同じデジタル署名の使用、又はＩＯＮ２１２に複数の異なる署名を同じアクセス権のセットに結びつけさせることで、同じアクセス権のセットを共有することができる。本発明では、認証を使用して、計算ノード２００の確認と、ローカル入口点の作成にどのローカル許可データを使用するかの指定の両方を行う。計算ノードが許可データを引き出すのは、アプリケーションが最初にＶＳＩ６０２を参照した時のみである。この「必要時に引き出す」モデルは、非常に大きなシステムの大量のアクセス権メタデータの移動によるスタートアップ・コストを回避することになる。
【０１１５】
計算ノード２００が認証に失敗した場合、ＩＯＮ２１２はＶＳＩ６０２名を含まないメッセージを返信し、認証失敗フラグが設定される。計算ノード２００はＩＯＮ２１２からのＶＳＩデバイス名なしでそのまま継続することが可能で、システム管理者の希望に応じて失敗した認証の報告をすることができる。もちろん、認証が成功した場合でも、計算ノードへのＶＳＩデバイス名の送信は行われない。
【０１１６】
ｃ）  立ち上げ時の競合解消
立ち上げ時、ＩＯＮ２１２はインターコネクト・ファブリック１０６にＶＳＩ６０２をエキスポートしようとする。この場合、新しいＩＯＮ２１２によるあらゆる中断からシステムのデータ完全性を守らなくてはいけない。これを実現するために、新しいＩＯＮ２１２は、ストレージのエキスポートが可能になる前にチェックされる。これは次のように行われる。まず、ＩＯＮ２１２はローカルストレージを検査して、エキスポート可能なＶＳＩ６０２のリストを作成する。ＶＳＩ６０２メタデータにはＶＳＩ生成又は変異番号が含まれる。ＶＳＩ変異番号は、そのＶＳＩ６０２の状態に大きな変化があったときに増加する（ＶＳＩのネットワークへのエキスポートが成功した時など）。ＶＳＩの競合検知に関与するすべてのノードは、計算ノード２００及びＩＯＮ２１２を含め、メモリにエキスポートされたＶＳＩの履歴と変異番号を保持する。インターコネクト・ファブリック上のすべてのノードは、エキスポートされたＶＳＩ６０２のＶＳＩ競合を常にモニターする必要がある。最初（ストレージ拡張した最初に作成された時）、ＶＳＩ変異番号はゼロに設定されている。エキスポートされたＶＳＩ６０２に前回エキスポートされた時よりも小さな変異番号がついている場合、たとえ実ＶＳＩ６０２に結びつくＩＯＮ２１２がサービス外だったとしも、そのＶＳＩは詐称ＶＳＩだと推定できる点では、変異番号は競合解消の基準を提供する。実ＶＳＩ６０２の変異番号より大きな変異番号を持つＩＯＮ２１２に付随する詐称ＶＳＩ６０２は、Ｉ／Ｏがすでに実ＶＳＩ上で実施されていない限り、実ＶＳＩ５１２とみなされる。新たにインターコネクト・ファブリックに導入されたＩＯＮ２１２は、変異番号０から開始する必要がある。
【０１１７】
システムへの加入希望を通知した後、ＩＯＮ２１２はＶＳＩ６０２のリストと関連する変異番号を送信する。他のすべてのＩＯＮ２１２と計算ノード２００はこのリストを入手し、ＩＯＮ２１２がＶＳＩ６０２のリストをエキスポートする妥当性をチェックする。
【０１１８】
現在同じＶＳＩ６０２をエキスポートしている他のＩＯＮは有効であると仮定され、新しいＩＯＮに対して、競合している特定のＶＳＩのエキスポートを認めないメッセージを送付する。新しいＩＯＮ５１２が現在システムで使用されているものよりも大きな生成又は変異番号を持っている場合は（ＶＳＩは大域的にユニークであるため、通常の運用では発生しないイベント）、必要な行動を行うシステム管理者に対してこれを通知及び報告する。競合がない場合、各ＩＯＮ２１２と計算ノードは続行投票により反応する。すべてのＩＯＮ２１２と計算ノード２００からの反応を受領すると、競合していない新しいＩＯＮ２１２のすべてのＶＳＩ６０２では生成番号が増加し、システムへのエキスポートができるようになる。
【０１１９】
計算ノード２００がＶＳＩ６０２のアプリケーション基準とアクセスを持つと、その計算ノード２００は生成番号をローカルで追跡する。ＩＯＮ２１２がＶＳＩ６０２を公表した時（エキスポートを試みた時）は常に、計算ノード２００はＶＳＩ６０２が公表した生成番号をＶＳＩ６０２に関してローカルでストアしている生成番号と比較する。生成番号が符号した場合、計算ノード２００は続行の投票を行う。生成番号が競合する場合（古いバージョンのＶＳＩがオンラインになった場合など）、計算ノード２００は拒否のメッセージを送る。新しいＩＯＮがＶＳＩに関して公表した生成番号より古い生成番号を持っている計算ノード２００は続行を投票し、そのＶＳＩ６０２のローカルバージョンの生成番号を更新する。計算ノード２００はリブートまでの間に生成番号を保存しない。これは基本設計において、インターコネクト・ファブリック１０６全体のシステムが安定し、計算ノード２００及びＩＯＮ２１２を含むすべての新規参入者を絶えずチェックするからである。
【０１２０】
第一の電源投入時、ＶＳＩ６０２のネームスペースの安定性が問題になる状況が起こり得る。この問題には、先にＩＯＮ２１２の電源を入れ、名前の競合を継続的に解消できるようにしてから、計算ノード２００の加入を認める形で対処する。これにより、期限切れバージョンのＶＳＩ６０２（ディスクドライブの古いデータその他の変質条件による）を生成番号によって解消できる。
計算ノード２００がそのＶＳＩ６０２を使用していない限り、より大きな生成番号を持つ新規参入者は、特定のＶＳＩ６０２を現在エキスポートしているものを無効化できる。
【０１２１】
（１）  ネーム・サービス
（ａ）  ＩＯＮの名前のエキスポート
ＩＯＮ２１２は、独占的に所有するＶＳＩ６０２の作業セットをエキスポートして、関連するストレージへのアクセスを可能にする。ＩＯＮ２１２がエキスポートするＶＳＩの作業セットは、バディＩＯＮ（ダイポール２１６内の他のＩＯＮ２１２、２１４で表される）とのＶＳＩ所有権の交渉を通じて動的に決定され、インターコネクト・ファブリック１０６で通信するすべてのノード内で大域的にユニークになる。このセットは普通は、ＩＯＮ２１２に割り当てられたＶＳＩ６０２のデフォルト又はプライマリセットである。ダイナミック・ロード・バランシングのためのＶＳＩマイグレーションや、バディＩＯＮ２１４の異常及びＩ／Ｏパスの異常を含む例外的状況によって、エキスポートされるＶＳＩ６０２セットがプライマリセット以外に変更される場合もある。
【０１２２】
ＶＳＩの作業セットは、作業セットが変更になると常に、同報メッセージを利用してＩＯＮ２１２によってエキスポートされ、最新のＶＳＩ構成を計算ノード２００に提供する。計算ノード２００も、ＩＯＮ２１２に対して、ＶＳＩ６０２の作業セットについて質問を行うことがある。エキスポートしたＶＳＩ６０２のためにＩＯＮ２１２がオンラインに加入又は再加入すると、計算ノード２００によってＶＳＩ６０２へのＩ／Ｏアクセスが開始される。上述のように、エキスポートしたＶＳＩ６０２に何らかの競合があれば、ＩＯＮ２１２はオンラインへの加入を許可されない。ストレージの集合に付随するＶＳＩ６０２はすべてユニークであるはずだが、ストレージの複数の集合が同じＶＳＩを持つ競合状態が発生する可能性もある（例えば、ＶＳＩがＩＯＮ２１２ハードウェアに付随するユニークなＩＤとＩＯＮ２１２が管理するシーケンス番号から形成され、そのＩＯＮ２１２ハードウェアが物理的に移動された場合）。
【０１２３】
作業セットをエキスポートすると、エキスポートしたＩＯＮ２１２は、オンライン状態に入って、エキスポートされたＶＳＩ６０２へのＩ／Ｏアクセスを可能にする前に、競合チェックタイマ（２秒）を設定する。競合チェックタイマは、インポートするものが競合チェック処理を行い、エキスポートしたものに競合を知らせるのに十分な時間を与えようとするが、タイマーを非常に大きな値に設定しない限り、これは保証できない。そのため、ＩＯＮ２１２はすべてのノード（計算ノード及びＩＯＮ２１２）から、オンライン加入を正式に認める明確な承認が必要である。すべてのノードは、オンライン同報メッセージに同時に反応し、結果はまとめられ、返送される。まとめた結果がＡＣＫであればＩＯＮ２１２は正式にオンラインに加入する。ＩＯＮ２１２がオンライン加入を認められなかった場合は、新しくエキスポートされたＶＳＩ６０２のセットにアクセスはできない。ＮＡＫを送ったノードは、その後ＶＳＩ競合メッセージをエキスポートしたものに送り、競合を解消させる。競合が解消すると、ＩＯＮ２１２は調整した作業セットをエキスポートし、再度オンラインに加入を試みる。
【０１２４】
（ｂ）  ＣＮの名前のインポート
計算ノード２００には、ＩＯＮ２１２がエキスポートしたすべてのＶＳＩ５０４をインポートするために行動する責任がある。その日の第一の処理中、計算ノード２００はオンライン上のすべてのＩＯＮ２１２に、前回エキスポートしたＶＳＩ６０２を要求し、ネームスペースの新しい状態を入手する。これ以降、計算ノード２００はＶＳＩ６０２のエキスポートに注意を払う。
【０１２５】
ＶＳＩ６０２に関する制御情報は、ＩＯＮ２１２が管理するｖｓノードに含まれる。ｖｓノードの計算ノード２００部分には、アプリケーション２０４に例示するネームの構築及び管理に使用される情報が含まれる。ｖｓノード情報にはユーザアクセス権及びネーム・エイリアスが含まれる。
【０１２６】
（ｉ）  ネーム・ドメイン及びエイリアス
ＶＳＩ６０２はアプリケーションが定義するネーム・エイリアスを持つ構成になる場合があり、これは関連するストレージにアクセスする代替名を提供する。
ネーム・エイリアスは、ネームのセットを論理的にまとめるために仮想ストレージドメインに属すことができる。ネーム・エイリアスは仮想ストレージドメイン内でユニークでなければいけない。
【０１２７】
（ｉｉ）  ｖｓノード
計算ノード２００によるｖｓノードの修正は、所有するＩＯＮに送られ、すぐに更新と処理が行われる。次に、ｖｓノードの変更は、ＩＯＮ２１２が変更のエキスポートとオンライン状態への再加入を行い、すべてのノードに伝達する。
【０１２８】
ｄ）  ストレージディスク管理
ＪＢＯＤエンクロージャ２２２は、ディスクデバイスのための物理環境の提供と、ディスクデバイス及びエンクロージャ管理アプリケーションへのいくつかのサービスの提供に責任を有する。こうしたサービスの中に含まれるのは（１）コンポーネント異常の通知（電源、ファンなど）、（２）しきい値の通知（温度や電圧）、（３）故障及びステータスライトの可能化と不能化、（４）音声警告の可能化と不能化、（５）ディスクデバイスのデバイスＩＤの設定である。
【０１２９】
以前は、管理アプリケーションは一般に、帯域外の接続によってエンクロージャとのインターフェースを行った。単一ネットワーク管理プロトコル（ＳＮＭＰ）のようなプロトコルを使用したリモート・エンクロージャへのシリアル又はイーサネット接続では、エンクロージャの状態に関するステータス情報を受領できた。本発明では、ディスクエンクロージャは物理的にホストシステムと離れている可能性があり、エンクロージャの構成やステータスを、分離したシリアル・パスのような直接的な接続によってモニターするのは実用的ではない。余分なケーブルを避けるために、本発明では、既存のノーマルなファイバ・チャンネル・ループによってエンクロージャのステータスをモニターし、エンクロージャの構成をコントロールできる帯域内接続を使用する。
【０１３０】
この帯域内接続では、構成情報の問い合わせや制御のためにホストからＳＣＳＩデバイスへ送信されるＳＣＳＩコマンドセットと、デバイスがこの情報をエンクロージャ自身に通信するメカニズムを使用する。ホストとディスクデバイスのプロトコルの部分は、ＳＣＳＩ−３エンクロージャサービス（ＳＥＳ）の仕様に詳述されており、これは本文書の参照事項に含まれる。
【０１３１】
ＳＥＳインターフェースの導入には、問い合わせ、診断送信、診断結果受領の３つのＳＣＳＩコマンドが使用される。問い合わせコマンドは、特定のデバイスがエンクロージャデバイスか、ＳＥＳコマンドをエンクロージャ・サービス・プロセスに転送できるデバイスかを指定する。診断送信、診断結果受領はそれぞれ、エンクロージャ要素からのステータス情報を管理、受領するために使用される。
【０１３２】
診断送信又は診断結果受領コマンドを使用する時は、ページコードを指定しなくてはいけない。ページコードは要求されているステータスや情報のタイプを指定する。診断送信及び診断結果受領コマンドによって要求できる既定ＳＥＳページのすべてのセットは下の表ＶＩＩに記載されている。太字の項目はＳＥＳイベントモニタが必要とするものである。
【０１３３】
【表７】
0004567125.tif 000008
【０１３４】
アプリケーション・クライアントは、診断結果読み出しコマンドを実行して断続的にエンクロージャをポーリングし、１より大きな最少割り当て長さのエンクロージャ・ステータス・ページを要求することがある。情報は、エンクロージャのステータスを要約した５ビットを含む１バイトによって戻される。これらのビットの一つが設定されている場合、アプリケーション・クライアントは、完全なステータスを入手するために、このコマンドを長い割り当て長さで再発行できる。
【０１３５】
ｅ）ＩＯＮエンクロージャ管理
図７は、ＩＯＮエンクロージャ管理モジュールとＩＯＮ物理ディスクドライバ・アーキテクチャ５００の関係を示している。このサブシステムは、ＳＥＳイベントモニタ７０２とＳＣＣ２＋ｔｏ ＳＥＳガスケット７０４の２つのコンポーネントで構成されている。ＳＥＳイベントモニタ７０２は、接続するすべてのエンクロージャのサービス・プロセスのモニタと、ステータスが変化した場合のイベント記録サブシステムによる報告に責任を有している。この報告は、必要があれば管理サービスレイヤ７０６に転送される。ＳＣＣ２＋ｔｏ ＳＥＳガスケット７０４は、構成及び維持アプリケーションからのＳＣＣ２＋コマンドのトランスレートと、エンクロージャ・サービスプロセスに対応する１つ以上のＳＥＳコマンドへのこれのトランスレートに責任を有する。これにより、アプリケーション・クライアントはＪＢＯＤ構成の仕様を知る必要がなくなる。
【０１３６】
（１）ＳＥＳイベントモニタ
ＳＥＳイベントモニタ７０２は、エンクロージャ２２２のサービスプロセス・ステータスの変化に関する報告を、管理サービスレイヤ７０６に戻す。ステータス情報はイベント記録サブシステムによって報告される。ＳＥＳイベントモニタ７０２は、エンクロージャ・ステータス・ページを要求する診断結果読み出しコマンドを実行して、各エンクロージャプロセスを断続的にポーリングする。診断結果読み出しコマンドは、ＩＯＮ物理デバイスディスクドライバ５００が提供するＳＣＳＬｉｂインターフェース５１４を介して送信される。報告されるステータスには、下の表ＶＩＩＩのステータス項目が含まれる。
【０１３７】
【表８】
0004567125.tif 000009
【０１３８】
ＳＥＳイベントモニタ７０２は、起動すると、エンクロージャに含まれる各要素４０２−４２４のステータスを読み出す。このステータスは現在のステータスである。ステータスの変化を検知すると、現在のステータスから変化した各ステータスの報告が管理サービスレイヤ７０６に戻される。そして今度は、この新しいステータスが現在のステータスになる。例えば、ファン要素の現在のステータスがＯＫで、ステータス変化によりエレメントの状態がファン障害になった場合、このイベントはファンの故障を示すものとして報告される。別のステータス変化がエレメントの未インストールを示す場合、このイベントはファンがエンクロージャから取り外されたことを示すものとして報告される。さらに別のステータス変化がファン要素のＯＫであることを示す場合、このイベントは、ファンがホットプラグされ、正常に動いていることを示すものとして生成される。
【０１３９】
（ａ）  その日の第一の処理
ＳＥＳイベントモニタ７０２は、ＩＯＮ物理ディスクドライバ５００の初期化成功の後で起動する。起動後、ＳＥＳイベントモニタ６０２は、ＪＢＯＤ及びＳＣＳＩ構成モジュール５１６を読み出して、ディスクデバイスとエンクロージャサービスデバイスの相互関係、デバイスのアドレスを確認する。次に、各エンクロージャ・ステータス・デバイスのステータスを読む。そして、すべてのエラー状態及び失われている要素に関してイベントを生成する。これらのステップが終了すると、そのステータスが現在のステータスになり、ポーリングが開始される。
【０１４０】
（２）  ＳＣＣ２＋ｔｏ ＳＥＳガスケット
ＳＣＣ２＋は、ＩＯＮ２１２が仮想及び物理デバイスの構成と管理に使用するプロトコルである。ＳＣＣ２＋のプラス（＋）は、ＳＣＣ２によるＩＯＮ２１２デバイス及びコンポーネントの完全な管理と、ＳＣＣ２が定義するコマンドのＳＥＳに対する一貫したマッピングを可能にするための追加を意味する。
【０１４１】
サービスレイヤ７０６は、ＳＣＣ２メンテナンス・イン及びメンテナンス・アウトのコマンドを通じて、ＪＢＯＤエンクロージャ２２２要素をアドレスする。
以下のセクションでは、コンポーネントのステータスの構成、制御、報告に関するメカニズムを提供するサービス・アクションについて説明する。これらのコマンドはそれぞれ、一連の診断送信及び診断結果受領のＳＣＳＩコマンドとしてＩＯＮ２１２に導入される。
【０１４２】
コンポーネントの構成は以下のサービス・アクションを使用して実行される。
【０１４３】
コンポーネント・デバイス追加−コンポーネント・デバイス追加コマンドはシステム内でのコンポーネント・デバイスの構成と、ＬＵＮアドレスの定義に使用する。ＬＵＮアドレスは、ＳＥＳ構成ページのコンポーネントの位置に基づいて、ＩＯＮ２１２が割り当てる。このコマンドに続いて、ＬＵＮ割り当ての結果を入手するために、コンポーネント・デバイス報告サービス・アクションが実行される。
【０１４４】
コンポーネント・デバイス報告−コンポーネント・デバイス・ステータス報告サービス・アクションは、コンポーネント・デバイスに関する完全なステータスをレトリーブするためのベンダー固有コマンドである。ＳＥＳは、各要素タイプのステータスを４バイトで提供する。この新しいコマンドが必要なのは、ステータス報告及びコンポーネント・デバイス報告サービス・アクションがステータス情報に１バイトしか割り当てず、既定のステータスコードがＳＥＳ標準で定義されるものと競合するからである。
【０１４５】
コンポーネント・デバイス接続−コンポーネント・デバイス接続は、一つ以上のユニットを論理的に特定のコンポーネント・デバイスに接続することを要求する。このコマンドは、ボリュームセットと、ファン、電源など、それに従属するコンポーネント・デバイスの論理関係を形成するのに使われることがある。
【０１４６】
コンポーネント・デバイス交換−コンポーネント・デバイス交換サービス・アクションは、あるコンポーネント・デバイスの他のものとの交換を要求する。
【０１４７】
コンポーネント・デバイス除去−周辺機器デバイス／コンポーネント・デバイス除去サービス・アクションは、システム構成からの周辺機器又はコンポーネント・デバイスの除去を要求する。論理ユニットを接続しているコンポーネント・デバイスを除去する場合、このコマンドは状況チェックで終了する。感知キーは不当な要求で、追加感知修飾子の障害論理ユニットの除去がついている。
【０１４８】
コンポーネントのステータスその他の情報は以下のサービス・アクションによって入手する。
【０１４９】
コンポーネント・ステータス報告−コンポーネント・デバイス・ステータス報告サービス・アクションは、コンポーネント・デバイスに関する完全なステータス情報をレトリーブするためのベンダー固有コマンドである。ＳＥＳは各要素タイプのステータスを４バイトで提供する。ステータス報告及びコンポーネント・デバイス報告サービス・アクションはステータス情報に１バイトしか割り当てず、既定のステータスコードはＳＥＳ標準で定義されるものと競合する。そのため、この新しいコマンドが必要になる。
【０１５０】
ステータス報告−ステータス報告サービス・アクションは、選択した論理ユニットのステータス情報を要求する。各論理ユニットの一つ以上のステータスが戻される。
【０１５１】
コンポーネント・デバイス報告−コンポーネント・デバイス報告サービス・アクションは、ＪＢＯＤ内のコンポーネント・デバイスに関する情報を要求する。
ＬＵＮ記述子の順序リストが戻され、ＬＵＮアドレス、コンポーネントタイプ、全体のステータスの報告が行われる。このコマンドは、コンポーネント・デバイス追加サービス・アクションが割り当てるＬＵＮアドレスを判断する初期構成プロセスの一部として利用される。
【０１５２】
コンポーネント・デバイス接続報告−コンポーネント・デバイス接続報告サービス・アクションは、特定のコンポーネント・デバイスに接続している論理ユニットに関する情報を要求する。コンポーネント・デバイス記述子のリストが戻され、それぞれにＬＵＮ記述子のリストが含まれる。ＬＵＮ記述子は、対応するコンポーネントに接続する各論理ユニットのタイプ及びＬＵＮアドレスを特定する。
【０１５３】
コンポーネント・デバイス識別子報告−コンポーネント・デバイス識別子報告サービス・アクションは、特定のコンポーネント・デバイスの位置を要求する。
コンポーネントの位置を示すＡＳＣＩＩ値が戻される。この値は、コンポーネント・デバイス識別子設定サービス・アクションによって事前に設定されている必要がある。
【０１５４】
コンポーネントの管理は以下によって実行される。
【０１５５】
コンポーネント・デバイス命令−コンポーネント・デバイス命令は、電源のオンオフといった制御命令をコンポーネント・デバイスに送るのに使用する。特定のデバイスに適用されるアクションは、コンポーネントタイプによって異なり、ベンダーに固有である。
【０１５６】
コンポーネント・デバイス中断−コンポーネント・デバイス中断サービス・アクションは、特定のコンポーネントを中断（無作動）状態にする。
【０１５７】
Ｃ．  インターコネクト・ファブリック
１．  概要
大量のデータ移動を可能にするために、本発明のファブリックに接続するストレージモデルは、データのコピー及び割り込み処理コストに関するＩ／Ｏ性能問題に取り組まなくてはならない。本発明では、データのコピー、割り込み、フロー制御問題について、手法を独自に組み合わせて取り組んでいる。ほとんどのネットワークで使用されている目的地ベースのアドレス・モデルとは異なり、本発明では送信者ベースのアドレスモデルを使用しており、ここでは送信者が、データをファブリックに送信する前に、目的地のターゲット・バッファを選択する。
送信者ベース・モデルでは、目的地は送信者に対して、メッセージの送信前に、メッセージを送信できる目的地アドレスのリストを発信する。メッセージを送るために、送信者はまずリストから目的地バッファを選択する。これが可能なのは、ターゲット側アプリケーションがこれらのバッファのアドレスを先にＯＳに与え、ターゲットのネットワーク・ハードウェアが使用できるようにしており、そのため、ネットワーク・ハードウェアは、ＤＮＡ作業によって、コピーせずにデータを正しいターゲットバッファに転送するための十分な情報を持っているからである。
【０１５８】
有益な点はあるものの、送信者ベースのアドレスにはいくつかの問題も存在する。まず、送信者ベースのアドレスでは、ファブリック全体の保護領域が目的地から送信者を含むまでに拡大し、全般的な分離が失われ、データのセキュリティと完全性の問題が持ち上がる。純粋な送信者ベースのアドレスでは、メモリアドレスを送信者に解放し、目的地は送信者を信頼する必要があり、これは高可用性システムにおける大きな問題である。例えば、目的地ノードが目的地アドレスのリストを送信者に与えたとする。送信者がこのすべてのアドレスを使用する前に、目的地ノードがクラッシュし、リブートを行う。すると送信側は、すでに有効ではなくなったアドレスバッファのセットを持つことになる。目的地では、このアドレスが別の目的で使用されているかもしれない。これのいずれかにメッセージを送信すると、目的地で重要なデータが破壊されるという深刻な結果につながる可能性がある。
【０１５９】
二番目に、送信者ベースのアドレスの導入には、ネットワークが協力して、データのＤＭＡを開始する前にメッセージから目的地アドレスの抽出を行う必要があるが、ほとんどのネットワーク・インターフェースでは、こういった作業を行うように設計されていない。
【０１６０】
必要なアドレスモデルは、送信者ベースモデルの利点を含み、問題点を回避するものである。本発明では、ＢＹＮＥＴに基づくインターコネクト・ファブリックを使用する独自の「プット・イット・ゼア」（ＰＩＴ）プロトコルを利用したハイブリッド・アドレスモデルによって、この問題を解決している。
【０１６１】
２．  ＢＹＮＥＴとＢＹＮＥＴインターフェース
ＢＹＮＥＴには、本発明の導入に役立つ三つの重要な属性がある。
【０１６２】
まず、ＢＹＮＥＴは本質的にスケーラブルである−追加接続や帯域幅の追加を容易に実施でき、システム内のすべての存在をすぐに利用できる。これは、追加接続を行っても帯域幅を追加できない他のバス指向のインターコネクト技術とは対照的である。他のインターコネクトと比較すると、ＢＹＮＥＴはファン・アウト（単一のファブリックで利用できるポート数）を増加できるだけでなく、ファン・アウトによって増加する二分帯域幅も有している。
【０１６３】
二番目に、ＢＹＮＥＴはソフトウェアによって、アクティブ・メッセージ・インターコネクトに拡張できる−ユーザ（計算リソース１０２及びストレージリソース１０４）の指示の下で、ＢＹＮＥＴは作業の中断を最低限に抑えながら、ノード間でデータを移動できる。ＤＭＡを使用して、データを既定のメモリアドレスに直接移動し、必要のない割り込みや内部でのデータコピーを回避する。この基本テクニックは、より小さなデータブロックを大きなインターコネクト・メッセージに多重化することで、こうしたデータブロックの移動に最適な形に拡張できる。それぞれのデータブロックは、修正したＤＭＡベースのテクニックを使って処理することが可能で、ノードの運用上の有効性を失わずにインターコネクトの利用法を最適化できる。
【０１６４】
三番目に、ＢＹＮＥＴは複数のファブリックを提供する構成にできるため、トラフィック整形を利用して、さらにインターコネクトを最適化できる。これは基本的にはＢＹＮＥＴソフトウェアが提供するメカニズムで、特定のインターコネクトチャンネル（ファブリック）を特定の種類のトラフィックに割り当てて、例えば、使用者の非常に多い共有チャンネルにおいて、長いメッセージと短いメッセージのランダムな組み合わせによって生じる干渉の減少などを行う。トラフィック整形はＢＹＮＥＴによって可能になるもので、予測されるトラフィックパターンのためにユーザが選択することもできる。
【０１６５】
図８は、ＢＹＮＥＴとホスト側インターフェース８０２の図である。ＢＹＮＥＴホスト側インターフェース８０２には、回線が作成されたときに常にチャンネルプログラムを実行するプロセッサ８０４が含まれる。チャンネルプログラムは、各ノードの送信側インターフェース８０６と目的地インターフェース８０８の両方で、このプロセッサ８０４が実行する。送信側インターフェース８０６ハードウェアは、回線の作成を制御するダウン・コールに従って作成されたチャンネルプログラムを実行し、データを送信し、その後この回線をシャットダウンする。目的地側インターフェース８０８ハードウェアはは、データを目的地のメモリに伝達するためにチャンネルプログラムを実行し、回線を完成させる。
【０１６６】
ＢＹＮＥＴは、ネットワーク内のプロセッサとして稼働する計算ノード２００とＩＯＮ２１２をインターコネクトするネットワークで構成される。またＢＹＮＥＴは、入出力ポート８１４を持つ複数のスイッチノード８１０で構成される。
スイッチノード８１０は、ｇ（ｌｏｇｂＮ）以上のスイッチノードステージ８１２に配列される。ｂはスイッチノードの入出力ポートの合計数、Ｎはネットワーク入出力ポート８１６の合計数で、ｇ（ｘ）は引数ｘより大きな最少の整数を得るための切り上げ関数である。したがって、スイッチノード８１０は、任意のネットワーク入力ポート８１６とネットワーク出力ポート８１６の間に複数のパスを提供して、誤り許容を拡張し、競合を減少する。さらにＢＹＮＥＴは、ネットワーク全体のメッセージ伝送管理のために、ネットワークの最高スイッチノードステージに沿った跳ね返り面８１８にある複数の跳ね返り点で構成される。跳ね返り点は、ネットワークを通じてバランスメッセージをロードするスイッチノード８１０と、受領するプロセッサへメッセージを方向付けするスイッチノード８１０を、論理的に区別する。
【０１６７】
計算ノード２００やＩＯＮ２１２などのプロセッサは、論理的に独立した既定のプロセッサのサブセットで構成される１つ以上のスーパークラスタに区分できる。プロセッサ間の通信は２地点間方式又はマルチキャストで行われる。マルチキャストモードの通信では、単一のプロセッサは他のすべてのプロセッサ又はスーパークラスタにメッセージを同報できる。マルチキャスト・コマンドは異なるスーパークラスタ内で同時に発生できる。送信プロセッサは、転送チャンネルを通じてすべてのプロセッサ又はプロセッサの集団に伝達されるマルチキャスト・コマンドを発信する。マルチキャスト・メッセージは、跳ね返り面８１８の特定の跳ね返り点に向けられ、スーパークラスタ内のプロセッサへの経路が定まる。
特定の跳ね返り点を通過するマルチキャスト・メッセージを一度に一つだけにするため、これはネットワークのデッドロックを防ぎ、異なるスーパークラスタへのマルチキャスト・メッセージがお互いに干渉するのを防止する。マルチキャスト・メッセージを受領したプロセッサは、例えば、返信チャンネルを通じた現在のステータスの伝送などによって返答する。ＢＹＮＥＴは返答を様々な形で組み合わせる役割を果たす。
【０１６８】
ＢＹＮＥＴは現在、バンド内メッセージとバンド外メッセージという二つの基本タイプのメッセージをサポートしている。ＢＹＮＥＴバンド内メッセージは、目的地ホストのメモリのカーネルバッファ（又はバッファ）にメッセージを伝達し、回線を完成させ、アップ・コール割り込みを通知する。ＢＹＮＥＴバンド外メッセージでは、回線メッセージのヘッダ・データが、ＢＹＮＥＴドライバの割り込み操作子に、受領中の残りの回線データ処理に使用するチャンネルプログラムを作成させる。どちらのタイプのメッセージにおいても、チャンネルプログラムの成功又は失敗は、ＢＹＮＥＴ返信チャンネル上の小さなメッセージによって送信者に戻される。この返信チャンネル・メッセージは、送信者のチャンネルプログラムによる回線シャットダウン作業の一部として処理される（返信チャンネルは、ＢＹＮＥＴ回線の定帯域幅の返信パスである）。回線がシャットダウンされた後、目的地でアップ・コール割り込みが（選択的に）通知され、新しいメッセージの到着を知らせる。
【０１６９】
ＢＹＮＥＴバンド外メッセージの利用は、チャンネルプログラムがまず作成され、次に実行されるのを送信側が待つため、最も望ましい構成ではない。ＢＹＮＥＴバンド内メッセージでは、送信者がアプリケーション・バッファを直接ターゲットにすることができないため、データのコピーが必要になる。この問題を解決するために、本発明ではＢＹＮＥＴハードウェアを独自の方法で利用している。目的地側インターフェース８０８にデータ処理に必要なチャンネルプログラムを作成させる代わりに、送信インターフェース８０６側が送信側と目的地側の両方のチャンネルプログラムを作成する。送信側チャンネルプログラムは、メッセージの一部として、目的地側が実行できる非常に小さなチャンネルプログラムを転送する。このチャンネルプログラムには、目的地側がターゲット・アプリケーション・スレッドの特定の目的地バッファにデータをどのように移動するかが記述されている。このメッセージを伝達すべき目的地のスレッドを送信者が知っているため、このテクニックでは、送信側がメッセージを伝達する方法と場所の両方を制御可能で、目的地側の従来のアップ・コール処理の損傷をほとんど避けることができる。このＢＹＮＥＴメッセージの形式は有向バンドメッセージと呼ばれる。アクティブメッセージ・プロセス間通信モデルで使用されるアクティブメッセージ（データと、目的地でのメッセージ処理に使用する小さなメッセージ処理ルーチンを含む）とは異なり、本発明では、ＢＹＮＥＴ Ｉ／Ｏプロセッサが単純なチャンネルプログラムを実行するＢＹＮＥＴ有向バンドメッセージを使用する。アクティブメッセージでは普通はホストＣＰＵがアクティブメッセージ操作子を実行する。
【０１７０】
返信チャンネルの利用により、送信側インターフェースは、メッセージ伝達完了を知らせるための従来の割り込み方法を抑止できる。バンド外及び有向バンドメッセージの両方において、送信側の成功の表示はメッセージが目的地のメモリに確かに伝達されたことのみを示す。
【０１７１】
これは目的地ノードのメモリスペースにメッセージが確かに移動したことを保証するが、目的地アプリケーションによるメッセージの処理は保証しない。例えば、目的地のノードが機能のあるメモリシステムを持っていても、目的地のアプリケーション・スレッドがメッセージの処理を恒久的に妨げる可能性のある異常を持っているかもしれない。本発明では、メッセージの確実な処理を行うために、メッセージ処理の異常を検知し修正する、独立したいくつかの方法を採用している。本発明の通信プロトコルに関して、送信側でのメッセージ消失の検知には時間切れが利用されている。必要に応じて再送信が行われ、ソフトウェアやハードウェアの異常が検知された場合は復旧作業が開始される。
【０１７２】
本発明では、有向バンドメッセージを利用しながら、目的地の特定のターゲットへのメッセージ伝達を可能にし、正しいターゲット・アプリケーション・スレッド・バッファにメッセージを送信するために十分なデータを送信側に与えるメカニズムを可能にしなくてはいけない。本発明では、チケット・ベース認証スキムによって、これを実現している。チケットは偽造できないデータ構造で、所有者に権利を与える。本質的には、チケットは特定のリソースを使用する一度限りの許可又は権利である。本発明では、ＩＯＮ２１２は、チケットの分配によって、計算ノード２００へのサービスの分配を制御できる。加えて、チケットは、送信者ベースのフロー制御モデルを導入するための必要条件である特定のターゲットの指定を行う。
【０１７３】
Ｄ．  「プット・イット・ゼア」（ＰＩＴ）プロトコル
１．  概要
ＰＩＴプロトコルは、ＢＹＮＥＴ有向バンドメッセージ・プロトコルを使用したアクティブメッセージによってチケットとデータ・ペイロードを送信するチケット・ベース認証スキムである。ＰＩＴプロトコルは、チケット・ベース認証、送信者ベース・アドレス、デビット／クレジット・フロー制御、ゼロメモリコピー、アクティブメッセージを独自に組み合わせたものである。
【０１７４】
２．  ＰＩＴメッセージ
図９は、ＰＩＴヘッダ９０２とそれに続くペイロード・データ９０４を含む、ＰＩＴメッセージ又はパケット９０１の基本的な特徴を示す図である。ＰＩＴヘッダ９０２は、ＰＩＴ  ＩＤで構成されており、これは抽象化したターゲット・データバッファを表し、指定された特定のサイズのバッファにアクセスする権利を意味する期限付きチケットである。ＰＩＴ  ＩＤを所有する要素は、特定のバッファを使用する権利を持つ要素であり、ＰＩＴ  ＩＤ９０６はＰＩＴバッファを使用したときに放棄されなくてはいけない。目的地がＰＩＴメッセージを受領すると、ＰＩＴヘッダのＰＩＴ  ＩＤ９０６は、ＤＭＡ作業によってペイロードが運ばれるＢＹＮＥＴハードウェアに対して、ターゲットバッファの指定を行う。
【０１７５】
ＰＩＴプロトコルでのフロー制御は、送信者ベース・アドレスを使用したデビット／クレジット・モデルである。ＰＩＴメッセージの送信は、送信者のフロー制御デビットと目的地のフロー制御クレジットを意味する。別の言い方をすれば、デバイスがＰＩＴ  ＩＤ９０６をスレッドに送信した場合、スレッドにはそのアドレススペースのＰＩＴバッファがクレジットされる。デバイスがＰＩＴ  ＩＤ９０６を送信者に返信した場合、デバイスは権利の放棄又はＰＩＴ  ＩＤ９０６が指定するバッファの解放を行っている。デバイスがＰＩＴ  ＩＤ９０６によって抽象化された目的地のバッファにメッセージを送ると、デバイスはＰＩＴバッファに対する権利も放棄する。デバイスがＰＩＴ  ＩＤ９０６を受領すると、（そのＰＩＴ  ＩＤ９０６が、デバイスの返信しているＰＩＴ  ＩＤ９０６ではない限り）それは送信者のアドレススペースにあるＰＩＴバッファのクレジットになる。
【０１７６】
ヘッダ９０２の最上部は、ＰＩＴパケット９０１を処理するＢＹＮＥＴチャンネルプログラム９０８（送信者側と目的地側）である。その下は、ＰＩＴ  ＩＤチケットを伝送するための二つのフィールド、つまりクレジット・フィールド９１０とデビット・フィールド９１２である。デビット・フィールド９１２は、チャンネルプログラムを介して目的地ネットワークインターフェースによりペイロード・データが転送されるＰＩＴ  ＩＤ９０６を含んでいる。これがデビット・フィールドと呼ばれるのは、ＰＩＴ  ＩＤ９０６は送信者のアプリケーション・スレッドにとって借りになるからである（目的地のスレッドでは貸し）。クレジット・フィールド９１０は、送信者スレッドが目的地スレッドに対してＰＩＴバッファを転送する、又は貸す場所である。クレジット・フィールド９１０は通常、送信者スレッドが返信メッセージの送信を期待するＰＩＴ  ＩＤ９０６を有している。このクレジットＰＩＴの利用法は、ＳＡＳＥ（自己アドレス・スタンプ・エンベロープ）ＰＩＴと呼ばれる。コマンド・フィールド９１４は、ターゲットがペイロード・データに実行する作業を記述している（例えば、ディスク読み出し又は書き込みコマンド）。引数フィールド９１６は、コマンドに関するデータである（例えば、読み出し又は書き込み作業を行うディスクのディスク及びブロック番号）。シーケンス番号９１８は、各ソース及び目的地ノードのペアに固有の単調増加整数である（ノードの各ペアは、方向ごとに一つのシーケンス番号を持っている。）。長さフィールド９２０はＰＩＴペイロード・データの長さをバイトで特定する。フラグ・フィールド９２２は、ＰＩＴメッセージの処理を修正する様々なフラグを含んでいる。一例として、メッセージ複製フラグがある。
これは、失われた可能性のあるメッセージの再送信を行い、イベントの二回以上の処理を防ぐときに使用される。
【０１７７】
システムが最初に起動されたとき、どのノードも他のノードのためのＰＩＴ  ＩＤ９０６を持っていない。ＢＹＮＥＴソフトウェアドライバは、ＰＩＴの第一のオープン・プロトコルが完了するまで、すべての有向バンドメッセージの伝達を防止する。ＰＩＴ  ＩＤ９０６の分配は、計算ノード２００のアプリケーション・スレッドが、ＩＯＮ２１２上の任意の仮想ディスクデバイスを最初にオープンにした際に開始される。第一のオープン中、ＩＯＮ２１２と計算ノード２００は交渉の段階に入り、ここで作業パラメータの交換が行われる。第一のオープン・プロトコルの一部はＰＩＴ  ＩＤ９０６の交換である。ＰＩＴ  ＩＤ９０６は、二つ以上のバッファを、送信者の収集ＤＭＡ及び目的地の分散ＤＭＡの両方をサポートするインターフェースとして指定できる。このアプリケーションは、他のすべてのノードにある任意のアプリケーションに対して、ＰＩＴ  ＩＤ９０６の配布を自由に行える。
【０１７８】
この計算ノード２００とＩＯＮ２１２が交換するＰＩＴバッファのサイズと数は、調整可能な値である。デビット及びクレジットＰＩＴ  ＩＤ９０６（デビット・フィールド９１２とクレジット・フィールド９１０にあるもの）は、システムのフロー制御モデルの基盤を形成する。送信者は目的地に対して、クレジットされたＰＩＴ  ＩＤ９０６と同じ数しかメッセージを送信できない。これによって、特定のホストが送信できるメッセージの数は制限される。また、各ノードは自分のＰＩＴ  ＩＤ９０６プールを持っており、各送信者が消費できるのは多くとも割り当てられたＰＩＴ  ＩＤ９０６のみであるという点で公平性を確保できる。
【０１７９】
ＩＯＮ２１２は計算ノード２０２に対して発行したＰＩＴチケットのプールを管理する。計算ノード２０２に対するＰＩＴ  ＩＤ９０６の初期割り当ては、第一のオープン・プロトコル中に行われる。分配されるＰＩＴ  ＩＤ９０６の数は、ＩＯＮ２１２を同じ時期に利用する同時稼働の計算ノード２００の数の予測とＩＯＮ２１２内のメモリリソースに基づいている。これは予測に過ぎないため、ＰＩＴプールのサイズも稼働中にＩＯＮ２１２によって動的に調整される。このＰＩＴリソースの再配布は、複数の計算ノード２００からの要求に対する公平な対応を確保するのに必要である。
【０１８０】
稼働計算ノード２００へのＰＩＴ再割り当ては以下のように行われる。計算ノード２００は絶えずＩ／Ｏ要求を行っているため、完了したＩ／ＯメッセージのＰＩＴクレジットのフローを制御することで、ＰＩＴリソースが再配布される。
適切なレベルになるまで、ＩＯＮ２１２の完了によるＰＩＴクレジットは送られない（計算ノード２００のＰＩＴプールが減る）。すでにＰＩＴ割り当てを持っているが計算ノード２００が稼働していない（そしてリソースが動かない）場合、状況はより複雑になる。この場合、ＩＯＮ２１２は稼働していない計算ノード２００それぞれにＰＩＴ（又はＰＩＴ  ＩＤのリスト）を無効にするメッセージを送ることができる。稼働していない計算ノード２００が反応しない場合、ＩＯＮ２１２はそのノードのＰＩＴ  ＩＤをすべて無効にすることができ、その後で他の計算ノード２００にＰＩＴ  ＩＤを再分配できる。稼働していない計算ノード２００が再割り当てされたＰＩＴを使おうとすると、その計算ノード２００は第一のオープン・プロトコルに強制的に戻される。
【０１８１】
計算ノード２００へのＰＩＴ割り当ての増加は以下のように行われる。ＰＩＴ割り当てメッセージを使用して、新しく割り当てられたＰＩＴ  ＩＤを任意の計算ノードに送ることができる。代わりのテクニックでは、Ｉ／Ｏ完了メッセージごとに二つ以上のＰＩＴクレジットを送信する。
【０１８２】
３．  ＰＩＴプロトコルの働き−ディスクの読み出しと書き込み
ＰＩＴプロトコルを説明するために、計算ノード２００がストレージディスク２２４のＩＯＮ２１２からの読み出し作業を要求した場合ついて論じる。ここでは、第一のオープンはすでに行われ、計算ノード２００及びＩＯＮ２１２の両方に十分な数の自由なＰＩＴバッファが存在すると仮定する。アプリケーション・スレッドは読み出しシステムコールを行い、ディスクデータを転送するバッファのアドレスを、計算ノードの高レベルＳＣＳＩドライバ（ＣＮシステムドライバ）に渡す。ＣＮシステムドライバは、この要求を含むＰＩＴパケットを作成する（仮想ディスク名、ブロック番号、データの長さが含まれる）。ＣＮシステムドライバの上半分が、デビット及びクレジットＰＩＴ  ＩＤフィールド９１０、９１２に情報を与える。このデビットＰＩＴフィールド９１２は、この読み出し要求が送られる目的地ＩＯＮ２１２のＰＩＴ  ＩＤ９０６である。これは読み出し要求であるため、ＩＯＮ２１２は、Ｉ／Ｏ完了パケットを作成する時に、アプリケーションのバッファ（読み出しシステムコールの一部として提供されたもの）を指定する方法が必要になる。ＰＩＴパケットは送信者ベース・アドレスを利用しているため、ＰＩＴ  ＩＤ９０６を持っているならば、ＩＯＮ２１２だけがこのアプリケーション・バッファをアドレスできる。アプリケーション・バッファは通常のＰＩＴプールの一部ではないため、バッファはメモリに固定され、バッファのためにＰＩＴ  ＩＤ９０６が作成される。読み出し要求には、ディスク作業からの返信ステータスも必要なため、返信ステータスを含むためにＰＩＴの分散バッファが作成される。読み出しＰＩＴパケットの一部として、ＳＡＳＥ  ＰＩＴがクレジット・フィールドに送られる。ＰＩＴパケットは出力待ち行列に置かれる。ＰＩＴパケットを送るときに、ＢＹＮＥＴインターフェース８０２は、これをDMA作業によって送信者側から移動し、インターコネクト・ファブリック１０６を通じて転送する。目的地側のＢＹＮＥＴインターフェース８０８では、ＰＩＴパケットが到着すると、ＢＹＮＥＴチャンネルプロセッサ８０４によるＰＩＴチャンネルプログラムの実行が開始される。ホスト側インターフェース８０２のＢＹＮＥＴチャンネルプロセッサ８０４は、デビットＰＩＴ  ＩＤ９０６を抽出し、ＩＯＮ２１２上に端点を置く。チャンネルプログラムはバッファ・アドレスを抽出し、インターフェースＤＭＡエンジンがペイロード・データをＰＩＴバッファに直接移動するのをプログラムする−こうして、ＰＩＴプロトコルがゼロデータ・コピーの意味を提供できるようにする。ＢＹＮＥＴインターフェース８０２はＩＯＮ２１２上の受領アプリケーションに割り込みを通知する。計算ノード２００では割り込みは起こらない。返信チャンネルメッセージが転送の失敗を示すと、失敗の理由に応じて、Ｉ／Ｏが再試行される。数回の試行後、ＩＯＮエラー状況が入力され（本文書中のＩＯＮ２１２復旧及びフェールオーバ作業の詳細を参照）、計算ノード２００はダイポールのバディＩＯＮ２１４に要求を処理させようと試みる。メッセージが確実に目的地ノードのメモリに伝達されると、ホスト側は再送信期限を（Ｉ／Ｏサービス時間の最悪のケースより長く）設定し、ＩＯＮ２１２のメッセージ処理成功を確実にする。このタイマが時間切れになると、計算ノード２００はＩＯＮ２１２にＰＩＴメッセージを再送信する。Ｉ／Ｏがまだ進行中の場合は、複製した要求は単純に却下され、そうでない場合は再送信した要求は通常通り処理される。選択的に、プロトコルは、期限切れタイマをリセットし、Ｉ／Ｏの失敗によるアプリケーションの被害を避けるために、再送信した要求の明確な通知を求めることもできる。
【０１８３】
図１０は、ＩＯＮ２１２機能モジュールのブロック図である。ＩＯＮ２１２及び２１４への入力は、データライン１００２及び１００４と制御ライン１００６である。ＩＯＮ２１２の各モジュールは、制御ライン１００６と連絡する制御モジュール１００８で構成される。制御モジュール１００８はデータライン１００２からコマンドを受け取り、モジュール制御機能を提供する。システム機能モジュール１０１０は本文書で説明するＩＯＮ機能を実施する。ＩＯＮ２１２及び２１４は、ファブリックモジュール１０２０、キャッシュモジュール１０１４、データ復元モジュール１０１６、ストレージモジュール１０１８で構成される。これら各モジュールは、制御モジュール、データライン１００２及び１００４でのデータの挿入とレトリーブを行う仕事インジェクタ１０２０、データの通過を禁止するデータフェンス１０２２で構成される。
【０１８４】
ＰＩＴ読み出し要求は、ＩＯＮ２１２に送られた後、ＩＯＮキャッシュモジュール１０１４の仕事インジェクタに転送される。仕事インジェクタは要求をＩＯＮキャッシュモジュール１０１４に挿入し、ＩＯＮキャッシュモジュールはデータがキャッシュされるかデータのバッファが割り当てられた場合、データを直接戻し、要求をＩＯＮストレージモジュール１０１８に渡す。ＩＯＮストレージモジュール１０１８は、この要求を一つ（又は複数）の物理ディスク要求にトランスレートし、要求を該当するディスクドライバ２２４に送る。ディスク読み出し作業が完了すると、ディスクコントローラは割り込みを通知し、ディスク読み出しの完了を知らせる。ＩＯＮ仕事インジェクタはＩ／Ｏ完了ＰＩＴパケットを作成する。デビットＰＩＴ  ＩＤ（デビット・フィールド９１２に格納）は、読み出し要求のＳＡＳＥ  ＰＩＴ（アプリケーションがディスクデータを置きたい場所）からのクレジットＰＩＴ  ＩＤ（クレジット・フィールド９１０に格納）である。クレジットＰＩＴ  ＩＤは、計算ノード２００がこの要求を送ったＰＩＴＩＤと同じか、バッファがフリーでない場合は置き換えたＰＩＴ  ＩＤである。このクレジットＰＩＴは計算ノードに、未来の要求を送るためのクレジットを渡す（この現在のＰＩＴ要求が完了したばかりなので、計算ノード２００のＩＯＮ２１２に対する待ち行列は深さが１つ増える）。ＰＩＴを処理した後、ＩＯＮ２１２がＰＩＴクレジットを戻さない理由は三つある。一つは、ＩＯＮ２１２が計算ノード２００からの未処理待ち行列の数を減らしたい。二つ目の理由は、ＩＯＮ２１２がＰＩＴクレジットを別の計算ノード２００に再分配したい。三つ目の理由は、単一のＰＩＴパケットに複数の要求が含まれている（本文書のスーパーＰＩＴパケットの解説を参照）。コマンドフィールド９１４は読み出し完了メッセージで、引数はディスクドライブ読み出し作業からの返信コードである。このＰＩＴパケットはＢＹＮＥＴインターフェース７０２への待ち行列に入れられ、計算ノード２００に送り返される。このときＢＹＮＥＴハードウェアは、このＰＩＴパケットをＤＭＡによって計算ノード２００に移動する。これにより、計算ノード２００ＢＹＮＥＴチャンネルプログラムによるデビットＰＩＴ  ＩＤ９１２の抽出が始まり、ターゲットＰＩＴバッファ（ここではアプリケーションの固定されたバッファ）へのDMAが開始する前にこれを確認する。DMAが完了すると、計算ノードＢＹＮＥＴハードウェアは割り込みを開始し、アプリケーションにディスク読み出しが完了したことを知らせる。ＩＯＮ２１２では、ＢＹＮＥＴドライバがバッファをキャッシュシステムに戻す。
【０１８５】
書き込み要求の作業も、読み出し作業と同じように行われる。アプリケーションが計算ノードの高レベルドライバを呼び出し、データ、仮想ディスク名、ディスクブロック番号、データの長さを含むアドレスを渡す。計算ノードの高レベルドライバは、目的地ＩＯＮ２１２のＰＩＴ  ＩＤ９０６を選択し、このデータを使ってＰＩＴ書き込み要求を作成する。ＳＡＳＥ  ＰＩＴには、ＩＯＮ２１２からの書き込み作業の返信ステータスのみが含まれる。ＩＯＮ２１２では、ＰＩＴパケットが到着すると割り込みが通知される。この要求は、ＰＩＴ読み出し作業と同じ形で処理される。書き込み要求はキャッシュルーチンに渡され、これがその後データをディスクに書き込む。ディスク書き込みが完了すると（又はデータがＩＯＮノード２１２及び２１４の書き込みキャッシュに安全にストアされると）、Ｉ／Ｏ完了メッセージが計算ノード２００に送り返される。ＩＯＮ２１２が作動中の書き込みキャッシュを動かしているときは、要求の送られたＩＯＮ２１２ではなく、ダイポールのもう一方のＩＯＮ２１４が、Ｉ／Ｏ完了メッセージを戻す。これについては、本文書のバミューダトライアングルプロトコルに関する場所でさらに説明する。
【０１８６】
４．  失効ＰＩＴ  ＩＤと復旧問題
第一のオープン中のＰＩＴ  ＩＤの交換は、ハードウェア又はソフトウェアの以上によって生じた失効ＰＩＴ  ＩＤ９０６を無効にするメカニズムである。ＩＯＮ２１２と計算ノード２００がＰＩＴ  ＩＤを交換し、突然ＩＯＮ２１２がクラッシュした状況を考える。ＰＩＴ  ＩＤ９０６はメモリに固定されたターゲットバッファを意味しており、無効化しない限り、リブートしたＩＯＮ２１２又は計算ノード２００の未処理ＰＩＴ  ＩＤ９０６は、有効でなくなった又は失効したＰＩＴ  ＩＤの影響で、ソフトウェアの完全性に大きな問題を引き起こす可能性がある。ＢＹＮＥＴハードウェアと有向バンドメッセージは、失効ＰＩＴ  ＩＤ９０６を無効化する基本メカニズムの提供をサポートする。
【０１８７】
第一のオープンプロトコルの終わりに、両者は計算ノード高レベルＳＣＳＩドライバに、ＰＩＴ  ＩＤ９０６が分配されるホストのリストを渡さなくてはいけない。別の言い方をすれば、ホストは計算ノード高レベルＳＣＳＩドライバに、ＰＩＴパケットを受け取るホストのリストを渡している。計算ノード高レベルドライバは、このリストを利用して、有向バンドメッセージの配布を管理する表を作成する。この表では、有向バンドメッセージを相互に送ることのできるＩＯＮ２１２ペアを指定する（この表では片道ＰＩＴメッセージフローも指定する）。
計算ノード高レベルドライバは、この表をＢＹＮＥＴ構成プロセスの一部として、ホスト内部で（ドライバ専用データとして）保存する。このリストからのホストの追加や減少は、計算ノード高レベルドライバへの簡単な通知メッセージにより、ＰＩＴプロトコルが常に行える。ノードの故障、シャットダウン、無応答が生じた場合、ＢＹＮＥＴハードウェアはこれを検知し、ファブリック上の他のすべてのノードに通知する。キャッシュノード上のＢＹＮＥＴホストドライバはこの通知に反応し、有向バンドホスト表から、このホストへの参照をすべて削除する。このアクションによって、そのホストが他のホストに分配したＰＩＴ  ＩＤ９０６をすべて無効化する。これは、以前に配布されたＰＩＴパケットからノードを保護する鍵である。そのホスト上の計算ノード高レベルドライバが再構成されるまで、ＢＹＮＥＴはそのホストにすべてのメッセージを届けない。第一の再構成が行われた後も、ローカルＰＩＴプロトコルが知らせるまで、ＢＹＮＥＴはこの新たに再起動又は再構成されたホストへの有向バンドメッセージの送信をまったく認めない。これにより、第一のオープン・プロトコルによって適切なＰＩＴプロトコルの初期化が行われるまで、失効ＰＩＴパケットの配布から保護することができる。
【０１８８】
ホストが有向バンドメッセージを（無効化されたＰＩＴ  ＩＤ９０６を使用する）無効ホストに送ろうとすると、送信側の計算ノード高レベルドライバは、送信者へのエラー状態と共にこのメッセージを拒否する。この拒否により、二つのノード間で第一のオープン・ハンドシェークが開始される。第一のオープン・ハンドシェークが完了した後で、（計算ノード２００から見て）未処理になっているＩＯＮ２１２のＩ／Ｏ作業が再送信されることになる。しかし、これがウォーム・リスタートでない限り、ＩＯＮ２１２は長い間ダウンしている可能性が高く、未処理のＩ／Ｏ作業はフェールオーバ処理の一部として再起動され、ダイポール内の他のＩＯＮ２１２に送られると思われる（詳細はＩＯＮ失敗処理のセクションを参照）。クラッシュしたノードが計算ノード２００の場合、第一のオープンをすでに行った計算ノード２００の第一のオープン要求がＩＯＮ２１２に予期せず到着すると、これにより、ＰＩＴ  ＩＤ復旧作業が開始される。ＩＯＮ２１２は計算ノード２００にクレジットされたＰＩＴ  ＩＤ９０６をすべて無効化する（又は実際は古いものの再発行のみを行う）。計算ノード２００の未処理のＩ／Ｏ作業はすべて完了できる（ただしノードを再起動する時間が極度に短くない限り、このイベントが起こる可能性は低い）。使用しているＳＡＳＥ  ＰＩＴは失効し、完了メッセージは拒否されることになる（そして、Ｉ／Ｏ要求を発行したアプリケーションスレッドは存在しなくなる）。
【０１８９】
５．  スーパーＰＩＴ（ＳＰＩＴ）−小Ｉ／Ｏ性能の改善
ＰＩＴプロトコルは通常のＳＣＳＩコマンドを利用することができる。本発明の中核は通信ネットワークであり、ストレージ・ネットワークではないため、システムはネットワーク・プロトコルを使用して、ストレージ・モデルが可能にする性能を改善する。アップ・コールを扱う際のオーバーヘッド処理は、小Ｉ／Ｏ要求に支配される仕事量にとって性能の壁を意味する。小Ｉ／Ｏ性能を改善する方法はいくつか存在している。一つは、割り込み処理コードのパスの長さを改善することである。二つ目は、デバイスドライバで採用されているものと同様のテクニックを利用して、複数の割り込みのベクトルを単一の割り込み操作子の呼び出しに縮小することである。三つ目は、個々のＩ／Ｏ作業の数を減らし、単一の要求にクラスタ化する（コンボイする）ことである。ソース及び目的地の物理リンクのＭＴＵサイズの違いの影響で、出入りするデータフローを再パッケージ化する必要のあるノードには、データが集まる傾向がある。この問題は、送信側と目的地側ネットワークの速度の不一致（特に目的地ネットワークが遅くなる）により、さらに悪化する。こうしたノードは、絶えず目的地からのフロー制御の対象になる。その結果、バーストによりルータから流出するデータが生じる。これはデータ・コンボイと呼ばれる。
【０１９０】
本発明では、データ・コンボイを、ＩＯＮ２１２及び計算ノード２００においてアップ・コールが生成した割り込みの数を減らすテクニックとして利用する。
説明のために、ＩＯＮ２１２から計算ノード２００へのデータフローを考える。
本発明で使用するフロー制御のデビット／クレジット・モデルでは、Ｉ／Ｏ要求は計算ノード２００とＩＯＮ２１２の両方で待ち行列に加わる。待ち行列はＩＯＮ２１２にストアされるＰＩＴパケットで始まり、これをすべて使うと、計算ノード２００に戻って継続する。これはオーバーフロー状態と呼ばれる。通常、オーバーフローは、ノードが自分のＰＩＴバッファ・クレジットより多くの要求を持つときに生じる。Ｉ／Ｏが完了する度に、ＩＯＮ２１２は完了メッセージを計算ノード２００に戻す。通常、この完了メッセージには、解放されたＰＩＴバッファ・リソースのクレジットが含まれる。これはデビット／クレジット・フロー制御の基盤である。システムにＩ／Ｏ要求が殺到すると、いおん２１２ではＩ／Ｏが完了する度に新しいＩ／Ｏ要求と置き換えられる。そのため、負荷が大きい時期には、Ｉ／Ｏ要求は一度に一つずつＩＯＮ２１２に流れ込み、不特定の期間、ＩＯＮ２１２の待ち行列に加えられる。こうしたそれぞれの要求によってアップ・コール割り込みが生じ、ＩＯＮ２１２の負荷が増加する。
【０１９１】
この二重待ち行列モデルは数多くの利点を持つ。計算ノード２００に割り当てるＰＩＴバッファのかずに関しては綿密な相殺取引が行われる。十分な仕事量をＩＯＮ２１２のローカルの待ち行列に入れ、要求が完了したときに、即座に新しい仕事をディスパッチできるようにするべきである。しかし、キャッシュシステムに割り当てれば、ＩＯＮ２１２上の待ち行列にある要求が消費するメモリリソースをさらに効率的に利用できる。ＩＯＮ２１２のＰＩＴ待ち行列がメモリを維持するのに足りない状態にあるとき、ＩＯＮ２１２の仕事が無くなり、計算ノード２００から仕事が送られるのを待たざるを得なくなれば性能は低下する。
【０１９２】
スーパーＰＩＴは、高負荷時にデビット／クレジット・システムのフロー制御を利用して、アップ・コール割り込みの数を減らすために設計された、ＰＩＴプロトコルの特徴である。スーパーＰＩＴは、ＯＬＴＰや大量の比較的小さなＩ／Ｏに支配される同様の仕事の性能を改善する。一度に一つの要求を送るのではなく、スーパーＰＩＴパケットは、単一の大きなスーパーＰＩＴ要求によってすべてが運ばれるＩ／Ｏ要求の集合である。それぞれのスーパーＰＩＴパケットは、通常のＰＩＴバッファと同じ方法で転送される。スーパーＰＩＴパケットに含まれる個々のＩ／Ｏ要求は、ＩＯＮ２１２リソースが利用可能になったときに、ＰＩＴ仕事インジェクタによって抽出され、通常のいおん２１２待ち行列メカニズムに挿入される。この個々のＩ／Ｏ要求は、読み出し、書き込み、どちらの要求でもかまわない。
【０１９３】
ＰＩＴ仕事インジェクタは、ＩＯＮ２１２に転送されたアプリケーション要求のローカルでの（ＩＯＮ２１２上の）代理の役割を果たす。ＰＩＴ仕事インジェクタは、後のセクションで述べるＲＴ−ＰＩＴ及びＦＲＡＧ−ＰＩＴプロトコルとしても使われる。スーパーＰＩＴの個々の要求が空になると、このリソースは計算ノードに開放され、別のスーパーＰＩＴパケットを送って置き換えることが可能になる。一つのホストに認められるスーパーＰＩＴパケットの数は、第一のオープン交渉で決定する。当然、ＩＯＮ２１２の待ち行列にある仕事量は、別のスーパーＰＩＴパケットが運ばれるまでＩＯＮ２１２が仕事を続けるのに十分な量でなければいけない。
【０１９４】
計算ノード２００によって、ＩＯＮ２１２が自分のＰＩＴクレジットを使い果たすのに十分な仕事が待ち行列に加えられ、要求の待ち行列への追加がローカルで始まった状況を考える。スーパーＰＩＴ要求の待ち行列に加えられる要求の数は、スーパーＰＩＴが転送されるバッファのサイズによってのみ制限される。スーパーＰＩＴパケットは通常のＰＩＴパケットとは異なる働きをする。本発明の制御モデルでは、目的地へのクレジットを持っている場合に限り、デバイスは要求（デビット）を送ることができる。デバイスがＩＯＮ２１２内の特定のアプリケーション・スレッドをターゲットにしているわけではないので、デバイスがどのＰＩＴパケットを使用するかは、特に関係ない。ＩＯＮ２１２へのＰＩＴパケットはバッファの利用を制限するだけである（そして副作用としてフロー制御をする）。対照的に、ＰＩＴ要求内のＳＡＳＥ  ＰＩＴは異なっている。ＳＡＳＥＰＩＴ  ＩＤは計算ノード２１２内の特定のスレッドのアドレススペースを意味している。スーパーＰＩＴの各要求はＳＡＳＥ  ＰＩＴを含んでいるが、この要求のＩ／Ｏが完了したとき、作成されるＩ／Ｏ完了メッセージにはクレジットＰＩＴは含まれない。スーパーＰＩＴ内のすべての要求が無くなったときだけ、そのアドレススペースにクレジットＰＩＴが発行される。
【０１９５】
計算ノード２００でのスーパーＰＩＴの作成は以下のように行われる。スーパーＰＩＴは、単一のＩＯＮ２１２へのＩ／Ｏ要求が、計算ノード２００の待ち行列に最低２つあれば、常に作成できる。このＩＯＮ２１２に関して、計算ノード２００のスーパーＰＩＴパケットがすでに限界に達している場合、計算ノード２００はスーパーＰＩＴが戻るまで、要求を待ち行列に加え続ける。この計算ノードはその後、別のスーパーＰＩＴメッセージを発行する。このシステムドライバ内では、待ち行列が発生した場合、スーパーＰＩＴパケットを作成するためには、ＩＯＮごとの待ち行列が必要になる。
【０１９６】
上述の通り、スーパーＰＩＴメッセージは、大量の小Ｉ／Ｏ要求に支配された仕事によるＩＯＮ２１２の処理負荷を減らすことができる。スーパーＰＩＴメッセージは、メッセージの平均サイズを増やすことで、目的地ノードの性能とインターコネクト・ファブリックの利用性を改善する。しかし、スーパーＰＩＴメッセージの概念は、ＩＯＮ２１２が、小Ｉ／Ｏ作業によって生じる計算ノード２００の負荷を減少させる場合にも適用できる。ＩＯＮ２１２でのスーパーＰＩＴメッセージの作成では、計算ノード２００での作成とはまったく異なる問題が生じる。計算ノード２００では、Ｉ／Ｏ要求を作成するアプリケーション・スレッドは、ＩＯＮ２１２の過負荷を防止するためのフロー制御の対象となる。ディスクサブシステムのサービス速度は、残りのＩＯＮ２１２よりはるかに低いため、ＩＯＮ２１２の性能にとって常に最終的な制限となる。要求は、ＩＯＮ２１２がそれを待ち行列に加え、サービスを行うために十分なリソースを持つまで、システムに入ることをブロックされる。重要なのは、ＩＯＮ２１２上でリソースが利用可能になるまで、要求が計算ノードで待ち行列に加えられる（又はアプリケーションがブロックされる）という点である。リソース不足は計算ノード２００での問題ではない。計算ノード２００のアプリケーションがシステムに対してＩ／Ｏの要求を発信するとき、要求の一部にはＩ／Ｏを完了するのに必要な計算ノード２００のメモリリソース（アプリケーション・スレッド・バッファ）が含まれる。ＩＯＮ２１２が計算ノード２００に送る必要のあるＩ／Ｏ完了メッセージには、すでにＰＩＴ  ＩＤ（ＳＡＳＥ  ＰＩＴ  ＩＤ）が割り当てられている。ＩＯＮ２１２から見ると、Ｉ／Ｏ完了メッセージはすでにターゲットバッファが割り当てられており、データの準備が終わり次第、実行することができる。Ｉ／Ｏ完了メッセージは、伝達すれば成功する（ＩＯＮ２１２は計算ノードのディスクストレージシステムのサービス時間を持つ必要はない）。そのため、ＩＯＮ２１２は、計算ノードからのフロー制御の圧力によるブロックができない。スーパーＰＩＴメッセージを作成するために、計算ノードはフロー制御待ち行列を利用するが、ＩＯＮ２１２はこのオプションを持っていない。ＩＯＮ２１２は、ＢＹＮＥＴへのアクセスを除き、待つ必要のあるリソースをまったく持っていないため、スーパーＰＩＴメッセージを作成する機会ははるかに少なくなる。
【０１９７】
ＩＯＮ２１２でスーパーＰＩＴメッセージを作成するために、いくつかの方法が利用できる。一つは、Ｉ／Ｏ完了要求をわずかに遅らせて、スーパーＰＩＴパケット作成の機会を増やすことである。わずかな遅れの後、同じノードのために新しい完了メッセージが準備されていなければ、そのメッセージは通常のＰＩＴメッセージとして送られる。このテクニックの問題は、（計算ノードのアップ・コール・オーバーヘッドを減らすために）スーパーＰＩＴ作成を期待して要求を遅らせる時間を取れば、それに対応して要求サービス時間の合計が増加することである。最終的には計算ノード２００の負荷を減らすことになるが、アプリケーションの速度も遅くなってしまう。適応性のある遅延時間が有効である（計算ノード２００に対する平均サービス時間と特定の要求にかかった合計サービス時間によって決定）。二つ目の方法は、一つ目をわずかに変化させたものである。この場合、それぞれの計算ノード２００は、計算ノードでの小Ｉ／Ｏの割合が上昇するにしたがって増加する遅延時間を、それぞれのＩＯＮ２１２に提供する必要がある。これにより、必要な時に特定のＩＯＮ２１２がスーパーＰＩＴメッセージを作成する機会を増やすことになる。三つ目の方法は、特定のトラフィックのタイプ、例えばキャッシュが直接サービスを行い、ストレージ２２４のディスク作業を待たなくていい小さな読み出し又は書き込みなどを遅らせることである。
キャッシュは要求の一部に関して、ディスク・トラフィックを回避して、平均Ｉ／Ｏ待ち時間を減らすが、待ち時間の配分はキャッシュのヒットによって変化する。キャッシュのヒット要求における短い待ち行列遅延時間は、ディスク作業を含むものに比べ、サービス時間の大きな増加にはつながらない。サービス時間の配分に敏感なアプリケーション（均一な反応時間が性能にとって重要なもの）では、ＩＯＮ２１２でのスーパーＰＩＴパケット作成のためのわずかな遅延によって、全体的なシステム性能が改善される可能性がある。
６．  大型ブロックのサポートと断片ＰＩＴパケット
データベース・アプリケーションの性能要件は、データベースのサイズに関係しない場合が多い。データベースのサイズが大きくすれば、アプリケーション性能の浸食を防ぐために、ディスクストレージを調べる速度も比例して大きくしなくてはいけない。別の言い方をすれば、サイズが大きくなるカスタマ・データベースにおいて、一定の問い合わせに対する反応時間は一定に保たなくてはいけない。この要件を満たす上で問題は、これが現在のディスクドライブ・テクノロジの傾向と直接対立する点にある。ディスクドライブの容量が増加する一方で、ランダムＩ／Ｏ性能は変化していない。この傾向を緩和する方法の一つは、ディスクデバイスの容量増加にしたがって、ディスクＩ／Ｏ作業の平均サイズを増加させることである。ストレージ容量と性能要件の現在の傾向から言って、平均Ｉ／Ｏサイズである２４ＫＢは、非常に近い将来に１２８ＫＢに増加する可能性がある。より積極的なキャッシュ使用と遅延書き込みテクニックが、多くの仕事にとって有効になるかもしれない。ディスクドライブにおける不均一なテクノロジの成長だけが、Ｉ／Ｏ要求サイズの増加を生み出しているわけではない。ＢＬＯＢＳ（バイナリ大型オブジェクト）を利用するデータベースが普及するにつれ、１ＭＢ以上のサイズに達するオブジェクトが一般的になりつつある。特定の原因とは関係なく、システムには大きなＩ／Ｏオブジェクトをサポートする必要が生じ、そのサイズはディスクストレージの経済学に従っていくことになる。
【０１９８】
ＰＩＴプロトコルを使用したＩＯＮ２１２と計算ノード２００による大型データオブジェクトの送信に関しては、いくつかの問題がある。本文書で述べた通り、ＰＩＴプロトコルの利点は、目的地バッファを先に割り当て、フロー制御と端点決定の問題に対処することにある。しかし、アップ・コール意味もメッセージを保管する十分なバッファスペースを確認（又は割り当て）する必要がある。ＰＩＴプロトコルでは、送信側で各メッセージを保管するターゲットＰＩＴ  ＩＤ９０６を送信側に選択させることで、この問題に対処する。大きなＩ／Ｏ書き込みは、メッセージのサイズが利用できるプールから特定のＰＩＴ  ＩＤ９０６を選択する際の基準になるため、確実にプロトコルが複雑になる。負荷が大きい時期には、送信者が利用できるＰＩＴ  ＩＤ９０６クレジットを持っているにも関わらず、そのすべてが大型Ｉ／Ｏ要求のバッファサイズ条件に合わない状況が生じる可能性がある。ＰＩＴプロトコルでは、送信するデータサイズの幅が広い場合、送信側は受信側と協力してＰＩＴバッファの数とサイズの両方を管理しなくてはいけない。これによりＰＩＴバッファ割り当てサイズの問題が生じる。つまり、ＰＩＴバッファのプールを作成する時に、特定の仕事のＰＩＴバッファのプールにとって、バッファサイズの適切な配分とは何か、である。ＢＹＮＥＴソフトウェアは、書き込みだけでなく大型Ｉ／Ｏ読み出しも複雑にする追加最大転送単位（ＭＴＵ）を強制する。ＢＹＮＥＴ  ＭＴＵを超えるＩ／Ｏ要求（読み出しと書き込みの両方）は、ソフトエアのプロトコル（この場合はＰＩＴプロトコル）によって、送信側で断片化し、受信側で組み立て直す必要がある。これによってメモリ断片化の問題が生じる。簡単に言えば、内部断片化は割り当てられたバッファ内部の無駄なスペースであり、外部断片化は割り当てられたバッファ外部の、小さすぎてまったく要求を満たすことができない無駄なスペースである。解決策の一つは、大型ＰＩＴバッファの一部のみを使用することだが、大きなＰＩＴバッファを使用した場合に不必要な内部断片化が生じることになる。大型ＰＩＴバッファはメモリを無駄にし、コスト／性能を悪化させる。
【０１９９】
本発明では、ＢＹＮＥＴ  ＭＴＵ及びＰＩＴバッファ割り当ての問題は、ＰＩＴメッセージのタイプを２つ追加することで解決している。これはＲＴ−ＰＩＴ（ラウンド・トリップＰＩＴ）とＦＲＡＧ−ＰＩＴ（断片ＰＩＴ）である。ＦＲＡＧ−ＰＩＴとＲＴ−ＰＩＴはどちらも、ＰＩＴデータ・プッシュ・モデルではなく、データ・プル・モデルを利用している（プッシュ・データでは、送信側がデータを目的地にプッシュする。プル・データでは、目的地がデータをソースからプルする）。ＦＲＡＧ−ＰＩＴメッセージは大型データ読み出しをサポートする設計になっており、ＲＴ−ＰＩＴメッセージは大型データ書き込みをサポートしている。ＦＲＡＧ−ＰＩＴとＲＴ−ＰＩＴはどちらもスーパーＰＩＴと同じように、ＩＯＮ  ＰＩＴ仕事インジェクタを使用してデータ・フローを管理する。
【０２００】
ａ）  ＲＴ−ＰＩＴメッセージ
計算ノード２００がＩＯＮ２１２に対して大きなディスク書き込み作業の実行を求め、そのＩ／Ｏ書き込みがＢＹＮＥＴ  ＭＴＵ又は利用できる任意のＩＯＮ２１２ＰＩＴバッファのどちらかより大きいとき、計算ノード２００はＲＴ−ＰＩＴ作成メッセージを作成する。ＲＴ−ＰＩＴメッセージは二つの段階で働く。
ブースト段階とラウンド・トリップ段階である。ブースト段階では、書き込まれるデータのためのソース・バッファのリストが計算ノード２００一連のＰＩＴ  ＩＤに割り当てられる。ソース・バッファの断片化サイズがＢＹＮＥＴ  ＭＴＵとＩＯＮ初期オープンプロトコルで指定されたサイズ制約によって決定する。このＰＩＴ  ＩＤ（及び地合おうするバッファサイズ）のリストは、単一のＲＴ−ＰＩＴ要求メッセージのペイロードに置かれ、目的地ＩＯＮ２１２に対するＰＩＴクレジットになる。ＲＴ−ＰＩＴプロトコルが直接使用するために、追加ＰＩＴバッファが計算ノードプールから割り当てられる。この追加バッファのＰＩＴＩＤは、ＰＩＴヘッダのクレジット・フィールドに置かれる。残りのＲＴ−ＰＩＴ要求は、通常のＰＩＴ書き込みメッセージと同じである。次に計算ノード２００は、このＲＴ−ＰＩＴ要求メッセージをＩＯＮ２１２に送る（ブーストする）。
【０２０１】
ＩＯＮ２１２では、ＰＩＴ仕事インジェクタがＲＴ−ＰＩＴ要求メッセージを二つのステップで処理する。それそれのソース側ＰＩＴ  ＩＤ９０６に関して、仕事インジェクタはサイズの一致するＰＩＴバッファをＩＯＮキャッシュから要求しなくてはいけない（ＩＯＮバッファキャッシュで利用できるスペースに応じて、これがすべて一緒に又は一度に一つずつ行われる）。ＰＩＴバッファを一致させることで、ＩＯＮ２１２は動的にリソースを割り当て、書き込み要求に組み合わせる。これで、通常のＰＩＴ転送を修正したシーケンスを利用して、Ｉ／Ｏを進めることができるようになる。ここでＲＴ−ＰＩＴメッセージの処理はラウンド・トリップ段階に入り、仕事インジェクタはソースと目的地ＰＩＴ  ＩＤの一致した一つ（以上）のペアのために、ＲＴ−ＰＩＴ開始メッセージを作成する（ＩＯＮ２１２には、一致したＰＩＴ  ＩＤの一つ又は一部を送信するオプションも残されている）。単一のＲＴ−ＰＩＴ開始メッセージに含まれるＰＩＴ  ＩＤ９０６の数は、ＩＯＮ２１２内のデータ転送の細かさをコントロールする（以下で解説）。
【０２０２】
このＲＴ−ＰＩＴ開始メッセージは計算ノード２００に送り返され、ＲＴ−ＰＩＴメッセージのブースト段階が終了する。ＲＴ−ＰＩＴ開始メッセージを受領すると、計算ノード２００は、通常ＰＩＴ書き込みメッセージを使用して、一度に一つのＰＩＴペアずつ、ＩＯＮ２１２にデータを転送する。計算ノード２００とＩＯＮ２１２の両方が失われた断片を処理するのに十分なデータを持っているので、計算ノード２００は断片を順番に送る必要はない（一致したＰＩＴペアが再組立の順番を指定する）。ＩＯＮ２１２がＰＩＴ書き込みメッセージを受領すると、仕事インジェクタは通知を受け、この書き込み要求がもっと大きなＲＴ−ＰＩＴ Ｉ／Ｏ作業の一部であることを認識する。仕事インジェクタにはＰＩＴ書き込み処理に関して二つの選択肢があり、断片をキャッシュ・ルーチンに渡して書き込み作業を開始させる、又は書き込みを開始する前に最後の断片の送信を待つ。さきにＩ／Ｏを開始すると、キャッシュがパイプライン式にディスクドライブへデータフローを送ることができるが（書き込みキャッシュの方針による）、小さなＩ／Ｏサイズによる性能低下のリスクがある。しかし、すべての断片が到着するまでＩ／Ｏを保持すると、キャッシュシステムに過度の負荷がかかる可能性がある。断片の合計サイズと数量は最初から分かっているので、現在の稼働状況で大型Ｉ／Ｏ要求を最適化するのに必要なすべてのデータは、キャッシュシステムによって作られる。計算ノード２００側では、ＰＩＴ書き込み作業の送信が成功する度に、単一のＲＴ−ＰＩＴ開始メッセージに複数の断片が含まれるときには、次の断片書き出しの開始が起こる。単一のＲＴ−ＰＩＴ開始コマンド内の最後の断片が受領されると、要求インジェクタは、通常の書き込み要求と同様の処理のために、データをキャッシュシステムに渡す。データが安全であれば、キャッシュシステムはＩ／Ｏ完了メッセージを作成し、計算ノード２００に送り返して、（ＲＴ−ＰＩＴ開始作業の）処理のこの段階が完了したことを知らせる。断片がまだ残っている場合は、ＲＴ−ＰＩＴ開始コマンドが作成され、計算ノードに送られ、すべての断片が処理されるまで上述のサイクルが繰り返される。
作業インジェクタとキャッシュが最後の断片の処理を完了すると、最終Ｉ／Ｏ完了メッセージがステータスと共に計算ノードに戻され、ＲＴ−ＰＩＴ要求の処理の終了を同期させる。
【０２０３】
ＲＴ−ＰＩＴメッセージはいくつかの変更でＢＹＮＥＴに最適化できる。ＩＯＮ２１２がＲＴ−ＰＩＴ要求を受領した直後の状況を考える。ＩＯＮ２１２の仕事インジェクタは、計算ノードのバッファとＩＯＮ２１２を一致させ、大型Ｉ／Ｏ要求をたくさんの小さな通常書き込み要求にトランスレートしようとしている。同期は中間ＲＴ−ＰＩＴ開始コマンドによって行われる。しかし、ＢＹＮＥＴによって、受領したチャンネルプログラムのデータ引き出しが可能になれば、ＲＴ−ＰＩＴ開始コマンド送信の中間のステップが排除できる。説明のために、このＢＹＮＥＴ作業のモードをループ・バンド・メッセージと呼ぶことにする。ループ・バンド・メッセージは実際は二つの有向バンド・メッセージで、片方が他方に組み込まれている。例えば、ＲＴ−ＰＩＴ要求を受領した仕事インジェクタは、計算ノードで二番目のＰＩＴ書き込みメッセージを作成するのに必要なデータを含んだＲＴ−ＰＩＴ開始メッセージを作成することで、それぞれの断片を処理することになる。ＲＴ−ＰＩＴ開始メッセージはＰＩＴ書き込み作業の断片化のテンプレートを計算ノード２００に転送する。計算ノード２００で実行されるチャンネルプログラム（ＲＴ−ＰＩＴ開始メッセージと一緒に送られる）は、計算ノードＢＹＮＥＴドライバの送信待ち行列上にペイロードを保管する。このペイロードは、第一のＲＴ−ＰＩＴ要求をするアプリケーションスレッドからの要求待ち行列に似ている。このペイロードは、ソースと目的地のＰＩＴ  ＩＤのペアを使って、仕事インジェクタが送信するこの断片のために、ＰＩＴ書き込み要求を作成する。ＰＩＴ書き込みは断片をＩＯＮ２１２で保管し、仕事インジェクタに到着を知らせる。仕事インジェクタは、それぞれの断片についてこのサイクルを繰り返して、すべてを処理する。ループ・バンド・メッセージによる性能改善は、それぞれのＲＴ−ＰＩＴ開始メッセージに必要な割り込みと計算ノードの処理の排除に由来する。
【０２０４】
ＦＲＡＧ−ＰＩＴメッセージは、計算ノードからの大型Ｉ／Ｏ読み出し要求の作業をサポートするように設計されている。アプリケーションが大型Ｉ／Ｏ読み出しを要求すると、計算ノードはターゲットバッファを固定し、各断片のターゲットバッファを意味するＰＩＴ  ＩＤのリストを作成する。それぞれのＰＩＴ  ＩＤは、断片のターゲットバッファと関連するステータスバッファで構成される分散リストを記述する。ステータスバッファはデータ送信時に更新され、これにより計算ノードは各断片がいつ処理されたかを判断できる。各断片のサイズは、ＲＴ−ＰＩＴメッセージと同じアルゴリズムで決定する（上のＲＴ−ＰＩＴのセクションを参照）。これらのフィールドを組み合わせてＦＲＡＧ−ＰＩＴを作成する。
【０２０５】
ＦＲＡＧ−ＰＩＴ要求は計算ノード２００によってＩＯＮ２１２に送信され、ここで仕事インジェクタによって処理される。この要求には、仮想ディスク名、開始ブロック番号、ＩＯＮ２１２上のデータソースのデータの長さが含まれる。
仕事インジェクタはＲＴ−ＰＩＴ要求と同様の形でＦＲＡＧ−ＰＩＴ要求についての作業を行う。ＦＲＡＧ−ＰＩＴ要求内の各断片は、別々のＰＩＴ読み出し要求として、キャッシュシステムとの協力によって処理される。キャッシュシステムは、各断片を個別に扱うか、又は単一の読み出し要求として扱うかを選択でき、可能になったときにディスクデータを仕事インジェクタに供給する。キャッシュがデータ断片を（個別に又は単一のＩ／Ｏ作業の一部として）供給すると、大型読み出し要求のデータが計算ノードにフローバックし始める。キャッシュがデータを利用可能にした各断片ごとに、仕事インジェクタはデータ断片をＦＲＡＧ−ＰＩＴ部分完了メッセージに入れて計算ノードに送り返す。それぞれのＦＲＡＧ−ＰＩＴ部分完了メッセージは、通常のＰＩＴ読み出し要求完了と同様にデータを伝送するが、ＦＲＡＧ−ＰＩＴ部分完了メッセージは伝達されたときに計算ノードで割り込みを生成しない。最後の完了断片は、ＦＲＡＧ−ＰＩＴ完全完了メッセージと一緒に計算ノードへ戻される。ＦＲＡＧ−ＰＩＴ完全完了メッセージと部分完了メッセージの違いは、割り込みによってＦＲＡＧ−ＰＩＴ読み出し要求全体の完了を知らせる点にある（フル・アップ・コール）。
【０２０６】
７．  他のネットワークデバイスへのＰＩＴプロトコルの導入
ネットワーク接続ストレージに対する上述のアプローチによる性能の大部分は、インターコネクト・ファブリック１０６がＰＩＴプロトコルをサポートする能力に依存している。ＢＹＮＥＴの場合、低レベルインターフェースが作成され、これはＰＩＴプロトコルと密接に調和している。ファイバ・チャンネル等の他のネットワーク・インターフェースにも、同様にＰＩＴプロトコルをサポートする能力がある。
【０２０７】
Ｅ．  バミューダ・トライアングル・プロトコル
本発明では、ＩＯＮクリーク２２６と書き込みキャッシュを使用して、データとＩ／Ｏ冗長を提供している。ＩＯＮクリーク２２６を構成するのは複数のＩＯＮ（通常はペア又はダイポールとして設置）、例えばプライマリＩＯＮ２１２及びバディＩＯＮ２１４から成るＩＯＮ２１２及び２１４である。
【０２０８】
バディＩＯＮ２１４は、プライマリＩＯＮ２１２が修正したキャッシュページのコピーの一時格納場所として働き、データとＩ／Ｏ冗長を提供する。ＩＯＮクリーク２２６（図のＩＯＮのペア又はダイポール）内のそれぞれのＩＯＮ２１２は、ボリューム・セットの一つのグループにとってのプライマリＩＯＮ２１２として機能し、他にとってのバディＩＯＮ２１４として機能する。
【０２０９】
高い可用性と書き込みキャッシュを提供するためには、アプリケーションが書き込みを確認できるまでの間、最低２カ所にデータを安全に格納する必要がある。これは、キャッシュメモリのバックアップコピーや高速度シーケンシャルディスク用ログを使用して行うこともある。書き込みが確認された後、データが恒久ストレージに記録される前に、ストレージ・コントローラが働かなくなった場合、この冗長コピー供給の失敗はデータの損失につながる可能性がある。
【０２１０】
しかし、ＩＯＮ２１２とＩＯＮ２１４は物理的に分離したコンピュータで構成されるため、インターコネクト・ファブリック１０６上の通信には、こうしたバックアップコピーを維持する必要がある。最高のシステム性能のためには、書き込みキャッシュを利用しながら、ＢＹＮＥＴ送信と書き込みプロトコルに伴う割り込みを最小化する必要がある。
【０２１１】
図１１は、ダイポール２２６におけるディスク２２４へのデータ書き込みのために可能なプロトコルの一つを示している。ステップ１及び３では、計算ノード２００は要求をプライマリＩＯＮ２１２とバディＩＯＮ２１４に送る。ステップ２及び４では、ＩＯＮが書き込み要求に応答する。計算ノード２００がＩＯＮ２１２と２１４の両方から応答を受領すると、書き込みが完了したとみなされる。
データがその後ディスクに書き込まれるとき、プライマリＩＯＮ２１２はバディＩＯＮ２１４に排除要求を送り、書き込みデータのページのコピーを保存しておく必要がないことを知らせる。「送信完了」割り込みを送信側で抑制すると仮定すると、それぞれの送信メッセージが計算ノード又はＩＯＮ２１２及びＩＯＮ２１４で割り込みを生成するため、このプロトコルでは最低５回の割り込みが必要になる。また、このプロトコルのもう一つの欠点は、書き込みが開始になった時に片方のＩＯＮがダウンした場合に二つ目の応答を永遠に待つのを避けるために、計算ノード２００がプライマリＩＯＮ２１２及びバディＩＯＮ２１４の状況を知っておく必要があることである。
【０２１２】
図１２は、考えられる別のプロトコルを表している。このプロトコルでは、プライマリＩＯＮ２１２に対して、書き込み要求をバディＩＯＮ２１４へ送り、応答を待ち、計算ノード２００へ確認を送り返すように指示する。このプロトコルでも最低５回の割り込みが必要になる。第一の割り込みは、ステップ１で示されるように、計算ノード２００がプライマリＩＯＮ２１２に書き込み要求を送るときに発生する。第二の割り込みはステップ２で、プライマリＩＯＮ２１２がデータをバディＩＯＮ２１４に送るときに発生する。３回目の割り込みはステップ３で、バディＩＯＮ２１４がデータの受領を知らせるときに発生する。４回目の割り込みはステップ４で、プライマリＩＯＮ２１２が計算ノード２００に応答するときに発生し、最後の割り込みはステップ５で、データが安全にディスクに転送された後、プライマリＩＯＮ２１２が排除要求をバディＩＯＮ２１４に送るときに発生する。
【０２１３】
図１３は、書き込み要求処理に必要な割り込み回数を最小化する、本発明で使用されているプロトコルを表している。このプロトコルをバミューダ・トライアングル・プロトコルと呼ぶ。
まず、計算ノード２００が書き込みデータと共に書き込み要求をプライマリＩＯＮ２１２に対して発行する。この書き込み要求は、インターコネクト・ファブリック１０６を介して、プライマリＩＯＮ２１２に伝送される。これはステップ１で表される。プライマリＩＯＮ２１２はメモリ３０４に位置する書き込みキャッシュに書き込みデータを格納し、この書き込みデータをバディＩＯＮ２１４に送る。これはステップ２で表される。次に、バディＩＯＮ２１４は確認メッセージを計算ノード２００に送り、書き込み要求を確認する。最後に、データが安全にディスクに保存されると、プライマリＩＯＮ２１２は排除要求をＩＯＮ２１４に送る。この排除ステップは図１３のステップ３で示している。図１１及び図１２で示した方法では５つのステップが必要なのに対して、上述のプロトコルで必要なのは４つのプロセスであるため、これはデータ処理アーキテクチャ１００の通信要件を減少し、処理能力を増加させる。
【０２１４】
図１４は、上述の作業をフローチャートの形で示した図である。まず、プライマリＩＯＮ２１２が計算ノード２００から書き込み要求を受領する１４０２。次に、プライマリＩＯＮ２１２からバディＩＯＮ２１４に書き込み要求の書き込みデータが転送される１４０４。バディＩＯＮ２１４から計算ノード２００に確認メッセージが伝送され１４０６、排除論理を実行して１４０８、バディＩＯＮ２１４に格納された書き込みデータを排除する。
【０２１５】
図１５は、排除論理の実施形態を示している。この実施形態では、プライマリＩＯＮ２１２の不揮発性ストレージに書き込みデータが格納されたときに、プライマリＩＯＮ２１２からバディＩＯＮに排除コマンドが送られる１５０２。通常、これはデータがメディアに書き込まれたときに発生する。
図１６は、排除論理のもう一つの実施形態を示している。この実施形態は、不揮発性メモリに書き込みデータが格納されるまで１６０２、排除コマンドが送信されない点では、図１５の実施形態と同じである。しかし、この実施形態では、排除コマンドを送信する前に、プライマリＩＯＮ２１２が二番目の書き込み要求を受領するのも待つ１６０４。したがって、排除要求を遅らせ、３回の割り込みプロトコルを発生させる次の書き込みデータ送信と組み合わせることで、さらに割り込みが減少する。このプロトコルのもう一つの利点は、書き込み要求を受領したときにバディＩＯＮ２１４がダウンした場合でも、プライマリＩＯＮ２１２がライト・バック・モードで要求を処理し、データが安全にディスクに保存された後、書き込みを知らせることができる点にある。計算ノード２００はバディＩＯＮ２１４のステータスを知る必要はない。実施形態では、プライマリＩＯＮ２１２の受領する書き込み要求がなくなった場合でも、最後の排除命令の送信を確実に行うために、ソフトウェア・タイマ又はその他のデバイスを導入することもできる。
【０２１６】
バミューダ・トライアングル・プロトコルでは、従来のプロトコルよりも少ない割り込みによって書き込みキャッシュを利用でき、同時にデータの可用性を維持できる。これが可能なのは、バディＩＯＮ２１４がプライマリＩＯＮ２１２に送られた書き込み要求の確認を行うからである。現代のパイプライン式プロセッサにおいて割り込み処理のコストが高いことを考えれば、このプロトコルは、幅広い分散ストレージシステム・アーキテクチャでの使用が可能であり、システム全体のオーバーヘッド低下と性能の向上を生み出すことになる。
【０２１７】
Ｆ．  計算ノード
１．  概要
計算ノード２００はユーザアプリケーション２０４を動かす。従来のシステムでは、使用される専用共通ＳＣＳＩバスの数と、クラスタ又はクリーク内のノードにアクセスできるストレージの数は同じだった。本発明では、ストレージは一つ以上の通信ファブリック１０６を通じて計算ノード２００に接続している。このネットワーク接続ストレージは、計算ノード２００間に分散するユーザアプリケーション２０４内のプロセス間通信（ＩＰＣ）トラフィックと、通信ファブリック１０６を共有している。ユーザアプリケーション２０４からのストレージ要求は、ファブリック／ストレージ・インターフェースによって、ＩＯＮ２１２に位置するストレージ管理アプリケーションに対するＩＰＣメッセージに入れられる。こうしたストレージ・ノードの専用アプリケーションは、このＩＰＣメッセージをローカル・キャッシュ又はＩ／Ｏ作業に変換し、必要に応じて結果を計算ノード２００に送り返す。ユーザアプリケーション２０４にとって、ネットワーク接続ストレージとローカル接続ストレージは区別が付かない。
【０２１８】
仮想ディスクブロックの読み出し及び書き込み要求は、インターコネクト・ファブリック１０６を介してＩＯＮ２１２に到着する。特定のＩＯＮ２１２への要求の経路は、計算ノード２００においてソースが行った選択によって決定できる。すべての計算ノード２００は、システムのそれぞれのファブリック仮想ディスクへの要求を、どのＩＯＮ２１２が受け取るのかを知っている。ファブリック仮想ディスクは独自のストレージ拡張子が記述される仮想ディスクモデルを反映しているが、このストレージ拡張子は、その名前によって物理ディスクの物理的な位置を意味したり記号化するものではない。
【０２１９】
それぞれの計算ノード２００は、ファブリック仮想ディスク名をＩＯＮダイポール２２６にマップするリストを持っている。このリストは、計算ノード２００とＩＯＮ２１２との調整により、動的に作成される。電源投入及び失敗復旧作業時、ダイポール２２６内のＩＯＮ２１２は、仮想（及び物理）ディスク同士を区分し、どのＩＯＮ２１２がどの仮想ディスクを所有しているかについてのリストを作成する。ダイポール２２６の他のＩＯＮ２１４（仮想ディスク又はストレージリソースを所有していない）は、異常に備えて仮想ディスクに代替経路を提供する。
【０２２０】
このリストは、インターコネクト・ファブリック１０６を通して、他のすべてのダイポール２２６と計算ノード２００に、定期的にエキスポート又は同報される。計算ノード２００は、このデータを使って、システム内の各仮想ディスクへの第一の及び第二のパスのマスタ・テーブルを作成する。その後、計算ノード２００内のインターコネクト・ファブリック・ドライバは、ダイポール２２６と調整し、Ｉ／Ｏ要求の経路を決める。ダイポール２２６は、この「自己発見」テクニックを使用して、稼働システムにおいてダイポール２２６が追加・除去されたときに発生する可能性のある仮想ディスク名の不一致を検知し、訂正する。
【０２２１】
計算ノード２００上で動くアプリケーションは、ブロック・インターフェース・モデルを、計算ノード２００にエキスポートされた各ファブリック仮想ディスクのローカルディスクのように見る。本文書で前に述べたように、計算ノード２００はブート時に各ファブリック仮想ディスクの入口点を作成し、計算ノード２００とＩＯＮ２１２の間で確立したネーミング・プロトコルを使って、こうした入口点を動的に更新する。
【０２２２】
この文書では、データ・ストレージとデータ処理システムにおける書き込みキャッシュデータの転送方法及び装置について説明した。この方法は、計算ノードからの書き込みデータを含む書き込み要求を第一のＩ／Ｏノードで受領し、この書き込みデータを第一のＩ／Ｏノードから第二のＩ／Ｏノードに転送し、第二のＩ／Ｏノードが書き込みデータを受領した後で、確認メッセージを第二のＩ／Ｏノードから計算ノードへ送るステップで構成されている。第一のＩ／Ｏノードの不揮発性ストレージにデータを書き込んだ後、排除要求又はコマンドを第二のＩ／Ｏノードに送り、第二のＩ／Ｏノードの揮発性メモリから書き込みデータを排除する。実施形態によっては、排除要求は第一のＩ／Ｏノードが第二の書き込み要求を受領するまで送信されず、この場合、排除要求は第二の書き込み要求の書き込みデータと同じ割り込みにおいて送信される。このデータ処理システムは、第一の及び第二のＩ／Ｏノードで構成され、各ノードは計算ノードからの書き込み要求を受領し、別のＩ／Ｏノードへ書き込みノードを転送するための手段を有している。また、各Ｉ／Ｏノードには、書き込みデータを送ったＩ／Ｏノードを介して確認メッセージを送信するのではなく、計算ノードに直接確認メッセージを送る手段も有している。この成果が、データ保存に要する割込み回数を減らしながら、書き込みキャッシュを導入してストレージ速度及びターンアラウンドを改善するＩ／Ｏプロトコルである。本発明は、本発明を実施すべき命令を遂行するために保存された命令を確実に具現するハードディスク、フロッピーディスク、ＣＤといったプログラム・ストレージ・デバイスの見地から説明することも可能である。
【図面の簡単な説明】
【図１】本発明の主要なアーキテクチャ要素を示す最上部のブロック図。
【図２】本発明のシステム・ブロック図。
【図３】ＩＯＮ及びシステムのインターコネクト構造を示すブロック図。
【図４】ＪＢＯＤエンクロージャの要素のブロック図。
【図５】ＩＯＮ物理ディスクドライバの機能ブロック図。
【図６】ファブリック固有ＩＤの構造を示す図。
【図７】ＩＯＮエンクロージャ管理モジュールとＩＯＮ物理ディスクドライバの関係を示す機能ブロック図。
【図８】ＢＹＮＥＴホスト側のインターフェースの図。
【図９】ＰＩＴヘッダの図。
【図１０】ＩＯＮ２１２機能モジュールのブロック図。
【図１１】ダイポールのディスクにデータを書き込むためのプロトコルを示す図。
【図１２】ダイポールのディスクにデータを書き込むための第二のプロトコルを示す図。
【図１３】ＩＯＮダイポールのディスクにデータを書き込むための効率的なプロトコルを示す図。
【図１４】本発明の書き込みキャッシュ・プロトコルの実施形態を実行する際に利用する動作を示すフローチャート。
【図１５】第一のＩＯＮの不揮発性ストレージにデータが書き込まれた後、他方のＩＯＮのメモリを排除する際に利用する動作を示すフローチャート。
【図１６】第一のＩＯＮの不揮発性ストレージにデータが書き込まれた後、他方のＩＯＮのメモリを排除する際に利用する代替動作を示すフローチャート。
【図１】
0004567125.tif 000010
【図２】
0004567125.tif 000011
【図３】
0004567125.tif 000012
【図４】
0004567125.tif 000013
【図５】
0004567125.tif 000014
【図６】
0004567125.tif 000015
【図７】
0004567125.tif 000016
【図８】
0004567125.tif 000017
【図９】
0004567125.tif 000018
【図１０】
0004567125.tif 000019
【図１１】
0004567125.tif 000020
【図１２】
0004567125.tif 000021
【図１３】
0004567125.tif 000022
【図１４】
0004567125.tif 000023
【図１５】
0004567125.tif 000024
【図１６】
0004567125.tif 000025