(57)【要約】ファイルシステムによって管理される各読み出しストリームについて、読み出される先読みデータの量を最適化するように構成されたファイルシステムを実施するストレージシステムを提供する。このファイルシステムは、種々にファクタに応じて、各読み出しストリームに対して最適な先読みサイズを適宜選択する。こうしたファクタには、読み出しストリーム中で処理される読み出し要求の数、読み出しストリーム中で要求されるクライアントの要求するデータの量、読み出しストリームに関連する読み出しアクセススタイルなどがある。ファイルシステムは、各読み出しストリームについて先読み処理が実施されるタイミングを適宜選択し、各ストリームによって読み出されるデータをメモリ内にどのくらいの時間保持するかを決定することにより、キャッシュポルーションを最小限に抑えるように更に構成される。
2007520812.tif 000002
【特許請求の範囲】
【請求項１】
ストレージシステムにおいて実施されるストレージオペレーティングシステムが、該ストレージシステムに記憶されるデータコンテナにおいて確立される読み出しストリームに対し、読み出される先読みデータの量を最適化するための方法であって、
前記ストレージオペレーティングシステムに対して前記読み出しストリームを含むデータコンテナから読み出すことをクライアントが要求するデータを示すクライアント読み出し要求を前記ストレージシステムにおいて受信し、
受信した前記クライアント読み出し要求に応じて、前記ストレージオペレーティングシステムが、前記データコンテナからの先読みデータの読み出しを許可されているか否かを判定し、
前記ストレージオペレーティングシステムが、前記データコンテナからの先読みデータの読み出しを許可されている場合、
(i)前記データコンテナから読み出す先読みデータの量を１以上のファクタに基づいて選択するステップと、
(ii)選択される前記量の先読みデータを前記データコンテナから読み出すステップとを実施することからなる方法。
【請求項２】
前記データコンテナは、ファイル、ディレクトリ、ｖｄｉｓｋ、又は、ＬＵＮである、請求項１に記載の方法。
【請求項３】
前記クライアントが要求するデータによって前記読み出しストリームが所定の次の先読み値を超えて拡張される場合、前記ストレージオペレーティングシステムは、前記データコンテナから先読みデータを読み出すことが許可されているものと判断される、請求項１に記載の方法。
【請求項４】
前記所定の次の先読み値は、前記読み出しストリームに関連するリードセットデータ構造に記憶される、請求項３に記載の方法。
【請求項５】
前記所定の次の先読み値は、前記選択された量の先読みデータの或る割合に基づいて更新される、請求項３に記載の方法。
【請求項６】
前記データコンテナに関連する読み出しアクセススタイルは、前記先読みデータの量の選択に使用される１以上のファクタのうちの１つである、請求項１に記載の方法。
【請求項７】
前記読み出しアクセススタイルがランダム読み出しアクセススタイルに対応する場合、前記選択される先読みデータの量はゼロに等しい、請求項６に記載の方法。
【請求項８】
前記読み出しストリームにおけるクライアント読み出し要求の数は、前記先読みデータの量の選択に使用される前記１以上のファクタのうちの１つである、請求項１に記載の方法。
【請求項９】
前記読み出しストリームにおいて処理されるクライアント読み出し要求の数は、前記読み出しストリームに関連するリードセットデータ構造にカウント値として記憶される、請求項８に記載の方法。
【請求項１０】
前記クライアントが要求するデータの量は、前記先読みデータの量の選択すに使用される１以上のファクタのうちの１つである、請求項１に記載の方法。
【請求項１１】
前記クライアントが要求するデータが大きい場合、前記選択される先読みデータの量は、所定の上限に等しくなるように設定される、請求項１０に記載の方法。
【請求項１２】
前記読み出しストリームにおいて処理されるクライアント読み出し要求の数が第１の閾値よりも大きい場合、前記選択される先読みデータの量は２倍にされる、請求項１に記載の方法。
【請求項１３】
(i)前記読み出しストリームにおいて処理されるクライアント読み出し要求の数が第２の閾値よりも大きい場合、又は、(ii)前記読み出しストリームに関連するメタデータのセットが、前記クライアントが要求するデータがリードワンスデータであることを示している場合、前記クライアントが要求するデータは、リードワンスデータとして識別される、請求項１に記載の方法。
【請求項１４】
前記選択される先読みデータの量は、フラッシュキューにキューイングされた１以上のバッファに記憶され、前記フラッシュキューは、所定時間の後にバッファを拒否するように構成される、請求項１に記載の方法。
【請求項１５】
前記所定時間は２秒である、請求項１４に記載の方法。
【請求項１６】
装置に記憶されるデータコンテナにおいて確立される読み出しストリームに対し、読み出される先読みデータの量を最適化するストレージオペレーティングシステムを実施するように構成された装置であって、
前記ストレージオペレーティングシステムに対して前記読み出しストリームを含むデータコンテナから読み出すことをクライアントが要求するデータを示すクライアント読み出し要求を受信する手段と、
受信した前記クライアント読み出し要求に応じて、前記ストレージオペレーティングシステムが、前記データコンテナからの先読みデータの読み出しを許可されているか否かを判定する手段と、
前記データコンテナから読み出す先読みデータの量を１以上のファクタに基づいて選択する手段と、
選択された前記量の先読みデータを前記データコンテナから読み出す手段と
からなる装置。
【請求項１７】
前記データコンテナは、ファイル、ディレクトリ、ｖｄｉｓｋ、又は、ＬＵＮである、請求項１６に記載の装置。
【請求項１８】
前記クライアントが要求するデータによって前記読み出しストリームが所定の次の先読み値を超えて拡張される場合、前記ストレージオペレーティングシステムは、前記データコンテナから先読みデータを読み出すことが許可されるものと判断される、請求項１６に記載の装置。
【請求項１９】
前記所定の次の先読み値を、前記選択される量の先読みデータの或る割合に基づいて更新する手段を更に含む、請求項１８に記載の装置。
【請求項２０】
前記先読みデータの量の選択に使用される１以上のファクタは、
(i)クライアントが要求するデータの量、
(ii)前記読み出しストリームにおいて処理されるクライアント読み出し要求の数、
(iii)前記データコンテナに関連する読み出しアクセススタイル
のうちの少なくとも１つを含む、請求項１６に記載の装置。
【請求項２１】
前記読み出しストリームにおいて処理されるクライアント読み出し要求の数が第１の閾値よりも大きい場合、前記選択される先読みデータの量は２倍にされる、請求項１６に記載の装置。
【請求項２２】
ストレージシステムに記憶されるデータコンテナにおいて確立される読み出しストリームに対し、読み出される先読みデータの量を最適化するように構成されたストレージシステムであって、
前記読み出しストリームを含むデータコンテナから読み出すことをクライアントが要求するデータを示すクライアント読み出し要求を受信するネットワークアダプタと、
受信した前記クライアント読み出し要求に応じて、前記ストレージオペレーティングシステムが、前記データコンテナからの先読みデータの読み出しを許可されているか否かを判定するステップと、前記ストレージオペレーティングシステムが、前記データコンテナからの先読みデータの読み出しを許可されている場合、(i)前記データコンテナから読み出す先読みデータの量を１以上のファクタに基づいて選択し、(ii)選択された前記量の先読みデータを前記データコンテナから読み出すステップとを実施するストレージオペレーティングを実施するための命令を記憶するように構成されたメモリと
からなるストレージシステム。
【請求項２３】
前記データコンテナは、ファイル、ディレクトリ、ｖｄｉｓｋ、又は、ＬＵＮである、請求項２２に記載のストレージシステム。
【請求項２４】
前記クライアントが要求するデータによって前記読み出しストリームが所定の次の先読み値を超えて拡張される場合、前記ストレージオペレーティングシステムは、前記データコンテナから先読みデータを読み出すことが許可されているものと判断される、請求項２２に記載のストレージシステム。
【請求項２５】
前記所定の次の先読み値は、前記選択された量の先読みデータの或る割合に基づいて更新される、請求項２４に記載のストレージシステム。
【請求項２６】
前記先読みデータの量の選択に使用される１以上のファクタは、
(i)クライアントが要求するデータの量、
(ii)前記読み出しストリームにおいて処理されるクライアント読み出し要求の数、
(iii)前記データコンテナに関連する読み出しアクセススタイル
のうちの少なくとも１つを含む、請求項２２に記載のストレージシステム。
【請求項２７】
前記クライアント読み出し要求において処理されるクライアント読み出し要求の数が第１の閾値よりも大きい場合、前記選択される先読みデータの量は２倍にされる、請求項２２に記載のストレージシステム。
【請求項２８】
ストレージシステムに記憶されるデータコンテナにおいて確立される読み出しストリームに対し、読み出される先読みデータの量を最適化するための方法をストレージシステムにおいて実施されるストレージオペレーティングシステムにおいて実施するためにプロセッサにおいて実行される命令を含むコンピュータ読取可能媒体であって、前記方法が、
前記ストレージオペレーティングシステムに対して前記読み出しストリームを含むデータコンテナから読み出すことをクライアントが要求するデータを示すクライアント読み出し要求を受信し、
受信した前記クライアント読み出し要求に応じて、前記ストレージオペレーティングシステムが、前記データコンテナからの先読みデータの読み出しを許可されているか否かを判定し、
前記ストレージオペレーティングシステムが、前記データコンテナからの先読みデータの読み出しを許可されている場合、
(i)前記データコンテナから読み出す先読みデータの量を１以上のファクタに基づいて選択するステップと、
(ii)選択される前記量の先読みデータを前記データコンテナから読み出すステップとを実施することからなる、コンピュータ読取可能媒体。
【請求項２９】
前記データコンテナは、ファイル、ディレクトリ、ｖｄｉｓｋ、又は、ＬＵＮである、請求項２８に記載のコンピュータ読取可能媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
発明の分野
本発明はストレージシステムに関し、特に、ストレージシステムにおいて複数の読み出しストリームに対してそのファイル先読み処理を適宜調節する技術に関する。
【背景技術】
【０００２】
発明の背景
「ストレージシステム」とは、ディスクのようなストレージデバイス上での情報の編成に関するストレージサービスを提供するコンピュータである。ストレージシステムは、情報をディスク上に記憶されるデータブロックのセットとして論理編成するためのストレージシステムを有する。従来のストレージ・エリア・ネットワーク（ＳＡＮ）のようなブロックベースのデプロイメントでは、ストレージシステムにおいてデータブロックが直接アドレス指定される場合がある。しかしながら、ネットワーク・アタッチド・ストレージ（ＮＡＳ）環境のようなファイルベースのデプロイメントでは、オペレーティングシステムは「ファイルシステム」を実施し、データブロックをアドレス指定可能なファイルやディレクトリの階層構造としてディスク上に論理編成する。この文脈において、ディレクトリは、他のファイルやディレクトリに関する情報を記憶する特殊な形式のファイルとして実施される場合がある。
【０００３】
ストレージシステムはクライアント／サーバモデルの情報配送に従って動作するように構成され、それによって、多数のクライアントシステム（クライアント）が、ストレージシステムに記憶されたファイルのような共有リソースにアクセスすることができる。ストレージシステムは通常、地理的に分散されたイーサネット（Ｒ）リンクのような相互接続通信リンクの集まりからなるコンピュータネットワーク上に配置され、クライアントは、遠隔からストレージシステム上の共有情報（例えば、ファイル）にアクセスすることができる。クライアントは通常、トランスミッション・コントロール・プロトコル／インターネット・プロトコル（ＴＣＰ／ＩＰ）のような所定のネットワーク通信プロトコルに従ってフォーマットされた個々のデータフレーム又はデータパケットをやりとりすることにより、ストレージシステムと通信する。この文脈において、「プロトコル」は、相互接続されたコンピュータが互いに交信する方法を規定する一連のルールから構成される。
【０００４】
ファイルベースのデプロイメントでは、クライアントは、セマンティックレベルのアクセスを使用して、ストレージシステム上に記憶されたファイルやファイルシステムにアクセスする。例えば、クライアントは、ストレージシステム上に記憶された特定ファイルに対する情報のリード（「読み出し」）又はライト（「書き込み」）を要求する場合がある。クライアントは通常、コモン・インターネット・ファイル・システム（ＣＩＦＳ）プロトコル、ネットワーク・ファイル・システム（ＮＦＳ）プロトコルやダイレクト・アクセス・ファイル・システム（ＤＡＦＳ）プロトコルのような従来のファイルベースのアクセスプロトコルに従ってフォーマットされたファイルシステム・プロトコル・メッセージ（パケットの形をしている）を発行することにより、ファイルベースのストレージシステムにサービスを要求する。クライアント要求は、要求するデータがディスク上に記憶されている具体的な場所、例えばデータブロックとは無関係に、アクセスすべき１以上のファイルを指定する。ストレージシステムは、受信したクライアント要求をファイルシステムセマンティックからストレージディスク上のデータブロックの対応範囲に変換する。クライアント「リード」要求の場合、クライアントの要求したデータを含むデータブロックが読み出され、要求されたデータはクライアントへ返される。
【０００５】
ブロックベースのデプロイメントでは、クライアント要求は、ストレージシステムにおける特定のデータブロックを直接アドレス指定することができる。ブロックベースのストレージシステムの中には、自分が有するデータブロックをデータベースの形に編成するものもあれば、自分が有するデータブロックをファイル指向構造として内部的に記憶するものもある。データはファイルとして編成されるが、クライアント要求情報は、独自のファイルマッピングを維持し、ファイルセマンティックを管理すると共に、ストレージシステムに対するクライアントの要求（及び、対応する応答）は、要求する情報をディスク上のブロックアドレスとしてアドレス指定する。このように、ブロックベースのストレージシステムにおけるストレージバスは、遠くのクライアントシステムにまで延びているように見える場合がある。この「拡張バス」は通常、ＦＣ（ＦＣＰ）又はＴＣＰ／ＩＰ／イーサネット（Ｒ）上にカプセル化されたスモール・コンピュータ・システム・インタフェース（ＳＣＳＩ）プロトコル（ｉＳＣＳＩ）のようなブロックベースのアクセスプロトコルを使用して動作するように構成されたファイバ・チャネル（ＦＣ）またはイーサネット（Ｒ）媒体として実施される。
【０００６】
ブロックベースのシステムにおける各ストレージデバイスには通常、一意に定められた論理ユニット番号が割り当てられ、遠隔のクライアントは、論理ユニット番号を使用して各ストレージデバイスをアドレス指定することができる。すなわち、「イニシエータ」クライアントシステムは、「ターゲット」ＬＵＮに記憶された特定範囲のデータブロックのデータ転送を要求することができる。例えば、クライアント要求は、ターゲット・ストレージデバイスにおける開始データブロックと、そのクライアント要求に従って記憶又は読み出しされる連続したブロックの数とを指定する場合がある。例えば、クライアント「リード」要求の場合、要求された範囲のデータブロックが読み出され、それらが要求元のクライアントに返される。
【０００７】
一般に、ファイルシステムは、「ディスク上」のデータブロック、例えば、ｄｂｎアドレス空間において割り当てられた個々のディスクブロック番号（ｄｂｎ）に直接アクセスはしない。代わりに、ディスク上に記憶されたデータブロック、例えばｄｂｎアドレス空間におけるデータブロックと、ファイルシステムによって編成された同じデータブロック、例えばボリュームブロック番号（ｖｂｎ）空間における同じデータブロックとの間には、一対一のマッピングが存在する。例えば、ファイルシステム内において、Ｎ個のディスク上のデータブロックは、各データブロックにゼロからＮ−１までの間の一意に定められたｖｂｎを割り当てることによって管理される場合がある。さらに、ファイルシステムは、ファイルシステムによって管理されるファイルやディレクトリに、データブロックのセット（すなわち、ｖｂｎ）を関連付ける場合がある。この場合、ファイルシステムは、そのファイル又はディレクトリ内の各データブロックに、対応する「ファイルオフセット」又はファイルブロック番号（ｆｂｎ）を属性として与える場合がある。例えば、ファイル又はディレクトリにおけるファイルオフセットは、固定サイズのデータブロック、例えば、４キロバイト（ｋＢ）ブロックを単位として測定され、従って、そのファイル又はディレクトリにおけるｆｂｎ番号に一対一にマッピングすることができる。したがって、各ファイル又はディレクトリは、ファイルシステムにおいて連続した番号のｆｂｎが割り当てられた一連のデータブロックとして定義され、その場合、例えば、各ファイル又はディレクトリ内の最初のデータブロックには、ゼロのような所定の開始ｆｂｎ番号が割り当てられる。なお、ファイルシステムは、ファイルごとに一連のｆｂｎ番号を割り当てる一方、ファイルシステムは通常、より広いボリュームアドレス空間全体にわたってｖｂｎ番号を割り当てる。
【０００８】
「読み出しストリーム」は、要求ファイル内の論理的に連続した範囲のファイルオフセットからのデータの読み出しをストレージシステムに命じるための１以上のクライアント要求のセットとして定義される。換言すれば、読み出しストリームの最初の要求が受信された後、その読み出しストリーム内の後続のクライアント要求は全て、そのストリームの前回の要求によってアクセスされたファイル内の連続した一連のファイルオフセットを論理的に「拡張」する。したがって、読み出しストリームは、連続した番号のｆｂｎが割り当てられた一連のデータブロックの読み出しをストレージシステムに命じるための一連のクライアント要求として、ストレージシステムによって構文解釈される場合がある。例えば、読み出しストリーム中の最初の要求は、ｆｂｎ１０〜１９が割り当てられたデータブロックの第１のセットを読み出し、読み出しストリーム中の第２の要求は、ｆｂｎ２０〜２５が割り当てられたデータブロックの第２のセットを読み出し、読み出しストリーム中の第３の要求は、ｆｂｎ２６〜４２が割り当てられたデータブロックの第３のセットを読み出す場合がある等である。なお、読み出しストリーム中のクライアント要求は、読み出しストリームの論理的に連続した範囲のファイルオフセットからのデータの読み出しをストレージシステムに明示するものであればよく、ファイルベースのセマンティックを使用する場合もあれば、ブロックベースのセマンティックを使用する場合もある。
【０００９】
動作上、ストレージシステムは通常、同じファイルに対する順番に並んだ一連のクライアントアクセスに基づいて、読み出しストリームを識別する。以下で使用されるように、「ファイル」という用語は、ゼロ以上の読み出しストリームを確立することが可能な任意のデータセットとして広く解釈される。したがって、ファイルは、ファイルベースのストレージシステムに記憶されたファイル又はディレクトリであってもよい。従来、ストレージシステムは、一度に１つのファイルしかモニタリングすることができない。その目的のために、ストレージシステムは、クライアントが現在要求しているファイルデータのために、ストレージシステムが、そのファイル内にすでに確立されている読み出しストリームを論理的に拡張するデータブロックのセットを読み出す必要があるか否かを判定する。必要である場合、そのクライアント要求は読み出しストリームに関連付けられ、読み出しストリームは、読み出されたデータブロックの数だけ拡張される場合がある。
【００１０】
読み出しストリームを識別すると、ストレージシステムは推測的「先読み」処理を使用して、将来のクライアント読み出し要求によって要求される可能性があるデータブロックを読み出す。これらの「先読み」ブロックは通常ディスクから読み出され、ストレージシステムのメモリ（すなわち、バッファキャッシュ）に記憶され、その際、各先読みデータブロックは異なるファイルシステムｖｂｎに関連付けられる。従来の先読みアルゴリズムはしばしば、読み出しストリームを論理的に拡張する所定数のデータブロックを「プリフェッチ」するように構成される。例えば、読み出しストリームが、連続的な番号のｆｂｎが割り当てられた一連のデータブロックを読み出すためのクライアント読み出し要求を含む場合、ファイルシステムは、その読み出しストリーム内のクライアント要求によって先読みブロックがまだ要求されていない場合であっても先読み処理を実施し、その読み出しシーケンスをさらに拡張するｆｂｎが割り当てられたデータブロックを更に読み出す場合がある。
【００１１】
通常、或るファイルの読み出しストリームが、ファイルオフセット又はメモリアドレスの所定のセットのうちの１つに到達すると常に、それを「トリガ」として先読み処理が実施される。例えば、ファイルオフセットの所定のセットが、ファイル内の３２番目ごとのオフセット（すなわち、ファイルブロック番号０、３２、６４など）から構成されるものと仮定する。また、既存の読み出しストリームがｆｂｎ番号４から開始され、ｆｂｎ番号２７まで拡張されるものと仮定する。ｆｂｎ番号２８〜３４の読み出しをストレージシステムに命じるクライアント要求が受信されると、そのクライアント要求は、所定のｆｂｎ番号３２を超えてその読み出しストリームを拡張し、それをトリガとして先読み処理が開始される。したがって、従来の先読みアルゴリズムは、ｆｂｎ番号３５から始まる所定数のデータブロック、例えば２８８個のデータブロックをディスクから読み出し、その読み出しストリーム内の将来の読み出し要求に備えてキャッシュに記憶する。
【００１２】
従来の先読みアルゴリズムは特定状況下では良好に機能するが、それらは一般に、種々の欠点を有している。例えば、従来のアルゴリズムは、所定数の先読みデータブロック、例えば２８８個のデータブロックを読み出すが、これらのデータブロックは、読み出しストリームによっては不適当な数のデータブロックである場合がある。すなわち、ファイル読み出しストリームが比較的小さい場合、この固定数の先読みデータブロックは、余剰な読み出しデータ量である場合がある。一方、ファイル読み出しストリームのサイズを大きくすると、先読みサイズの積極性が増すことから、恩恵が得られる場合がある。また、固定数の先読みデータブロックは、他の理由からも不適当である場合がある。例えば、先読みストリームが、比較的少量のデータを要求するクライアント読み出し要求を含む場合、大きな固定数の先読みデータブロックの読み出しは、クライアント要求データが比較的少量である場合、不釣合いになる場合がある。
【００１３】
また、比較的大きな固定数の先読みデータブロックを使用する従来の先読みアルゴリズムは、ストレージシステムにおいて余分な量のバッファメモリを消費する場合がある。この余分なメモリ使用量、すなわち、「キャッシュポルーション」によって、ストレージシステムは他のシステム処理に必要なメモリやリソースが消費され、その結果、システムの性能に悪影響が及ぶ場合がある。例えば、そのようなキャッシュポルーションは、バッファメモリからのデータ読み出しの待ち時間を増加させることがある。なぜなら、ストレージシステムは、先読みデータを記憶している多数の「コア内」バッファを検索しなければならなくなるからである。
【００１４】
従って、１以上の読み出しストリームに対し、読み出す先読みデータの量を調節可能な先読みアルゴリズムを実施することが、ストレージシステムにとって望ましい。先読みアルゴリズムは、ストレージシステムにおけるキャッシュポルーションを低減するように構成されなければならない。
【００１５】
発明の概要
本発明は、ファイルシステムによって管理される各読み出しストリームに対し、読み出される先読みデータの量を最適化するように構成されたファイルシステムを実施するストレージシステムを提供する。このファイルシステムは、種々のファクタに応じて、各読み出しストリームに対して最適な読み出しサイズを選択する。こうしたファクタには、読み出しストリームにおける処理される読み出し要求の数、読み出しストリームにおいて要求されるクライアント要求データの量、読み出しストリームに関連する読み出しアクセススタイルなどがある。また、ファイルシステムは、各読み出しストリームに対して先読み処理が実施される場合を減らすとともに、各読み出しストリームによって読み出されたデータがメモリに保持されている時間を判定することにより、キャッシュポルーションを最小限に抑えるように構成される。
【００１６】
一実施形態によれば、ファイルシステムは、各読み出しストリームに対し、先読みメタデータの個別のセットを管理する。その結果、ファイルシステムは、読み出しストリームに関連するメタデータのセットに記憶された設定パラメータを変更することによって、各読み出しストリームについて、先読み処理を個別に調節することができる。例えば、各読み出し処理に関連する先読みメタデータのセットは、とりわけ、先読み処理が実施されるタイミングを示す指示、読み出す先読みデータの量、及び、読み出された先読みデータをバッファキャッシュに保持していなければならない時間を含む。有利なことに、読み出しストリームに関連する先読みメタデータのセットの中身は、クライアント要求の処理に応じて動的に調節することができ、プリフェッチされる先読みデータの量を最小限に抑え、ストレージシステムにおけるキャッシュポルーションを最小限に抑えるように調節することができる。
【００１７】
他の実施形態によれば、先読みメタデータの各セットは、対応する「リードセット」データ構造に記憶される。ファイルシステムは、ストレージシステム内の要求された各ファイルに対し、ゼロ以上のリードセットの異なるセットを割り当てる。このようにすると、各要求ファイルは、そのファイルに割り当てられたリードセットの数に等しい数の同時読み出しストリームを有することが可能になる。例示的実施形態において、ファイルのリードセットは、そのファイル内のデータを読み出すための最初の要求の受信に応じて動的に割り当てられる。割り当てられるリードセットの数は、ファイルのサイズが増加するのに従って増加させることが望ましい。
【００１８】
本発明の上記の利点及び他の利点は、添付の図面と合わせて下記の説明を参照すると分かりやすいであろう。図中、同じ参照符号は同様の要素または機能的に同様の要素を示している。
【発明を実施するための最良の形態】
【００１９】
Ａ．ストレージシステム
図１は、ディスク１６０のようなストレージデバイス上での情報の編成に関するストレージサービスを提供するように構成されたマルチプロトコル・ストレージ・アプライアンス１００を示す略ブロック図である。ストレージディスクは、ＲＡＩＤ（Redundant Array of Independent Disks）のような種々の構成で構成される場合がある。図示のストレージ・アプライアンス１００は、システムバス１１５によって相互接続されたプロセッサ１１０、メモリ１５０、複数のネットワークアダプタ１２０、１４０、及び、ストレージアダプタ１３０を含むストレージシステムとして実施される。
【００２０】
図示の実施形態において、メモリ１５０は、本発明に関係するソフトウェアプログラムコードやデータ構造を記憶するために、プロセッサ１１０やアダプタ１２０、１４０によってアドレス指定可能な複数の記憶場所を有する。メモリの一部は、１以上のｉｎｏｄｅデータ構造を記憶するｉｎｏｄｅ「プール」１５４、及び、リードセットデータ構造を記憶するリードセットプール１５２として編成される。メモリの他の部分は、データバッファ１２００を格納するバッファキャッシュ１５６としてさらに編成される場合がある。プロセッサ及びアダプタは、ソフトウェアコードを実行し、メモリ１５０に記憶されたデータ構造を操作するように構成された処理要素、及び／又は、論理回路を含む場合がある。ストレージオペレーティングシステム２００は、その一部が通常、メモリに常駐し、処理要素によって実行され、とりわけ、ストレージアプライアンスによって実施されるストレージサービスを支えるストレージオペレーションを実施することにより、ストレージアプライアンスの機能を構成する。当然ながら、当業者であれば、本明細書に記載する本発明のシステム及び方法に関係するプログラム命令の記憶及び実行のために、他の処理手段や、種々のコンピュータ読取可能媒体を含む他の記憶手段を使用してもよいことは明らかであろう。
【００２１】
ディスク１６０に対するアクセスを可能にするために、ストレージオペレーティングシステム２００は、仮想化モジュールと協働するｗｒｉｔｅ−ａｎｙｗｈｅｒｅファイルシステムを実施し、ディスク１６０によって提供される記憶空間を「仮想化」する。ファイルシステムは、情報を名前付きのディレクトリやファイルの階層構造としてディスク上に論理編成する。「ディスク上」の各ファイルは、データのような情報を記憶するように構成されたディスクブロックのセットとして実施され、ディレクトリは他のファイルやディレクトリの名前やそれらへのリンクが記憶された特殊な形式のファイルとして実施される場合がある。仮想化モジュールによれば、ファイルシステムは、情報をブロックの階層構造として更に論理編成し、それを名前付きの論理ユニット番号（ＬＵＮ）としてエキスポートすることが可能になる。
【００２２】
本明細書で使用されるように、「ストレージオペレーティングシステム」という用語は通常、データアクセスを管理するコンピュータ上で動作するコンピュータ実行可能コードを指し、マルチプロトコル・ストレージ・アプライアンスの場合、データアクセス・セマンティックを実施する場合がある。ストレージオペレーティングシステムは、カリフォルニア州サニーベイルにあるネットワーク・アプライアンス・インコーポレイテッドから市販されているＤａｔａ  ＯＮＴＡＰオペレーティングシステムと同様に、マイクロカーネルとして実施することができる。また、ストレージオペレーティングシステムは、ＵＮＩＸやｗｉｎｄｏｗｓ  ＮＴのような汎用オペレーティングシステム上で実施してもよいし、本明細書に記載するストレージアプリケーションのために構成された設定可能な機能を有する汎用オペレーティングシステムとして実施してもよい。一般に、任意の適当なストレージオペレーティングシステムが、本明細書に記載する本発明の原理に従って使用するために拡張可能であるものと考えられる。
【００２３】
ストレージアダプタ１３０は、ストレージアプライアンス上で実行されるストレージオペレーティングシステム２００と協働し、クライアント１９０によって要求された情報を取得する。この情報は、ディスク１６０上に記憶されている場合もあれば、情報を記憶するように構成された他の同様の媒体に記憶されている場合もある。ストレージアダプタは、従来のファイバチャネル（ＦＣ）シリアルリンク・トポロジのようなＩ／Ｏ相互接続構成を介してディスクに接続された入出力（Ｉ／Ｏ）インタフェース回路を有する。情報はストレージアダプタによって読み出され、必要に応じて、プロセッサ１１０（または、アダプタ１３０自体）によって処理された後、システムバス１１５を介してネットワークアダプタ１２０、１４０へと転送され、そこで、パケット又はメッセージとして成形され、クライアントへ返される。
【００２４】
ネットワークアダプタ１２０は、例えば、ポイント・ツー・ポイントリンク、ワイドエリアネットワーク（ＷＡＮ）、公衆網を介して実施される仮想施設ネットワーク（ＶＰＮ）、又は、図示のイーサネット（Ｒ）ネットワーク１７５のような共有ローカルエリアネットワーク（ＬＡＮ）を介して、ストレージアプライアンス１００を複数のクライアント１９０ａ，ｂに接続する。したがって、ネットワークアダプタ１２０は、アプライアンスを従来のイーサネット（Ｒ）スイッチ１７０のようなネットワークスイッチに接続するために必要な機械的、電気的、及び、信号回路を含む場合がある。ＮＡＳ系ネットワーク環境の場合、クライアントは、マルチプロトコル・アプライアンスに記憶された情報をファイルとしてアクセスする。クライアント１９０は、トランスミッション・コントロール・プロトコル／インターネット・プロトコル（ＴＣＰ／ＩＰ）のような所定のプロトコルに従って、個々のデータフレーム又はデータパケットをやりとりすることにより、ネットワーク１７５を介してストレージアプライアンスと通信する。
【００２５】
クライアント１９０は、ＵＮＩＸオペレーティングシステムや、Ｍｉｃｒｏｓｏｆｔ  ｗｉｎｄｏｗｓオペレーティングシステムのような種々のオペレーティングシステム上でアプリケーションを実行するように構成された汎用コンピュータであってもよい。クライアントシステムは一般に、ＮＡＳ系ネットワークを介して情報（ファイルやディレクトリの形をしている）を取得するときに、ファイルベースのアクセスプロトコルを使用する。したがって、各クライアント１９０は、ネットワーク１７５を介してファイルアクセスプロトコルメッセージ（パケットの形をしている）をストレージアプライアンスに対して発行することにより、ストレージアプライアンスにサービスを要求することができる。例えば、Ｗｉｎｄｏｗｓオペレーティングシステム上で実行されているクライアント１９０ａは、「ＴＣＰ／ＩＰ  プロトコル  ｏｖｅｒ  ＣＩＦＳ（コモン・インターネット・ファイル・システム）」を使用してストレージアプライアンス１００と通信する場合がある。一方、ＵＮＩＸオペレーティングシステム上で実行されているクライアント１９０ｂは、「ＲＤＭＡ（リモート・ダイレクト・メモリ・アクセス）プロトコル  ｏｖｅｒ  ＴＣＰ／ＩＰ」に従って「ＮＦＳ（ネットワーク・ファイル・システム）プロトコル  ｏｖｅｒ  ＴＣＰ／ＩＰ」または「ＤＡＦＳ（ダイレクト・アクセス・ファイル・システム）プロトコル  ｏｖｅｒ  ＶＩ（仮想インタフェース）トランスポート」を使用して、マルチプロトコルアプライアンスと通信する場合がある。当業者には明らかなように、他のタイプのオペレーティングシステム上で動作しているクライアントも、他のファイルアクセスプロトコルを使用して、一体型マルチプロトコル・ストレージアプライアンスと通信することができる。
【００２６】
ストレージネットワーク「ターゲット」アダプタ１４０は、マルチプロトコル・ストレージ・アプライアンス１００をクライアント１９０に接続する。クライアント１９０は、記憶された情報をブロック、ディスク、又は、論理ユニットとしてアクセスするように構成される場合がある。このＳＡＮ系ネットワーク環境の場合、ストレージアプライアンスは図示のＦＣネットワーク１８５に接続される。ＦＣは、ＳＡＮデプロイメントにおいて主に見られるプロトコルや媒体の適合性に関するネットワーク規格である。ネットワークターゲットアダプタ１４０は、アプライアンス１００を従来のＦＣスイッチ１８０のようなＳＡＮネットワークスイッチに接続するために必要な機械的、電気的、及び、信号回路を有するＦＣホストバスアダプタ（ＨＢＡ）を有する場合がある。ＦＣアクセスを可能にする他に、ＦＣ  ＨＢＡは、ストレージアプライアンスのファイバーチャネルネットワーク処理の負荷を低減する場合がある。
【００２７】
クライアント１９０は一般に、ＳＡＮ系ネットワークを介してブロックやディスクの形をした情報を取得する際に、ＳＣＳＩ（スモール・コンピュータ・システム・インタフェース）プロトコルのようなブロックベースのアクセスプロトコルを使用する。ＳＣＳＩは、ディスク１６０のような異なる周辺機器をストレージアプライアンスに取り付けることが可能な、標準的なデバイス非依存のプロトコルを備えた周辺機器Ｉ／Ｏインタフェースである。ＳＣＳＩ用語において、ＳＡＮ環境で動作するクライアント１９０は、データを求める要求及びコマンドを発行する「イニシエータ」である。したがって、マルチプロトコル・ストレージ・アプライアンスは、イニシエータによって発行される要求に対して要求／応答プロトコルに従って応答するように構成された「ターゲット」である。クライアントがＳＡＮ系データアクセス要求をストレージアプライアンスに送信する場合、クライアントは通常、ディスク１６０上に記憶された個々のデータブロックに対応する論理ブロックアドレスを使用する。
【００２８】
マルチプロトコル・ストレージ・アプライアンス１００は、「ＳＣＳＩ  ｅｎｃａｐｓｕｌａｔｅｄ  ｏｖｅｒ  ＴＣＰ／ＩＰ」（ｉＳＣＳＩ）や「ＳＣＳＩ  ｅｎｃａｐｓｕｌａｔｅｄ  ｏｖｅｒ  ＦＣ」（ＦＣＰ）のような、ＳＡＮデプロイメントで使用される種々のＳＣＳＩ系プロトコルをサポートする。したがって、イニシエータ（以下、クライアント１９０）は、ネットワーク１７８、１８５上にｉＳＣＳＩメッセージやＦＣＰメッセージを発行することにより、ターゲット（以下、ストレージアプライアンス１００）にサービスを要求し、ディスク上に記憶された情報を得ることができる。当業者には明らかなように、クライアントは、他のブロックアクセスプロトコルを使用して、一体型マルチプロトコル・ストレージ・アプライアンスにサービスを要求することもできる。複数のブロックアクセスプロトコルをサポートすることにより、マルチプロトコル・ストレージ・アプライアンスは、異種ＳＡＮ環境におけるディスク及び論理ユニットに対する統一された首尾一貫としたアクセス手段を提供する。
【００２９】
Ｂ．ストレージオペレーティングシステム
図２は、本発明で使用するのに都合がよいストレージオペレーティングシステムの例を示す略ブロック図である。ストレージオペレーティングシステムは、一体型ネットワークプロトコルスタック、すなわち、より一般的には、ブロックアクセスプロトコルやファイルアクセスプロトコルを使用してクライアントがマルチプロトコル・ストレージアプライアンス１００上に記憶された情報にアクセスするためのデータパスを提供するマルチプロトコルエンジンを形成するように構成された一連のソフトウェア層を含む。プロトコルスタックは、ＩＰ層２１２やそれを支える搬送メカニズムのようなネットワークプロトコル層に対するインタフェースであるメディアアクセス層２１０、ＴＣＰ  ＩＰ層２１４、及び、ユーザ・データグラム・プロトコル（ＵＤＰ）層２１６を含む。ファイルシステムプロトコル層は、マルチプロトコルファイルアクセスを可能にし、その目的のために、ＤＡＦＳプロトコル２１８、ＮＦＳプロトコル２２０、ＣＩＦＳプロトコル２２２、及び、ハイパーテキストトランスファープロトコル（ＨＴＴＰ）２２４を含む。ＶＩ層２２６は、ＤＡＦＳプロトコル２１８によって必要とされるような、ＲＤＭＡのようなダイレクト・アクセス・トランスポート（ＤＡＴ）機能を提供するためのＶＩアーキテクチャを実施する。
【００３０】
ｉＳＣＳＩドライバ層２２８は、ＴＣＰ／ＩＰネットワークプロトコル層を介したブロックベースのプロトコルアクセスを可能にし、ＦＣドライバ層２３０は、ＦＣ  ＨＢＡ１４０と協働し、クライアント１９０ａ、ｂに対してブロックアクセス要求及び応答を送受信する。ＦＣドライバ及びｉＳＣＳＩドライバは、ストレージディスク１６０及び他の論理ユニットに対するＦＣ特有のアクセス、及び、ｉＳＣＳＩ特有のアクセスを可能にする。また、ストレージオペレーティングシステム２００はＲＡＩＤサブシステム２４０を有する場合があり、ＲＡＩＤサブシステム２４０は、ＲＡＩＤプロトコルのようなディスクストレージプロトコルを実施するだけでなく、例えばＳＣＳＩプロトコルのようなディスクアクセスプロトコルに従ってストレージディスク１６０からデータブロックを読み出すためのディスクドライバサブシステム２５０を更に実施する場合がある。
【００３１】
ディスクソフトウェア層２４０及び２５０を一体型ネットワークプロトコルスタック層２１０〜２３０に橋渡ししているのは仮想化システムである。仮想化システムは図示のように、例えば、仮想ディスク（「ｖｄｉｓｋ」）モジュール２７０及びＳＣＳＩターゲットモジュール２３５として実施される仮想化モジュールと交信するストレージマネージャ又はファイルシステム２６０によって実施される。ｖｄｉｓｋモジュール２７０は、ファイルシステム２６０の上に層として形成され、ユーザ（システム管理者）がストレージシステムに対して発行するコマンドに応答して、ユーザインタフェース（ＵＩ）２７５のような管理インタフェースによってアクセスすることができる。ＳＣＳＩターゲットモジュール２３５は、ＦＣ／ｉＳＣＳＩドライバ２２８、２３０と、ファイルシステム２６０の間に配置され、ブロック（ＬＵＮ）空間とファイルシステム空間との間における仮想化システムの変換層として機能する。ただし、ＬＵＮは仮想ディスクとして表現される。ＵＩ２７５はストレージオペレーティングシステムの上に配置され、管理者又はユーザが、ＲＡＩＤサブシステム２４０のような種々の層及びサブシステムにアクセスできるような形で配置される。
【００３２】
図示のファイルシステム２６０は、ディスク１６０のようなストレージディスク上に記憶された情報にアクセスするためのボリューム管理機能を備えたメッセージベースのシステムである。すなわち、ファイルシステム２６０は、ファイルシステムセマンティックを提供する他に、通常はボリュームマネージャに関係する機能も更に有する。こうした機能には、(i)ディスクの集合化、(ii)ディスクの記憶帯域幅の集合化、及び、(iii)ミラーリング、及び／又は、パリティ（ＲＡＩＤ）のような信頼性保証などがある。図示のファイルシステム２６０は、ネットワーク・アプライアンス・インコーポレイテッドから市販されているＷｒｉｔｅ  Ａｎｙｗｈｅｒｅ  Ｆｉｌｅ  Ｌａｙｏｕｔ（ＷＡＦＬ）ファイルシステムを実施し、固定サイズの、例えば４キロバイト（ｋＢ）のブロックを使用して、ディスク上のデータを編成する。図示のファイルシステム２６０は、インデックスノード（「ｉｎｏｄｅ」）を使用してファイルを識別し、ファイル属性（例えば、作成時刻、アクセス権、サイズ、及び、ブロック位置など）を記憶する。ｉｎｏｄｅファイルを含めて、ｉｎｏｄｅファイルの使用の詳細については、１９９８年１０月６日に発行されたＤａｖｉｄ  Ｈｉｔｚ他による「Method for Maintaining Consistent States of a File System and for Creating User-Accessible Read-Only Copies of a File System」と題する米国特許第５，８１９，２９２号に記載されており、この特許は参照により本明細書の中で完全に説明されたものとして援用される。
【００３３】
図３は、ファイル３３０のバッファツリーを示す略ブロック図である。バッファツリーは、メモリに記憶されたファイルのブロックの内部表現である。バッファツリーは、ファイル３３０を表わすメタデータを含む最上位ｉｎｏｄｅ３３０を含み、サイズによっては更に、そのファイルの実際のデータを記憶するデータブロック２２０、例えば４ｋＢデータブロックを参照するポインタを更に含む。特に、大きなファイル（例えば、６４ＫＢよりも大きなデータ）の場合、ｉｎｏｄｅ３００における各ポインタは、最大で１０２４個までのポインタを記憶する間接（レベル１）ブロック３１０を参照する場合があり、各間接ブロックは、データブロック３２０を参照することができる。例えば、間接ブロック３１０における各ポインタは、ファイルシステム２６０におけるデータブロック３２０に対応するｖｂｎを識別する値を記憶する場合がある。
【００３４】
動作上、ファイルシステム２６０は、一体型ネットワークプロトコルスタックの種々のソフトウェア層によって処理されたクライアント要求を受信する。例えば、ネットワークアダプタ１２０又は１４０において受信されるクライアント要求は、（層２１０及び２３０の）ネットワークドライバによって処理された後、更なる処理のために、必要に応じて、ネットワークプロトコル層及びファイルアクセス層２１２〜２２８に転送される場合がある。次に、クライアント要求は、ファイルシステム２６０に渡すことが可能なファイルシステム「メッセージ」としてフォーマットされる。このメッセージは、とりわけ、クライアントの要求するファイル、又はディレクトリ（例えば、通常はｉｎｏｄｅ番号によって表わされる）、要求されたファイル又はディレクトリ内における開始オフセット、及び、その開始オフセットの後に続いて書き込み又は読み出しするデータの長さを指定する場合がある。
【００３５】
ファイルシステム２６０は、ディスク上のデータを固定サイズのデータブロック、例えば４ｋＢブロック単位で操作するので、ファイルシステムは、ファイルシステムメッセージに入れて受信された値（ｉｎｏｄｅ、オフセット、長さ）がまだフォーマットされていない場合、それらの値をデータブロックの単位（例えば、ｆｂｎ）に変換しなければならない場合がある。例えば、８ｋＢのクライアント要求ファイルが、ｆｂｎ１１〜１２にそれぞれ割り当てられたディスク上のデータブロックを占めているものと仮定する。また、それらのデータブロックは、ｉｎｏｄｅ番号１７を有するｉｎｏｄｅに記憶されたポインタのセットによってアクセス可能であるものと仮定する。そして、クライアントが、そのファイルのデータのうちの後ろ６ｋＢ、すなわち、ｆｂｎ番号１１における最後の２ｋＢ及びｆｂｎ番号１２における４ｋＢ全体に対するアクセスを要求するものと仮定する。この場合、ファイルシステム２６０は、要求データを（ｉｎｏｄｅ＝１７、ファイルオフセット＝２ｋＢ、長さ＝６ｋＢ）として識別するファイルシステムメッセージを受信する。このファイルシステムメッセージは、受信されたファイルオフセット及び長さの値をデータブロックの単位に変換し、どのデータブロックが、クライアントの要求するデータ、例えば、（ｉｎｏｄｅ＝１７、開始データブロック＝ｆｂｎ１１、読み出すデータブロック＝２ブロック）を有しているかを識別する。
【００３６】
どのデータブロックがクライアントの要求するデータを記憶しているか（例えばｆｂｎ１１と１２）を識別した後、ファイルシステム２６０は、クライアントの要求するデータブロックが、「コア内」バッファのうちの１以上においてアクセス可能であるか否かを判定する。可能であれば、ファイルシステムは、要求されたデータをメモリ１５０から読み出し、読み出したデータをクライアントの要求に従って処理する。ただし、要求されたデータがコア内メモリ１５０に存在しない場合、ファイルシステム２６０は、要求されたデータをストレージディスク１６０からロードする（読み出す）ための処理を生成する。ファイルシステムは、クライアントの要求するデータブロックに割り当てられたｖｂｎ番号（例えば、ｆｂｎ１１及び１２）を識別するメッセージ構造をＲＡＩＤサブシステム２４０に渡し、ＲＡＩＤサブシステム２４０は、そのｖｂｎを対応するディスクブロック番号（ｄｂｎ）にマッピングし、後者をディスクドライバサブシステム２５０の適当なドライバ（例えば、ＳＣＳＩ）に送る。ディスクドライバは、要求されたｄｂｎをディスク２６０から取得し、ファイルシステム２６０による処理に備えて、要求されたデータブロック（複数の場合もあり）をメモリ１５０にロードする。
【００３７】
ファイルシステム２６０は、クライアントの要求するデータを有しているデータブロックの読み出しの他に、ディスクソフトウェア層２４０及び２５０に対し、ディスク１６０からの「先読み」データブロックの更なる読み出しを命じる場合がある。先読みブロック自体がまだ要求されていなくても、それらの先読みデータブロックは、受信したクライアント要求を含む読み出しストリームを論理的に拡張する範囲のデータブロック（例えば、ｆｂｎ）に対応する場合がある。先読みデータブロックは、クライアントの要求するデータブロックと同様に、ディスクソフトウェア層２４０及び２５０によって読み出され、ファイルシステム２６０によってアクセス可能な適当なメモリバッファにコピーされる。これらのメモリバッファはバッファキャッシュ１５６から得られる。ファイルシステムは、読み出したデータブロック内のクライアントが要求するデータを、クライアントの要求に従ってアクセスし、必要に応じて、要求されたデータ、及び／又は、受領確認メッセージを要求元のクライアント１９０に返す。
【００３８】
Ｃ．リードセット
本明細書で使用されるように、「読み出しストリーム」という用語は、要求されたファイル内の論理的に連続した範囲のファイルオフセット（例えば、ｆｂｎ）からのデータの読み出しをストレージオペレーティングシステム２００に命じる１以上のクライアント要求のセットとして定義される。オペレーティングシステムは、将来のクライアント読み出し要求によって読み出しストリーム中で要求される可能性がある１以上のデータブロックをプリフェッチするための推測的先読み処理を使用する場合がある。一実施形態によれば、ストレージオペレーティングシステム２００は、同時に処理される複数の読み出しストリームのそれぞれについて個別に、先読みメタデータのセットを管理する。また、ストレージオペレーティングシステムは、各読み出しストリームが有するメタデータを個別の「リードセット」データ構造に記憶する（すなわち、１つのリードセットあたり１つの読み出しストリーム）。したがって、複数の同時読み出しストリームをサポートするファイル又はディレクトリは、複数の異なるリードセットに関連する場合があり、例えば、ファイル又はディレクトリに関連するｉｎｏｄｅによってアクセス可能である場合がある。
【００３９】
図４は、例示的なｉｎｏｄｅ４００、及び、それに関連するリードセット６００ａ〜ｃのセットを示している。ｉｎｏｄｅ４００は、とりわけ、ｉｎｏｄｅ番号４０２（または他の識別子）、リードセットポインタ４０４、読み出しアクセススタイル４０６、デフォルト先読み値４０８、ファイルメタデータ４１０、及び、データセクション４１２を含む。ｉｎｏｄｅ４００は、そのｉｎｏｄｅに関連するファイル又はディレクトリ内のデータにアクセスするためのクライアント要求をストレージオペレーティングシステム２００が受信すると、ｉｎｏｄｅプール１５４から動的に割り当てられ、又は、取得される。ｉｎｏｄｅ番号４０２（例えば、この例では１７）は、ｉｎｏｄｅ４００に関連するファイル又はディレクトリを一意に識別するために使用される。例えば、クライアント要求は、クライアントがアクセスすることを望む特定範囲のデータを有するファイル又はディレクトリに関連するｉｎｏｄｅ番号を指定する。クライアントが指定するこのｉｎｏｄｅ番号は、そのファイル内の開始オフセットの指示、及び、開始オフセットから開始してアクセスするデータの長さによって占められる場合がある。
【００４０】
リードセットポインタ４０４は、ゼロ以上のリードセットデータ構造６００の記憶場所を示す値を記憶する。動作上、ファイルシステム２６０は、リードセットを動的に割り当てる場合もあれば、リードセットプール１５２から前回割り当てられたリードセットを取得する場合もある。ｉｎｏｄｅ４００に割り当てられた各リードセットは、所定の値のセットを記憶するために初期化される。図示のように、ｉｎｏｄｅ４００に関連するリードセット６００ａ〜ｃはリンクリストとして構成され、各リードセットは、リスト上の次のリードセットの記憶場所を示す値を記憶する「ネクスト」ポインタ６０２を含む。リストの最後のリードセット、例えばリードセット６００ｃにおけるネクストポインタは、そこがリストの終わりであることを示す所定の値「空値（ゼロ）」を記憶する場合がある。図示の実施形態におけるリードセットはリンクリストとして構成されているが、当業者には明らかなように、リードセットはサーチツリーのような他の構成で構成される場合もある。
【００４１】
読み出しアクセススタイル４０６は、ｉｎｏｄｅ４００に関連するファイル又はディレクトリからデータをどのように読み出すかを示す読み出しアクセスパターンを示す値を記憶する。例えば、読み出しアクセススタイルは、そのｉｎｏｄｅを有するファイル内のデータが、例えば、通常パターン、シーケンシャルパターン、又は、ランダムパターンに従って読み出されることを示す場合がある。ストレージオペレーティングシステム２００は、クライアント読み出し要求を処理する際に、読み出しアクセスパターン値４０６を識別し、それを動的に更新する場合がある。あるいは、オペレーティングシステムは、受信されたクライアント読み出し要求に含まれる「キャッシュヒント」等に基づいて、この読み出しアクセス値を設定する場合がある。キャッシュヒントは、要求元クライアントがファイル又はディレクトリからデータを読み出す際に使用する可能性がある読み出しアクセスパターンを示すものである。例えば、オペレーティングシステムは、クライアントによって転送されたＤＡＦＳ要求から、このキャッシュヒントを得る場合がある。ＤＡＦＳキャッシュヒントを含めて、ＤＡＦＳプロトコルの詳細については、２００１年９月１日に出版された「Direct Access File System Protocol, Version 1.00」に記載されており、この文献は参照により本明細書の中で完全に説明されたものとして援用される。
【００４２】
デフォルト先読み値４０８は、ｉｎｏｄｅ４００に関連するファイル又はディレクトリに記憶されたデータに対する将来のクライアント読み出し要求に備えて、プリフェッチ（すなわち、前もっての読み出し）することが可能な所定数のデータブロックを示す。例えば、デフォルト先読み値４０８は、クライアントの要求するデータを有する１以上のデータブロックを読み出した後、将来のクライアント読み出し要求に備えて、ファイルシステムがデータブロックを、例えば、２８８個のデータブロックを更に読み出さなければならないことを示す場合がある。当業者には明らかなように、「先読み」データブロックは、クライアント要求のたびに毎回読み出す必要はなく、所定の先読みアルゴリズムに基づいて取得すればよい。図示の実施形態によれば、デフォルト先読み値４０８は、読み出しアクセススタイル４０６によって異なる場合がある。例えば、ランダム読み出しアクセスパターンの場合、デフォルト先読み値はゼロであり、通常読み出しアクセスの場合よりも、シーケンシャル読み出しアクセスの場合の方が、デフォルト先読み値は大きい場合がある。
【００４３】
ファイルメタデータ４１０は、ｉｎｏｄｅ４００に関連するファイル又はディレクトリに関連する他のメタデータを記憶する。そのようなメタデータには、とりわけ、ユーザＩＤ、グループＩＤ、アクセス・コントロール・リスト、フラグ、他のデータ構造へのポインタ等のようなセキュリティ信用証明がある。また、ｉｎｏｄｅ４００は、そのｉｎｏｄｅに関連するファイル又はディレクトリを含むデータブロック３２０の記憶場所を（直接的又は間接的に）示す１セットのポインタを有するデータセクション４１２をさらに含む。この例では、データセクション４１２におけるポインタは１以上の間接ブロック（図示せず）を指し、それらの間接ブロックは、そのファイル又はディレクトリを含む１セットの連続的なデータブロックの記憶場所を指すポインタを有する。以後、ｉｎｏｄｅ４００からアクセス可能なデータブロックにはそれぞれ、対応するｆｂｎが割り当てられ、ｉｎｏｄｅ４００に関連するファイル（又はディレクトリ）は、連続的なｆｂｎ値が割り当てられた１セットのデータブロックを含むものと仮定する。例えば、データセクション４１２におけるポインタの幾つかは、ｆｂｎ番号９〜１８が割り当てられたデータブロックに記憶されたファイルの部分を指す場合がある。
【００４４】
有利なことに、ｉｎｏｄｅ４００が有するファイル又はディレクトリを含む複数のデータブロック３２０の間に、複数の読み出しストリームを同時に確立することができる。例えば、図示のように、データブロック９〜１８のセットにおいて、２つの同時読み出しストリーム４３０及び４３５が識別される。読み出しストリーム４３０は、ファイルシステム２６０によって読み出される論理的に連続した一連のｆｂｎに対応し、最大でファイルブロック番号９までの（ただし９は含まない）ｆｂｎに対応する。同様に、読み出しストリーム４３５も、論理的に連続した一連のｆｂｎに対応し、最大でファイルブロック番号１５までの（ただし１５は含まない）ｆｂｎに対応する。図示の実施形態において、それら２つの読み出しストリームはそれぞれ、リードセット６００ａ〜ｃのうちの異なる１つに記憶された対応する先読みメタデータのセットに関連する場合がある。
【００４５】
上記のように、各リードセットは、対応する読み出しストリームに関連するメタデータを記憶するように構成される。したがって、図示のｉｎｏｄｅ４００は３つのリードセット６００ａ〜ｃに関連しているので、このｉｎｏｄｅに関連するファイル又はディレクトリは、最大で３つの異なる読み出しストリームをサポートする。ただし、当然ながら、ｉｎｏｄｅは、ゼロ以上の任意数のリードセット６００に関連する場合がある。ｉｎｏｄｅ４００に関連するリードセットの数は、そのｉｎｏｄｅに関連するファイル又はディレクトリのサイズに基づいて決定されることが望ましい。例えば、ファイルのサイズが増加すれば、そのｉｎｏｄｅに割り当てられるリードセットの数も増やされる場合がある。
【００４６】
図５は、列５１０に記憶されたファイルサイズを、列５２０に記憶された割り当てられるリードセットの数に関連付けるのに使用されるテーブル５００の例を示している。この例では、「非常に小さい」ファイル（例えば、＜６４ｋＢ）は、読み出しストリームを確立するだけの十分なデータを持たないため、ゼロ個のリードセットに関連付けられる。一方、「小さい」ファイル（例えば、６４ｋＢ〜５１２ｋＢ）は、単一の読み出しストリームを確立するのに十分な広さであるため、単一のリードセットに関連付けられる。一般に、ファイルサイズが増加するほど、そのファイルがサポートする読み出しストリームの数も増加するため、そのファイルのｉｎｏｄｅに割り当てられるリードセットの数もまた増加する。ファイルシステム２６０は、例えば１以上のクライアント「書き込み」要求を処理した結果、ファイルのサイズが動的に増大するのに応じて、割り当てるリードセットの数を増やす場合がある。
【００４７】
図６は、リードセットポインタ４０４を介してアクセス可能な例示的なリードセット６００を示している。このリードセットは、読み出しストリーム４３０又は４３５のような対応する読み出しストリームに関連するメタデータを含む。リードセット６００は、とりわけ、ネクストポインタ６０２、レベル値６０４、カウント値６０６、最終読み出しオフセット値６０８、最終読み出しサイズ６１０、ネクスト先読み値６１２、先読みサイズ６１４、及び、種々のフラグ６１６を含む場合がある。当業者には分かるように、リードセット６００は、図に明示したもの以外にも、他の情報を更に記憶するように構成される場合がある。上で述べたように、ネクストポインタ６０２は、リードセットのリスト（又は他のデータ構造）内の隣りのリードセットの記憶場所を示す値を記憶する。
【００４８】
レベル値６０４は、リードセット６００の相対的な「年齢」である。レベル値は、所定の上限値と所定の下限値との間の境界内（境界も含む）の整数値であることが望ましい。例えば、レベル値６０４は、所定の下限値ゼロと、所定の上限値２０の間の整数値に制限される場合がある。リードセット６００が最初に割り当てられるときは、リードセット６００が未使用（すなわち、空）であることを知らせるために、レベル値６０４はマイナス１のような特殊な指示値に設定される場合がある。新たに識別された読み出しストリームにリードセットが割り当てられるとき、レベル値６０４は、上限値と下限値の間（境界も含む）の「初期」値に設定される。例えば、所定の下限値と所定の上限値がそれぞれ、ゼロ及び２０である場合、初期値は、それらの間の任意の値、例えば１０に設定される場合がある。リードセット６００に関連する大きなファイル（又はディレクトリ）に使用される初期レベル値を、小さなファイルに使用される初期レベル値に比べて大きくすると、リードセットが時期尚早に老化することを防止するのに役立つ。例えば、非常に大きなファイル（例えば、１０ＧＢよりも大きなファイル）の場合、初期レベル値は１５に設定され、それ以外の場合は１０に設定される場合がある。当然ながら、本発明の文脈において、他の上限値、下限値、及び、初期レベル値が使用される場合もある。
【００４９】
クライアント読み出し要求がファイルシステム２６０によって処理されるたびに毎回、ファイルシステムは、そのクライアント読み出し要求を含む読み出しストリームに関連するリードセットにおけるレベル値６０４をインクリメントする。例えば、レベル値６０４をインクリメントする場合、レベル値６０４は、第１の所定のステップサイズ、例えば１だけ増加される。また、例えば以下で説明するように、リードセットを「再使用」する場合、ファイルシステムは、再使用のために選択されないあらゆるリードセットに記憶されたレベル値をデクリメントする。レベル値６０４は、第２の所定のステップサイズ、例えば１だけデクリメントされる場合がある。
【００５０】
例として、リードセット６００がレベル値６０４として１２を記憶していて、ファイルシステム２６０は、クライアント読み出し要求に対応するファイルシステムメッセージを受信するものと仮定する。クライアント要求がリードセット６００に関連する読み出しストリームに属するものであることをファイルシステムが判定した場合、レベル値６０４は１３にインクリメントされる。一方、クライアント要求が別の読み出しストリームに属している、すなわち、リードセット６００に関連しないものであることが判定された場合、レベル値６０４は１２のまま変更されない。また、受信したクライアント読み出し要求によって、ファイルシステムが別のリードセットを使用しなければならなくなった場合、レベル値６０４は例えば１１にデクリメントされる。このように、レベル値６０４は、クライアント読み出し要求がファイルシステム２６０によって処理されるたびに毎回調節され、リードセット６００が割り当て解除されるか、または、後で説明するように再使用されるまで調節され続ける。この老齢化プロセスは、種々の条件の影響を受ける場合がある。例えば、レベル値６０４が所定の初期値（例えば、１０）未満の値にデクリメントされた場合、次回、そのレベル値はインクリメントされ、レベル値は所定の初期レベル値に設定される場合がある。また、ファイルシステム２６０は、所定の上限値を超えてレベル値６０４がインクリメントされたり、所定の下限値を下回るようにデクリメントされることがないことを保証する場合がある。
【００５１】
カウント値６０６は、リードセット６００に関連する読み出しストリームにおける処理されたクライアント要求の数を記憶する。図示の実施形態において、カウント値は最初はゼロに設定される。そして、そのリードセットに関連する読み出しストリームに含まれるクライアント読み出し要求をファイルシステム２６０が処理するたびに毎回、そのカウント値はインクリメントされる。レベル値６０４と同様に、カウント値６０６も、例えば２１６のような所定の上限値によって制限され、マルチプロトコル・ストレージ・アプライアンス１００のメモリリソースを節約する。
【００５２】
最終読み出しオフセット６０８及び最終読み出しサイズ６１０は合わせて、リードセット６００に関連する読み出しストリームにおける処理された最後（すなわち、最も最近）のクライアント読み出し要求を表わす。最終読み出しオフセット６０８及び最終読み出しサイズ６１０は、データブロック（例えば、ｆｂｎ）単位で値を記憶することが好ましい。例えば、リードセット６００に関連する読み出しストリーム中の最終クライアント読み出し要求の処理に応じて、ファイルシステム２６０が、ファイルブロック番号６から始まる３つのデータブロック（すなわち、ｆｂｎ番号６、７及び８）を読み出すものと仮定する。この場合、最終読み出しオフセット６０８はｆｂｎ番号６に設定され、最終読み出しサイズ６１０は３データブロックに設定される。したがって、将来のクライアント読み出し要求が、ファイルブロック番号９から始まる論理的に連続した別の一連のデータブロックを読み出すためにファイルシステムを必要とする場合、そのクライアント読み出し要求は、読み出しストリームを「拡張」する場合があある。
【００５３】
ネクスト先読み値６１２は、リードセット６００に関連する読み出しストリームに対して先読み処理の次のセットをファイルシステム２６０が実施する場所である所定のファイルオフセット、又は、メモリアドレスの指示を記憶する。詳しくは、クライアント読み出し要求が、ネクスト先読み値６１２によって示されたファイルオフセット又はメモリアドレスを越えて読み出しストリームを拡張するものである場合、ファイルシステムは、将来のクライアント読み出し要求に備えて、その読み出しストリームを更に拡張する先読みデータブロックの別のセットを推測的に読み出す場合がある。それらの先読みデータブロックを読み出した後、ファイルシステム２６０は、その読み出しストリームに対して先読み処理が実施される場所であるネクストファイルオフセット又はメモリアドレスを示すために、ネクスト先読み値６１２を更新する場合がある。先読みデータブロックの読み出しが終わると、それらの先読みデータブロックはメモリ１５０の適当なコア内メモリバッファの中にコピーされ、ファイルシステムはクライアント読み出し要求を終了する。
【００５４】
先読みサイズ値６１４は、ネクスト先読み値６１２を超えて読み出しストリームが拡張される場合にプリフェッチされる先読みデータブロックの数を記憶している。先読みサイズ値６１４は、デフォルト先読み値であってもよいし、先読みアルゴリズムに従って決定された他の値であってもよい。例えば、先読みサイズ値６１４及びネクスト先読み値６１２はそれぞれ、リードセットが割り当てられるときに所定の開始値に初期化される。次に、そのリードセットに対する先読み処理を最初に実施した後、ファイルシステムは、適当な先読みサイズ及びネクスト先読み値を選択するための「初回設定」手順を実施する場合がある。初回設定手順は、「ｒｅａｄ＿ｆｕｌｌ」フラグや「ｄｕｍｐ」フラグの値のような種々の入力パラメータに応じて実施される。ｒｅａｄ＿ｆｕｌｌフラグは、リードセット６００に関連するファイル又はディレクトリ全体が例えばクライアント１９０によって要求されたことを知らせるために使用される。ｄｕｍｐフラグは、リードセット６００に関連するファイルやディレクトリをマルチプロトコル・ストレージ・アプライアンス１００内の新たな場所にコピーするバックアップ手順が実行中であることを知らせることができる。
【００５５】
各リードセット６００は、そのリードセットに関連する読み出しストリームに対して、ファイルシステム２６０が先読み処理を特化するための１以上のフラグ値６１６を含む場合がある。例えば、フラグ値６１６の１つは、読み出しストリームのデータブロックを読み出さなければならない「方向」を示す場合がある。すなわち、ファイルシステムは、論理的に「前方」方向（すなわち、ファイルブロック番号が増加する方向）にデータブロックを読み出すように構成される場合もあれば、論理的に「後方」（すなわち、ファイルブロック番号が減少する方向）にデータブロックを読み出すように構成される場合もある。また、リードセット６００は、「ｒｅａｄ＿ｏｎｃｅ」フラグ６１６を更に含む場合がある。このフラグの値は、そのリードセットに関連する読み出しストリームにおいて読み出されたデータが、例えばバックアップ手順や大きなファイルの転送の一部として、ファイルシステムによって一回だけアクセスされるか否かを示すものである。ｒｅａｄ＿ｏｎｃｅフラグ６１６の値は、その読み出しストリームの読み出しデータを長期にわたってメモリ１５０に記憶しておく必要がないことをファイルシステム２６０に伝えるために使用される場合がある。他のリードセットフラグ６１６としては、とりわけ、「ｌａｒｇｅ＿ｖｏｌｕｍｅ」フラグがある。ｌａｒｇｅ＿ｖｏｌｕｍｅフラグ６１６は、リードセット６００に関連するファイルやディレクトリを含むボリュームが比較的多数のストレージディスク１６０（例えば、１３台以上のディスク）を含むことを示す値に設定される場合がある。
【００５６】
図７は、クライアント要求データ、及び／又は、先読みデータを含むデータブロック３２０の読み出す場合に、ファイルシステム２６０によって生成されるディスクＩ／Ｏ「ヒント」７１０を示す略ブロック図である。クライアント読み出し要求７００の受信に応答して、ファイルシステムはまず、クライアントの要求するデータブロックの位置を探し、それらのデータブロックに関連する先読みブロックが１以上の「コア内」メモリバッファ１２００の中にあるか探すことを試みる。それらのデータブロックがコア内バッファに見付からない場合、ファイルシステムは、どのデータブロックをストレージディスク１６０から読み出すべきかをディスクサブシステム層（例えば、ＲＡＩＤ層及びＳＣＳＩ層２４０及び２５０）に教えるためのディスクＩ／Ｏヒント７１０を生成する。次に、ディスクサブシステムは、ディスクＩ／Ｏヒント７１０によって指定されたデータブロックを読み出し、読み出したデータブロックをバッファ１２００に入れる。バッファ１２００は、例えば、バッファキャッシュ１５６から取得される。ディスク１６０又はメモリ１５０から読み出されたデータブロック３２０を有するバッファ１２００は、ファイルシステム内においてＩ／Ｏベクトル７３０（すなわち、「ｉｏｖｅｃ」）を使用してアクセスすることができる。Ｉ／Ｏベクトル７３０は、とりわけ、読み出されたデータブロック３２０を指す１セットのポインタ（またはｖｂｎ）を含む。また、ｉｏｖｅｃ７３０は、クライアント要求データに関連する他のメタデータ（図示せず）を更に含む場合がある。
【００５７】
ファイルシステム２６０は、受信したクライアント読み出し要求７００、及び、該クライアント読み出し要求７００を含む読み出しストリームに関連するリードセット６００の内容に応じて、ディスクＩ／Ｏヒント７１０を生成する。説明の都合上、クライアント読み出し要求７００は、開始データブロック７０２、例えばｆｂｎ番号１５を指定し、クライアント１９０によって要求された連続したデータブロックの数、例えば３データブロックを指定するものと仮定する。さらに、クライアント読み出し要求７００は、ネクスト先読み値６１２、例えばｆｂｎ番号１６を超えて読み出しストリームを拡張し、それをトリガとして、先読みサイズ６１４、例えば６４データブロックに等しい数の先読みデータブロックを読み出すための先読み処理が開始されるものと仮定する。なお、図示の要求７００の中身はデータブロック単位にフォーマットされているが、他の実施形態では、ファイルシステム２６０は、受信したファイルシステムメッセージをデータブロック単位に変換しなければならない場合もある。
【００５８】
例えば、ディスクＩ／Ｏヒント７１０は、とりわけ、開始データブロックの指示７１２、読み出すデータブロックの総数の指示７１４、読み出すデータブロックのうちのどのくらいの数が「必須読み出し」データブロックであるかを示す指示７１６、読み出すデータブロックのうちのどのくらいの数が「推測的」先読みデータブロック７１８であるかを示す指示７１８、及び、ゼロ以上のＩ／Ｏフラグ値７２０を含む。当業者には明らかなように、ディスクＩ／Ｏヒント７１０は単なる例に過ぎず、ディスクＩ／Ｏヒント７１０は、ファイルシステム２６０からディスクサブシステム２４０及び２５０へ渡される他の情報を含む場合がある。
【００５９】
ディスクＩ／Ｏヒント７１０における開始データブロック７１２は、クライアントによって要求された開始データブロックに対応する。したがって、図示の例では、開始データブロック番号７１２はｆｂｎ番号１５に設定される。読み出すブロックの総数７１４は、ファイルシステム２６０によって要求された論理的に連続したデータブロック（例えば、ｆｂｎ）の数を示す。読み出すブロックの総数７１４は、クライアントによって要求された必須読み出しデータブロック７１６の数だけでなく、同じ読み出しストリームに対する将来のクライアント読み出し要求に備えて必要とされる推測的先読みデータブロックの数７１８も含む。図示のように、読み出すデータブロックの総数７１４は、ファイルシステム６７が、開始データブロック７１２（すなわち、ｆｂｎ１５〜８１）から開始して論理的に連続したデータブロックをディスクストレージから読み出すことを要求していることを示す。必須読み出しデータブロックの数７１６、例えばこの例では３データブロックは、クライアントによって要求されたデータブロックの数に対応する。推測的データブロックの数７１８、例えば６４データブロックは、受信したクライアント読み出し要求７００を含む読み出しストリームに関連するリードセット６００に記憶された先読みサイズ６１４に対応する。
【００６０】
図示の実施形態によれば、１以上の「先読み」条件を満足していない限り、推測的データブロックの数７１８はゼロである。各先読み条件を満足している場合、ファイルシステム２６０は、ディスクＩ／Ｏヒント７１０内の先読みデータブロックの数７１８を先読みサイズ値６１４に等しくなるように設定する。第１の先読み条件は、例えば、ディスクから先読みデータブロックを読み出すことが可能になるまでは、カウント値６０６が所定値、例えば３よりも大きくなければならないというものである。第２の先読み条件は、例えば、クライアント読み出し要求７００によって要求された範囲のデータブロック（例えば、ｆｂｎ）によって読み出しストリームが、それに関連するネクスト先読み値６１２を超えて拡張されない限り、先読みデータブロックの読み出しを禁止するというものである。さらに、第３の先読み条件は、例えば、クライアントの要求するファイル又はディレクトリに関連する読み出しアクセススタイル４０６は、ランダム読み出しアクセススタイルに対応するものであってはならないというものである。
【００６１】
Ｉ／Ｏフラグ７２０は、ファイルシステムが要求されたデータブロックをストレージディスク１６０からどのようにして読み出さなければならないかに関する情報をディスクサブシステム２４０及び２５０に伝えるために使用される。具体的には、このＩ／Ｏフラグは、要求されたデータを読み出す態様に影響を与えるコンフィギュレーション設定をディスクサブシステムに通知するために使用される。例えば、Ｉ／Ｏフラグ７２０の一部は、クライアント読み出し要求７００を含む読み出しストリームに関連するリードセット６００に記憶されたフラグ６１６と同じ空間を占める。例えば、Ｉ／Ｏフラグ７２０は、ｒｅａｄ＿ｏｎｃｅフラグ６１６の値に対応する「ｂｕｆ＿ｃｏｒｅ」フラグを含む場合がある。この場合、ｂｕｆ＿ｏｎｃｅフラグ７２０は、読み出されたデータブロックが一度しか読み出されないであろうことを知らせるために使用され、その結果、読み出されたデータは、２回以上読み出される可能性があるデータの記憶に使用される従来のバッファに比べて短い時間しかデータを保持しないように構成されたバッファ１２００に記憶される。
【００６２】
Ｄ．適応先読み
一実施形態によれば、ファイルシステム２６０は、ファイルシステムによって処理される各読み出しストリームに対し、読み出される先読みデータの量を最適化するように構成される。その目的のために、ファイルシステムは、種々のファクタに応じて、各読み出しストリームに対して最適な先読みサイズ６１４を選択する。そのようなファクタには例えば、読み出しストリーム中で要求されたクライアントの要求するデータの量、読み出しストリームにおいて処理された読み出し要求の数、読み出しストリームのファイル又はディレクトリに関連する読み出しアクセススタイル４０６などがある。
【００６３】
図８は、読み出しストリームに関連する適当な先読みサイズ６１４を選択するために、ファイルシステム２６０によって使用される例示的なテーブル８００を示す略ブロック図である。具体的には、読み出しストリームにおけるクライアント読み出し要求の受信に応じて、ファイルシステムは、受信した要求において要求されたクライアントの要求するデータ８１０の量に応じて、推測的に読み出す先読みデータブロックの数８２０を選択することができる。例えば、クライアントが６４ｋＢ未満のデータを要求している場合、ファイルシステムは、先読みサイズ６１４を所定数Ｎの２倍のデータブロックに設定する。Ｎは例えば３２データブロックである。クライアントが６４ｋＢより大きく１２８ｋＢよりも小さいデータを要求している場合、先読みサイズ６１４は、所定数の４倍のデータブロックに設定される。同様に、クライアントが１２８ｋＢから２５６ｋＢまでのデータを要求している場合、先読みサイズ６１４は、所定数の６倍のデータブロックに設定される。
【００６４】
クライアント読み出しが比較的大きい場合、ファイルシステムは、先読みサイズ６１４をクライアントの要求するデータの大きさの倍数に設定し、最も近いブロック数に切り上げる（又は、切り捨てる）。例えば、クライアントが２５６ｋＢと１０２４ｋＢの間を要求している場合、ファイルシステムは、先読みサイズ６１４をクライアントの要求するデータの大きさの２倍に最も近いファイルブロック番号（ｆｂｎ）に設定する。同様に、クライアントが１０２４ｋＢ〜１０メガバイト（Ｍｂ）を要求している場合、ファイルシステムは、先読みサイズ６１４をその読み出し要求のサイズに設定し、データブロックのサイズ、例えば４ｋＢに丸める。１０Ｍｂを超えるような極端に大きな読み出し要求の場合、先読みサイズ６１４は、推測的に読み出されるデータブロックの数に関する所定の上限値（すなわち、固定値）に設定される場合がある。
【００６５】
なお、先読みサイズ６１４は、他のファクタに基づいて選択してもよい。例えば、ｒｅａｄ＿ｆｕｌｌフラグは、クライアント１９０が、読み出しストリームを含むファイル又はディレクトリの中身全体を要求することを知らせることができる。この場合、初回設定手順は、先読みサイズ値６１４を例えば２５６データブロックのような比較的大きな固定数のデータブロックに設定する場合がある。また、ｄｕｍｐフラグの値が、そのファイル又はディレクトリに対してバックアップ処理が実施されていることを示している場合、先読みサイズ６１４は、例えば１０２４データブロックのようなもっと大きな（すなわち、より積極的な）固定数のデータブロックに設定される場合がある。
【００６６】
テーブル８００は、受信したクライアント読み出し要求のサイズ８１０に基づいて先読みデータブロックの数８２０を決定するための比較的単純な手順を示しているが、当業者には明らかなように、もっと複雑な手順を使用してもよい。例えば、ファイルやディレクトリに対する「準ランダム」読み出しを行うための「スロースタート」アルゴリズムを使用して、クライアントが、幾つかの比較的小さい読み出しからなる複数の比較的短いシーケンス、例えば、３２ｋＢ未満の約３〜６回の読み出しを「集中して」間欠的に実施するようにしてもよい。このアルゴリズムの場合、まず、読み出しストリームに対する先読み処理が実施され、初回設定手順はまず、先読みサイズ６１４を、読み出しサイズの３倍を最も近いデータブロック数に丸めたものと、６データブロックのうちのいずれか大きい方に設定する場合がある。読み出しストリームがネクスト先読み値６１２を超えて拡張される場合、先読みサイズ値６１４は、例えば１．５のような所定のファクタによって増加されるか、又は、６４データブロックのような所定数のデータブロックに設定される場合がある。このように、スロースタートアルゴリズムは、読み出しストリーム中の最初の数回の読み出しについては、比較的少数の先読みデータブロックを読み出し、その後、読み出しストリーム中の後続の先読み処理については、先読みデータブロックの量を増加させる。
【００６７】
図９Ａ〜図９Ｂは、ファイルシステム２６０がディスクＩ／Ｏヒント７１０を生成するために使用する一連のステップを示すフロー図であり、ここで、先読みデータブロック７１８の数は、クライアント読み出し要求７００の受信に応じて適当に選択される。シーケンスはステップ９００から始まり、ステップ９０５へ進み、そこで、クライアント読み出し要求が、マルチプロトコル・アプライアンス１００内のネットワークアダプタ１２０、１４０によって受信される。受信された要求は、ストレージオペレーティングシステム２００の１以上のネットワークプロトコル層によって処理され、ファイルシステム２６０へ転送される。ステップ９１０において、ファイルシステムは、要求７００を含む読み出しストリームを有するリードセット６００を探す。例えば、ファイルシステムは、リードセットに関連する読み出しストリームが、クライアントの要求するデータを有しているデータブロックによって拡張される論理的な一連のデータブロック（例えばｆｂｎ）を有しているか否かに基づいて、受信した要求に「適合する」リードセットを識別する場合がある。
【００６８】
次に、ステップ９１５において、ファイルシステム２６０は、受信したクライアント読み出し要求７００に応答して、先読み処理を実施するか否かを決定する。具体的には、ファイルシステムは、クライアントの要求するデータを有しているデータブロック（ｆｂｎ）によって読み出しストリームが、対応するリードセット６００に記憶されたネクスト先読み値６１２を超えて拡張されるか否かを判定する。先読み値６１２を超えて拡張される場合、ファイルシステムは、ステップ９２０〜９５５に記載されているように、先読み処理を実施することができる。一方、読み出しストリームがそのネクスト先読み値６１２を超えて拡張されない場合、先読み処理の実施は禁止されているものと判断する。その場合、シーケンスはステップ９２５へ進み、そこで、ディスクＩ／Ｏヒント７１０に何も先読み情報を追加することなく、シーケンスはステップ９６０へ進む。
【００６９】
受信した要求７００が、ネクスト先読み値６１２を超えてその読み出しストリームを拡張するものであると判定された場合、ステップ９２０〜９４５において、ファイルシステム２６０は、種々のファクタを考慮して、ディスクＩ／Ｏヒント７１０の中に指定する先読みデータブロックの数７１８を決定する。ステップ９２０において、ファイルシステムは、クライアント読み出し要求が、読み出しアクセススタイル４０６によって先読み処理が禁止されているファイル又はディレクトリ内のデータを要求するものであるか否か、又は、受信した要求が、先読み処理を実施してはならない読み出しアクセススタイルに対応するＤＡＦＳキャッシュヒント等を有しているか否かを判定する。例えば、ファイルシステムは、クライアント要求データの読み出しアクセススタイル４０６が「ランダム」読み出しアクセススタイルに対応している場合、先読み処理を実施しないことを決定する場合がある。その場合、シーケンスはステップ９２５へ進み、そこで、ディスクＩ／Ｏヒント７１０内の推測的先読みブロック７１８の数をゼロに設定し、シーケンスはステップ９６０へ進む。
【００７０】
ステップ９２０において、読み出しアクセススタイルが先読み処理を禁止していない場合、次にステップ９３０において、ファイルシステムは、リードセット６００内のカウント値が例えば３のような所定値以上であるか否かを判定する。カウント値が所定値未満である場合、ファイルシステムは、推測的先読み処理を正当化できるくらい十分な数のクライアント読み出し要求をまだ読み出しストリーム中に受信していないものと判断する。その結果、ステップ９２５においてファイルシステムは、読み出しを行う先読みデータブロックをディスクＩ／Ｏヒント７１０の中に何も指定せず、すなわち、推測的先読みブロックの数７１８をゼロに設定し、シーケンスはステップ９６０へ進む。なお、ｒｅａｄ＿ｆｕｌｌフラグまたはｄｕｍｐフラグのいずれかが、読み出しストリームを含むファイルまたはディレクトリ全体が要求されることを示している場合、ステップ９３０はバイパス（「スキップ」）してもよい。この話の中で、推測的先読み処理は、所定数の読み出し要求が処理されるのを待つことなく、実施される場合がある。
【００７１】
ステップ９３０において、カウント値６０６が所定値（例えば、３）以上である場合、ステップ９３５において、ファイルシステムは、ディスクＩ／Ｏヒント７１０の中に指定する先読みデータブロックの数７１８を決定する。その目的のために、ファイルシステムは、例えばテーブル８００を利用し、先読みデータブロックの数７１８をクライアント要求７００において要求されたデータの大きさの関数として決定する。ファイルシステムは、ｒｅａｄ＿ｆｕｌｌフラグやｄｕｍｐフラグの値といった他のファクタを更に考慮して、先読みデータブロック７１８の数を決定する場合がある。また、ファイルシステムは、スロースタートアルゴリズムのような先読みアルゴリズムを使用して、先読みデータブロックの数を決定する場合もある。選択された先読みデータブロックの数７１８が、クライアントの要求する読み出しストリームに前回関連付けられた先読みサイズ６１４とは異なる場合、その読み出しストリームの先読みサイズ６１４は、選択された先読みデータブロックの数７１８に等しくなるように更新される。
【００７２】
ステップ９４０において、ファイルシステム２６０は、リードセット内のカウント値６０６が、例えば５０のような第１の閾値よりも大きいか否かを判定する。大きい場合、ステップ９４５においてファイルシステムは、先読みデータブロックの数７１８を増加させる（例えば、係数２によって）ことを正当化できるくらい十分な頻度で読み出しストリームがアクセスされたものと判断する。さらに、読み出しストリームが、多数のストレージディスク１６０を有するボリュームにおいて確立されていることをｌａｒｇｅ＿ｖｏｌｕｍｅフラグ６１６が示している場合、ステップ９４５において、複数のディスクからのデータの読み出しを最適化するために、先読みデータブロックの数７１８を更に調節する場合がある。いずれの場合も、ディスクＩ／Ｏヒント７１０中の先読みデータブロックの数７１８は適切に増加され、その読み出しストリームの先読みサイズ６１４も、増加後の先読みデータブロックの数７１８に等しくなるように設定される。
【００７３】
次に、ステップ９５０において、先読みデータブロックの数７１８は、ディスクＩ／Ｏヒント７１０の中に含められる。具体的には、読み出すブロックの総数７１４は、クライアントの要求する必須読み出しデータブロック７１６と、ステップ９２０〜９４５によって判定された推測的先読みデータブロックの数７１８との両方を含むように調節される。なお、ファイルシステム２６０は、バッファキャッシュ１５６を検索し、要求されたデータブロックのうちのいずれかが、「コア内」バッファ１２００に既に記憶されているか否かを判定する。記憶されている場合、ファイルシステムは、バッファキャッシュから入手できないデータブロックだけを読み出すように、ディスクＩ／Ｏヒントを適切に調節する。また、ディスクストレージからのファイルデータの２以上の非連続シーケンスが要求された場合、ファイルシステムは、２以上のディスクＩ／Ｏヒント７１０を生成しなければならない場合がある。
【００７４】
ステップ９５５において、ファイルシステム２６０は、ネクスト先読み値６１２を更新する。例示的実施形態の一態様によれば、ネクスト先読み値は、バッファキャッシュにおけるキャッシュポルーションが最小になるように更新される。例えば、図１０は、先読みサイズ６１４の所定の割合に基づいてネクスト先読み値６１２を設定する方法を示している。図示のように、ファイルの先読みは、ｆｂｎ番号１５〜１７がファイルシステムによって読み出された後に実施され、その際、ファイルに関連する先読みサイズ６１４は６４データブロックに設定される。したがって、ｆｂｎ番号１８〜８１に割り当てられたデータブロックが、プリフェッチされる。
【００７５】
さらに、ネクスト先読み値６１２は、先読みサイズ６１４の所定の割合（例えば５０％）に等しい数のデータブロックによって調節される。ネクスト先読み値６１２を先読みサイズのうちの或る割合として設定することにより、有利なことに、ファイルシステムは、最後にプリフェッチされたデータブロック（例えばｆｂｎ番号８１）より前に、先読み処理の次のセットを実施し、それによって、先読み処理の次のセットが実施されるときに、プリフェッチされたデータブロックの一部が、メモリに残っている可能性を増加させる。このようにして、先読み処理の次のセットを実施する際の、ディスクストレージからの先読みデータブロックの読み出しの待ち時間を短縮することができ、キャッシュポルーションが低減される。
【００７６】
例えば、先読み処理の第１のセットによってｆｂｎ番号１８〜８１が割り当てられたデータブロックが読み出され、ネクスト先読み値６１２がｆｂｎ番号５０（すなわち、６４先読みデータブロックの５０％）に設定された場合、先読み処理の次のセットは、読み出しストリームがｆｂｎ番号５０を超えて拡張されるときに実施されることになる。例えば、先読み処理の次のセットによって、ｆｂｎ番号５０〜１１３が割り当てられた６４個の先読みデータブロックが読み出される場合がある。先読み処理の次のセットによって読み出される先読みデータブロックの範囲（すなわち、ｆｂｎ番号５０〜１１３）は、先読みデータブロックの前回のセット（すなわち、ｆｂｎ番号１８〜８１）と重なっているので、先読み処理の次のセットが実施されるときに、重なった範囲のデータブロック（すなわち、ｆｂｎ番号１８〜８１）はバッファキャッシュの中に既に存在している場合がある。従って、ディスク１６０から読み出さなければならない先読みデータブロックの数は少なくなり、それによって、バッファキャッシュにおけるキャッシュポルーションが低減される。
【００７７】
ステップ９６０において、ファイルシステム２６０は、必要であれば、ディスクＩ／Ｏヒント７１０における１以上のＩ／Ｏフラグ７２０の値を設定する場合がある。例えば、方向フラグ７２０は、要求されたファイルブロック番号が広がる方向をディスクサブシステム２４０及び２５０に知らせるための値に設定される場合がある。図１１は、ｂｕｆ＿ｏｎｃｅフラグ７２０を設定するためにファイルシステムによって使用される場合がある一連のステップを示している。ｂｕｆ＿ｏｎｃｅフラグ７２０は、要求されたデータブロックが「リードワンス（一回読み出し）」データを有しているか否かをディスクサブシステム２４０及び２５０に知らせる。シーケンスはステップ１１００から開始され、ステップ１１１０へ進み、そこで、ファイルシステムは、クライアントの要求する読み出しストリームに関連するカウント値６０６が、例えば５０のような第２のカウント値６０６よりも大きいか否かを判定する。大きい場合、ファイルシステムは、読み出しストリームにおいて十分に多数の読み出し要求が処理されたものと判断し、その読み出しストリームが、バックアップ処理のような大きなリードワンスデータ転送に対応するものと結論する。その場合、シーケンスはステップ１１２０へ進み、そこで、ｂｕｆ＿ｏｎｃｅフラグ７２０を、要求されたデータがリードワンスデータであることを示す値に設定し、シーケンスはステップ１１４０において終了する。
【００７８】
ステップ１１１０においてカウント値６０６が第２の閾値よりも大きくなかった場合、ステップ１１３０においてファイルシステム２６０は、読み出しストリームに関連するリードセット６００内のｒｅａｄ＿ｏｎｃｅフラグ６１６がリードワンスデータ転送に対応するものであるか否かを判定する。例えば、ｒｅａｄ＿ｏｎｃｅフラグ６１６は、クライアントの要求するデータに関連する読み出しアクセススタイル４０６又はＤＡＦＳキャッシュヒントの値に基づいて設定されている場合がある。ｒｅａｄ＿ｏｎｃｅフラグ６１６が、リードワンスデータが読み出されることを示していない場合、シーケンスはステップ１１４０において終了する。そうでなければ、ステップ１１２０において、ｂｕｆ＿ｏｎｃｅフラグ７２０をディスクＩ／Ｏヒント７１０の中に設定し、シーケンスはステップ１１４０において終了する。
【００７９】
Ｉ／Ｏフラグ７２０が適切に調節された後、ステップ９６５において、ディスクＩ／Ｏヒント７１０は、ディスクサブシステム層２４０及び２５０に転送され、次いで、必須読み出しデータブロック７１６及び先読みデータブロック７１８がストレージディスク１６０から読み出される。読み出されたデータブロックはコア内データバッファ１２００にコピーされ、次いで、それが、クライアント読み出し要求７００に対応するｉｏｖｅｃ７３０におけるポインタによって参照される。以下で説明するように、データバッファ１２００は、「フラッシュ」キュー１２１０に記憶される場合もあれば、「通常」キュー１２２０に記憶される場合もある。フラッシュキュー１２１０は、クライアントの要求するデータが通常キュー１２２０に記憶される期間に比べて短い期間だけ、リードワンスデータ及び先読みデータを記憶することによって、キャッシュポルーションを低減するために使用される。したがって、バッファ１２００が記憶されるのは、バッファ１２００が先読みデータを有している場合、又は、ｂｕｆ＿ｏｎｃｅフラグ７２０がディスクＩ／Ｏヒント７１０に設定されている場合である。
【００８０】
図１２は、バッファキャッシュ１５６においてバッファ１２００の管理に使用されるフラッシュキュー１２１０及び通常キュー１２２０を示す略ブロック図である。例えば、先読みデータを有するバッファ１２００は、フラッシュキューに記憶される。フラッシュキューは、例えば２秒のような所定の「フラッシュ閾値」時間の経過後にキューからバッファが「フラッシュ（消去）」されるファーストインファーストアウト方式のキューである。クライアントの要求するデータを有するバッファは通常、ｂｕｆ＿ｏｎｃｅフラグ７２０がディスクＩ／Ｏヒント７１０に設定されていない限り、通常キュー１２２０に記憶される。その場合、それらのバッファは、フラッシュキュー１２１０上にキューイングされる。
【００８１】
動作上、フラッシュキュー１２１０は、(i)通常キューが使用される場合、(ii)フラッシュキューの先頭にあるバッファが、通常キューの先頭にあるものよりも「古い」場合、または、(iii)フラッシュキューの先頭にあるバッファが、所定のフラッシュ閾値時間よりも古い場合に、新たに読み出されたデータブロックを記憶するためのバッファ１２００を得るために使用される。フラッシュキュー１２１０からバッファがアクセスされた後、そのバッファは通常、そのバッファが「老齢化」するまで再度通常キュー１２２０にキューイングされ、したがって、そのバッファは再使用のために選択される（図１２のステップ１）。同様に、通常キュー１２２０においてアクセスされたバッファ１２００は、それらのバッファが老齢化するまで、通常キューに再度キューイングされる。
【００８２】
各バッファの相対年齢を管理するために、従来のバッファエージングポリシーを使用してもよい。したがって、各バッファ１２００は、そのバッファが再使用のためにいつ選択されたを示す「ｂｕｆ＿ａｇｅ」フラグを含む場合がある。あるバッファのｂｕｆ＿ａｇｅフラグは、そのバッファに記憶されたデータが所定の時間の間保持されている間、第１の値に設定され、その後第２の値に設定される場合がある。したがって、ｂｕｆ＿ａｇｅフラグが第２の値に設定されたバッファ１２００は、そのバッファが次回アクセスされ、再度キューイングされるときに、フラッシュキュー１２１０の先頭（すなわち一番前）にキューイングされる（図１２のステップ２）。
【００８３】
例示的実施形態によれば、各バッファ１２００は、そのバッファがリードワンスデータを有しているか否かを示す「ｂｕｆ＿ｏｎｃｅ」フラグを更に含む。したがって、バッファ１２００中のｂｕｆ＿ｏｎｃｅフラグは、そのバッファが何度も読み出される可能性があるデータを含む場合、第１の値に等しい。一方、バッファ１２００中のｂｕｆ＿ｏｎｃｅフラグは、そのバッファがリードワンスデータ、例えば、ディスクＩ／Ｏヒント７１０内のｂｕｆ＿ｏｎｃｅフラグ７２０の値によって識別されるデータを含む場合、第２の値に等しい。バッファ１２００中のｂｕｆ＿ｏｎｃｅフラグが第２の値に等しい場合、そのバッファはフラッシュキュー１２１０にキューイングされ、その中身が第１の時間に読み出されるまで、そのまま維持される。第１の時間に読み出された後、そのバッファのｂｕｆ＿ａｇｅフラグは、そのバッファが老齢化したことを示す第２の値に設定され、そのバッファは、フラッシュキュー１２１０の先頭に再度キューイングされる（図１２のステップ３）。
【００８４】
Ｅ．むすび
上記が、本発明の例示的実施形態に関する詳細な説明である。本発明の思想及び範囲から外れることなく、種々の変更及び追加を施すことも可能である。上記のように、例示的実施形態におけるファイルやディレクトリは、ゼロ以上の読み出しストリームを確立することが可能な任意のデータセットとして広く定義される。従って、この文脈におけるファイルは、ブロックベースのクライアント１９０ｂに対して単一の論理ユニット番号（ＬＵＮ）としてエキスポートすることが可能なデータブロックの所定のセットに対応する「仮想ディスク」（ｖｄｉｓｋ）として実施される場合がある。ただし、仮想ディスクにおけるデータブロックは、マルチプロトコル・ストレージ・アプライアンス内でファイルベースのセマンティックを使用してアクセスされる。このように、ブロックベースのクライアントは、ＦＣＰプロトコルやｉＳＣＳＩプロトコルのような従来のブロックベースのプロトコルに従ってその要求をフォーマットし、それらの要求は、ストレージオペレーティングシステム２００によって実施される仮想化システムにより、ファイルベースのセマンティックを使用して処理される。一般に、例示的実施形態におけるファイルやディレクトリは、ゼロ以上の読み出しストリームを確立することが可能な任意のデータコンテナであってよく、例えば、ファイル、ディレクトリ、ｖｄｉｓｋまたはＬＵＮなどである場合がある。
【００８５】
例示した実施形態は、例えば、読み出しストリーム４３０及び４３５のような、「前方」方向に延びる（例えば、ファイルブロック番号が増加する順番に並ぶ）読み出しストリームを示しているが、当業者には明らかなように、本明細書に記載した発明の概念は、「後方」方向に延びる（例えば、ファイルブロック番号が減少する順番に並ぶ）読み出しストリームに対しても等しく適用可能である。その目的のために、各リードセットにおけるフラグ６１６は、そのリードセットに関連する読み出しストリームが前方方向に延びることを示す第１の値にされる場合もあれば、そのリードセットに関連する読み出しストリームが後方方向に延びることを示す第２の値に設定される場合もある。このように、ファイルシステムは、読み出しストリームの先読みデータブロックを、その読み出しストリームが延びる方向に、例えば、適当なフラグ６１６による指示に従って読み出す。
【００８６】
この説明は、マルチプロトコル・ストレージ・アプライアンス１００を例として書かれているが、その原理は、任意のタイプのコンピュータに適用することができ、例えば、ブロックベースのストレージシステム（例えば、ストレージ・エリア・ネットワーク）のために構成されたものにも、ファイルベースのストレージシステム（例えば、ネットワーク・アタッチド・ストレージシステム）のために構成されたものにも、両方のタイプの組み合わせ（例えば、マルチプロトコル・ストレージ・アプライアンス）のために構成されたものにも等しく適合し、他の形のコンピュータシステムにも適合する。また、当然ながら、本発明の教示は、コンピュータ上で実行されるプログラム命令を含むコンピュータ読取可能媒体を含むソフトウェアでも、ハードウェアでも、ファームウェアでも、それらの組み合わせでも実施することが可能であるものと考えられる。さらに、当業者には分かるように、本明細書に記載した教示は、何らかの特定の実施形態に制限されるものではなく、種々のＯＳプラットフォームによって実施することが可能である。したがって、この説明は単なる例として解釈すべきものであり、本発明の範囲を制限するものとして解釈すべきものではない。
【図面の簡単な説明】
【００８７】
【図１】本発明に従って使用される例示的マルチプロトコル・ストレージ・アプライアンス環境を示す略ブロック図である。
【図２】本発明と共に有利に使用される例示的ストレージオペレーティングシステムを示す略ブロック図である。
【図３】例示的マルチプロトコル・ストレージ・アプライアンスにおけるファイル又はディレクトリに関連する例示的バッファツリーを示す略ブロック図である。
【図４】ｉｎｏｄｅ、及び、該ｉｎｏｄｅに関連するファイル又はディレクトリにおいて確立される読み出しストリームの先読みメタデータの記憶に使用される先読みデータ構造のセットの例を示す略ブロック図である。
【図５】ファイル又はディレクトリのサイズに基づいてファイル又はディレクトリに割り当てられるリードセットの数の判定に使用されるテーブルの例を示す略ブロック図である。
【図６】本発明に従って有利に使用されるリードセットの例を示す略ブロック図である。
【図７】本発明に従ってディスクストレージからデータブロックを読み出すために使用されるディスクＩ／Ｏ「ヒント」の例を示す略ブロック図である。
【図８】本発明に従ってディスクストレージから読み出す先読みデータの量を適宜選択するために使用されるテーブルの例を示す略ブロック図である。
【図９Ａ】ディスクＩ／Ｏヒントを生成するための一連のステップを含むフロー図であり、ディスクＩ／Ｏヒントの中で先読みデータブロックの数が適宜選択される。
【図９Ｂ】ディスクＩ／Ｏヒントを生成するための一連のステップを含むフロー図であり、ディスクＩ／Ｏヒントの中で先読みデータブロックの数が適宜選択される。
【図１０】先読みサイズの所定の割合に基づいて決定されたネクスト先読み値を有するファイル読み出しストリームの例を示す略ブロック図である。
【図１１】ディスクＩ／Ｏヒント中の「ｂｕｆ＿ｏｎｃｅ」フラグの値を設定するための一連のステップを含むフロー図である。
【図１２】本発明に従ってデータバッファの管理に使用されるフラッシュキュー及び通常キューの例を示す略ブロック図である。
【図１】
2007520812.tif 000003
【図２】
2007520812.tif 000004
【図３】
2007520812.tif 000005
【図４】
2007520812.tif 000006
【図５】
2007520812.tif 000007
【図６】
2007520812.tif 000008
【図７】
2007520812.tif 000009
【図８】
2007520812.tif 000010
【図９Ａ】
2007520812.tif 000011
【図９Ｂ】
2007520812.tif 000012
【図１０】
2007520812.tif 000013
【図１１】
2007520812.tif 000014
【図１２】
2007520812.tif 000015
【国際調査報告】
2007520812.tif 000016
2007520812.tif 000017
2007520812.tif 000018