本発明は、ストレージシステムにおいて性能を向上させるための技術に関する。以下、添付図面を参照して本発明の実施形態を説明する。本実施形態は本発明を実現するための一例に過ぎず、本発明の技術的範囲を限定するものではないことに注意すべきである。各図において共通の構成については同一の参照符号が付されている。
第一の実施形態
本実施形態は、従来のストレージシステムにおいてプロセッサが実施していた各データ内部転送の起動/終了の確認を自動化し、性能を向上させる方法の一実施形態である。以下、図面を用いて本実施形態の詳細について説明する。
図1は、本実施形態のストレージシステム1及びデータ処理及び演算を行うホストコンピュータ12を含む、コンピュータシステムの一例を示す。ストレージシステム1は、ストレージコントローラ11、そしてデータを記憶するドライブ14を収容する筐体13を有する。コンピュータシステムは、複数のホストコンピュータ12を含むことができる。ストレージシステム1は、複数のドライブ筐体13を含むことができる。
ドライブ筐体13は、複数のドライブ14を収容している。ドライブ14は、典型的には、不揮発性の磁気ディスクを有するハードディスクドライブ(HDD)又は不揮発半導体メモリ(例えばフラッシュメモリ)を搭載したSolid State Drive(SSD)である。ドライブ14は、ホストコンピュータ12から送られたデータ(ユーザデータ)を格納する。複数のドライブ14がRAID演算によるデータの冗長化を行うことで、1つのドライブ14に障害が発生した場合のデータ消失を防ぐことができる。
ストレージコントローラ11は、ホストコンピュータ12と接続するためのフロントエンド基板2、ドライブ筐体13(ドライブ14)と接続するためのバックエンド基板3、キャッシュメモリ42を搭載するキャッシュメモリ基板41、内部処理を行うプロセッサ44を搭載するプロセッサ基板43、及びそれらを接続する内部ネットワーク46を有する。図1に示すように、ストレージコントローラ11は、典型的には、複数のフロントエンド基板2及び複数のバックエンド基板3を有する。
各フロントエンド基板2は、ホストコンピュータ12との接続を行うためのホストインタフェースLSI21、ストレージコントローラ11内のデータ転送を行うためのデータ転送LSI22、及びホストコンピュータ12とストレージコントローラ11内部のデータ転送とを中継する(ユーザデータを一時的に記憶する)フロントエンドバッファ25を有する。
データ転送LSI22は、フロントエンドバッファ25とキャッシュメモリ42との間のデータ転送を行うフロントエンドDMA23、及びデータ転送の順序制御を行う転送シーケンサ24を有する。ホストインタフェースLSI21は、ホストコンピュータ12とストレージコントローラ11の通信に用いられるFibre Channel(FC)、Fibre Channel Over Ethernet(FCoE)、iSCSI等のプロトコルをストレージコントローラ11内部で用いられるプロトコル、例えばPCI−Expressに変換する機能を有する。
各バックエンド基板3は、ドライブ筐体13との接続を行うためのドライブインタフェースLSI31、ストレージコントローラ11内のデータ転送を行うためのデータ転送LSI32、及びドライブ筐体13とストレージコントローラ11内部のデータ転送とを中継する(ユーザデータを一時的に記憶する)バックエンドバッファ35を有する。
データ転送LSI32は、バックエンドバッファ35とキャッシュメモリ42との間のデータ転送を行うバックエンドDMA33、データ転送の順序制御を行う転送シーケンサ34、及びRAID5、RAID6等のデータ冗長化におけるパリティ計算を行うパリティ生成器36を有する。
ここで、ドライブインタフェースLSI31は、ドライブ14とストレージコントローラ11との間の通信に用いられるFibre Channel(FC)、Serial Attached SCSI(SAS)等のプロトコルをストレージコントローラ11内部で用いられるプロトコル、例えばPCI−Expressに変換する機能を有する。
キャッシュメモリ基板41は、ホストコンピュータ12から読み書きされるユーザデータを一時的に記憶するキャッシュメモリ42を有する。プロセッサ基板43は、ストレージコントローラ11の制御を行うプロセッサ44、及びプロセッサ44が扱うデータやプログラムを格納するためのメモリ45を有する。プロセッサ44が扱うデータやプログラムは、ストレージコントローラ11内の不揮発性メモリ(不図示)又はドライブ14からロードされる。
以降では、データ転送を行うホストインタフェースLSI21、フロントエンドDMA23、バックエンドDMA33、ドライブインタフェースLSI31を総称してデータ転送エンジンと呼ぶ。また、フロントエンドバッファ25、バックエンドバッファ35、及びキャッシュメモリ42を総称してデータ転送中継メモリ又は中継メモリと呼ぶ。キャッシュメモリ42とバッファ25、35は、典型的には、半導体メモリのRAMであり、電源不供給時に記憶データが消える揮発性メモリデバイスである。
中継メモリは、ストレージシステムにおける最終的なデータの格納領域(本例においてドライブ14内の記憶領域)とホストコンピュータ12との間のユーザデータの転送において、ユーザデータを一時的に記憶する。データ転送エンジンは、中継メモリ間、中継メモリとホストコンピュータ12(内の記憶領域)との間、若しくは中継メモリとドライブ14との間においてデータを転送する。
図1は示していないが、ストレージコントローラ11は、他のストレージシステムとの接続のための外部インタフェース基板を含むことができる。外部インタフェース基板は、例えば、外部インタフェースLSI、バッファそしてデータ転送LSIを含む。ストレージコントローラ11は、外部インタフェース基板を介して、他のストレージシステムとの間でコマンド及びユーザデータを送受信する。外部インタフェース基板は、他のストレージシステムのバックエンド基板3、キャッシュメモリ基板41及びフロンエンド基板2のいずれかと接続し、データを転送することができる。
図2は、ホストコンピュータ12からのリード要求(I/O要求の一つ)を受け、ストレージコントローラ11がドライブ14からホストコンピュータ12にデータを転送する際の、ストレージコントローラ11内のデータ転送手順、及び、転送シーケンサ24/34、プロセッサ44の役割分担の一例を示している。転送シーケンサ24/34は、転送シーケンサ24又は34の一方を示す。
図2において、転送シーケンサ24、転送シーケンサ34及びプロセッサ44を示す矩形内の長円は、それぞれの回路が実行する処理を示している。図2に示すように、転送シーケンサ24及び34は同様の処理を行う。本実施形態において、プロセッサ44とは別に転送シーケンサ24、34が与えられている。プロセッサ44とは別のデバイスである転送シーケンサ24、34は、プロセッサ44が特定の処理を実行している間に、それとは異なる処理を実行することができる。転送シーケンサ24、34は、プロセッサ44から独立した別の回路であるが、同一のパッケージ又は同一チップ内に実装されていてもよい。
ドライブ14に格納されているデータは、ドライブインタフェースLSI31によって、バックエンドバッファ35に読み込まれる。その後、バックエンドDMA33は、そのデータをバックエンドバッファ35からキャッシュメモリ42に転送する。その後、フロントエンドDMA23は、当該データをキャッシュメモリ42からフロントエンドバッファ25に転送し、最後に、ホストインタフェースLSI21は、フロントエンドバッファ25からホストコンピュータ12に当該データを転送する。
プロセッサ44は、ホストコンピュータ12から送信されたデータ転送要求を解析する処理51、データが格納されている場所(論理アドレス)を特定すると共に、一連の処理に必要なデータ転送エンジン及びデータ転送中継メモリを特定する転送パス決定処理52、データ転送中継メモリ(内の領域)を必要に応じて確保するメモリ確保処理53を行う。
プロセッサ44は、さらに、転送元アドレス、転送先アドレス及び転送手順等を記述する転送シーケンスを作成する処理54、転送シーケンサへ転送シーケンスを送信する転送シーケンス送信処理55、転送シーケンスの実行結果を転送シーケンサから受信する転送シーケンス実行結果受信処理56、及び、データ転送中継メモリ(内の領域)を必要に応じて解放するメモリ解放処理57を行う。以下において、メモリ(バッファ及びドライブを含む)の確保及び解放は、そのメモリにおける記憶領域の確保及び解放である。
プロセッサ44はプログラムに従って動作することでこれらの処理を実行し、これらの処理を実行する処理部(例えば転送要求解析処理部、転送パス決定処理部、メモリ確保処理部)として動作する。ストレージコントローラ11は、これら処理部を含むコントローラである。
転送シーケンサ24/34は、一連のデータ転送の順序制御を行う。具体的には、直前のデータ転送が成功したかどうかを判定する処理61、データ転送コマンドをデータ転送エンジンに送信する処理62、データ転送エンジンから送られるデータ転送ステータスを受信する処理63、及び、ある転送が終了した際に次の転送コマンドを探す次処理64を行う。
転送シーケンサ24/34は、プログラム(命令コード)に従って動作するプロセッサで構成しても、ハードウェア論理回路で構成してもよい。一部の機能(処理)をプロセッサ(プログラム)により実装し、他の機能(処理)をハードウェア論理回路で実装してもよい。バグフィックスや設計変更のため、プログラムに従って動作するプロセッサにより転送シーケンサの機能(処理)を実現することが好ましい。
プロセッサ44は計算を中心とした演算処理を得意としているが、コマンド送信及び受信処理といった、ストレージコントローラ11内の他の回路(ハードウェアデバイス)との通信処理は、処理内容の割にプロセッサ44の処理時間を消費する。また、プロセッサ44は、他の回路からの通信を受けて次の処理を行う際、関連するデータを読み書きできるようにするコンテキストスイッチ動作を必要とする。
具体的には、プロセッサ44は、それまで行っていた処理で使っていたスタック領域やローカル変数などのデータを待避し、他の回路との通信で受領したデータの処理に必要なデータをスタック領域やローカル変数に回復する。このため、一連の転送シーケンスの内容を予め転送シーケンサ24、34に送信し、転送シーケンサ24、34が転送シーケンスに記載された内容に従って各転送を(転送エンジンを使用して)行うことで、プロセッサ44が各転送の監視、及び上記コンテキストスイッチを行う回数を削減することができる。
このため、一連の転送に要するプロセッサ44の処理時間を大幅に削減することができる。一方、転送シーケンサ24、34の処理は予め指示された転送手順によってデータ転送をデータ転送エンジン21、23、31、33に指示し、転送結果を監視するのみであるので、複雑な処理を必要としない。
従って、転送シーケンサ24、34自体の処理能力は低くても問題とならない。好ましくは、転送シーケンサ24、34の内蔵プロセッサの動作周波数は、メインプロセッサ44の動作周波数よりも低く、これによりコストを低減することができる。また、転送シーケンサ24、34が使用するメモリの容量は、プロセッサ44が使用するメモリ45の容量よりも小さくてよく、それによりコストを低減することができる。
図3は、本発明が適用されるストレージシステム1における、ストレージコントローラ11が行うデータ転送の一例を示すシーケンス図である。本処理は、データ転送が必要となった際に行われる。データ転送が必要となるのは、例えばホストコンピュータ12からデータ転送要求を受領した場合、キャッシュメモリ42の容量不足を解消するためドライブ14に書き込まれていないデータをドライブ14に書き込む必要が生じた場合、若しくはドライブ14の障害や障害からの復旧によりデータの冗長性を回復する必要が生じた場合などである。
本処理では、まず、プロセッサ44が、ユーザデータの転送パスを決定する(52)。具体的には、ユーザデータの一連の転送に用いる、データ転送シーケンサ、データ転送エンジン、データ転送中継メモリを決定する。例えば、ホストコンピュータ12からライトコマンドを受信した際には、ライトコマンドが指定するユーザデータ(ライトデータ)の転送に用いる、ホストインタフェースLSI21、フロントエンドDMA23、及びデータの格納先キャッシュメモリ42を決定する。
次に、プロセッサ44は、データ転送に必要なメモリ資源を確保する(53)。例えば、ホストコンピュータ12からライトコマンドを受信した場合であれば、ホストコンピュータ12に接続されているフロントエンド基板2上のフロントエンドバッファ23及びキャッシュメモリ42を確保する。
プロセッサ44は、次に転送シーケンスを作成する(54)。具体的には、転送シーケンスを構成する転送コマンド及びそのコマンドを処理するデータ転送エンジン、及びデータ転送コマンドの実行順序を記述したデータを作成する。プロセッサ44は、転送シーケンサ24、34のそれぞれのデータ転送ための転送シーケンスを作成する。そして、作成したデータ転送シーケンスを、転送シーケンサ24、34のそれぞれに送信する(55)。このように、転送シーケンスは、転送方法を規定する情報を含む。
転送シーケンスを受領した転送シーケンサ24/34は、転送シーケンス内から最初に実行すべき転送コマンド及びコマンドの送信先転送エンジンを抽出する。そして、転送シーケンサ24/34は、転送エンジンに対して転送コマンドを送信することで、データ転送実行を指示する(62)。
転送シーケンサ24/34からデータ転送実行指示を受けたデータ転送エンジンは、指示された内容に従って、転送中継メモリ間、ホストコンピュータ12と転送中継メモリとの間若しくはドライブ14と転送中継メモリとの間のデータ転送を実行する。そして、データ転送が完了した場合、若しくは何らかのエラーによりデータ転送が失敗した場合、転送エンジンは、転送ステータスを転送シーケンサ24/34に送信する。
転送ステータスを受け取った(63)転送シーケンサ24/34は、転送ステータスの内容を確認し、転送が成功したか失敗したかを判定する(61)。そして、転送が成功していた場合、転送シーケンサ24/34は、予め受け取っている転送シーケンスから次の転送コマンド及びコマンドの送信先転送エンジンを求め(64)、その転送エンジンに対し転送コマンドを送信する。
転送シーケンサ24/34(及び転送エンジン)は以上を繰り返し、該当するシーケンスが定義するデータ転送を全て行う。転送シーケンサ24/34は、正常終了後は、転送シーケンスに記載されている終了時の処理に応じて、メッセージを他の転送シーケンサ24/34、またはプロセッサ44に送信する。
図3では、一方の転送シーケンサ24/34は、受信した転送シーケンスの処理完了後、他方の転送シーケンサ24/34に転送起動メッセージを送信する。転送起動メッセージを受領した転送シーケンサ24/34は、上述のように、予め受け取った転送シーケンスに従って転送を行う。転送シーケンサ24/34は、以上の工程を、予めプロセッサ44が指示した全ての転送シーケンスが終了するまで繰り返す。
全ての転送シーケンスの処理が終了した場合、最後の転送シーケンスを実行した転送シーケンサ24/34が、プロセッサ44に対して転送結果を送信する。そして、転送結果を受け取った(56)プロセッサ44は、確保したメモリ資源を解放する(57)。
以上により、プロセッサ44は、ユーザデータの転送途中での転送終了ステータスの確認や次の転送コマンドの送信を行う必要がなくなる。これにより、プロセッサ44の処理量(データ転送における負荷)を減らすことができ、ストレージシステム1の処理能力を向上させることができる。
上述のように、好ましい構成において、プロセッサ44は、一連のデータ転送の開始位置(初期位置)から最終位置までの一連のデータ転送の全てを規定する1又は複数のデータ転送シーケンス(データ)を作成し、それらを転送シーケンサ24/34に送信する。このように、必要とされるデータ転送における全ての転送工程を規定する1又は複数のデータ転送シーケンスを作成することで、転送開始から転送完了までのプロセッサ44の関与をより小さくすることができる。
プロセッサ44は、上述のように、好ましい構成において、開始位置(初期位置)からのデータ転送の開始前に、必要な全てのメモリ資源を確保し、作成した全てのデータ転送シーケンスに従った処理が完了した後に(ユーザデータが最終位置(最終記憶領域)に格納された後に)、確保したメモリ資源を解放する。これにより、データ転送完了までのプロセッサ44の関与をより小さくすることができる。
設計によっては、プロセッサ44は、各転送シーケンスの終了のステータスを受信し、その後、その次の転送シーケンスの実行を指示してもよい。さらに、プロセッサ44は、各転送シーケンスの終了において、対応する確保したメモリ資源を解放してもよい。
図4は、プロセッサ44が転送シーケンサ24/34に送信する転送シーケンス71の一例を示している。シーケンスID710は、該当転送シーケンサ24/34が扱う複数のシーケンスを識別するための情報であり、プロセッサ44が転送シーケンス71を生成する際、他の転送シーケンス71と重複しない値を設定する。
転送ID711は、転送シーケンス71内の転送コマンドを識別するための情報である。転送エンジン712は、該当転送コマンドの送信先転送エンジンを示す情報である。この例において、1つ目のコマンドはドライブインタフェースLSI#1(#Nは同一種類の各デバイスの番号を示す)に、2つ目のコマンドはバックエンドDMA#1に送信することを示している。転送コマンドの内容73については、図6で詳述する。
シーケンス終了時処理内容714は、該当転送シーケンス71が完了した際に行う処理内容を示す。このフィールド714が他シーケンスの起動を示す場合、該当転送シーケンサ24/34は、別の転送シーケンサに対し、転送シーケンス起動のメッセージを送信する。一方、このフィールドがプロセッサ44へのメッセージ送信を示す場合、該当転送シーケンサ24/34は、プロセッサ44に対し転送シーケンス実行結果を送信する。図4の例において、フィールド714は、転送シーケンス起動のメッセージ送信を示している。
送信先715は、メッセージの送信先を示す情報である。本例では、フロントエンドボード#3の転送シーケンサ24である。図4の例のように、シーケンス終了時処理内容714が他シーケンス起動を示す場合、当フィールドは、送信先転送シーケンサ24/34の識別子を示す。シーケンス終了時処理内容714がプロセッサ44への転送シーケンス実行結果送信を示す場合、当フィールドは送信先プロセッサ44の識別子を示す。シーケンスID716は、シーケンス終了時処理内容714が他シーケンス起動を示す場合に、次に起動するシーケンスの識別子を示す。
図4の転送シーケンス71は一例であって、転送シーケンスは、どのようなデータ構造を有していてもよい。この点は、ストレージシステム1が使用する他の情報、例えば、後述の転送シーケンス結果72やシーケンス追跡テーブル242等、に対しても同様である。例えば、本実施形態及び他の実施形態において、テーブル、リスト、データベース又はキューから適切に選択されたデータ構造体が、情報を格納することができる。
図5は、転送シーケンサ24/34がプロセッサ44に送信する転送シーケンス実行結果72の一例を示している。転送シーケンスID721は、転送シーケンス実行結果72が、どの転送シーケンスに対応するかを示す情報である。転送コマンド実行結果722は、対応する転送シーケンスに含まれる各転送の成功/失敗を示す情報である。
エラー転送ステータスは、転送シーケンスに含まれる転送コマンドのいずれかが失敗した場合に、転送失敗した転送エンジン及びエラー種別を示す情報である。エラー転送ステータスにおけるエラー転送エンジン723は、転送エラーが発生した転送エンジンの識別子を示す。本例において、ホストインタフェース#3を示す。そして、エラー転送ステータスにおけるエラーID724は、転送エラーが発生した転送エンジンが出力した、エラー種別を示す識別子である。
図6は、転送シーケンサ24/34が転送エンジンに送信する転送コマンド73の一例を示している。エクスチェンジID731は、転送エンジン内で複数の転送コマンド73を識別するための識別子である。転送元デバイス732は、該当転送コマンドが指示するデータ転送の転送元デバイスを示す情報である。
この例は、転送元がドライブインタフェース#1のバッファであることを示している。転送元アドレス733は、転送されるべきデータが転送元デバイスの中のどの場所(領域)に格納されているかを示す論理アドレスである。同様に、転送先デバイス734、転送先アドレス735は、それぞれ、転送されるデータの転送先デバイス、転送先デバイス内での格納場所を示す情報である。転送長736は、該当転送コマンドで転送すべきデータの長さを示す情報である。
図7は、転送エンジンが転送コマンドの処理を終了する際に出力する転送ステータス74の一例を示している。エクスチェンジID741は、該当転送ステータス74が、どの転送コマンド73に対応するかを示す情報である。転送結果742は、対応する転送コマンド73の成功/失敗を示す情報である。そして、エラーID743は、転送が失敗していた場合に失敗の要因を示す識別子である。
図8は、ホストコンピュータ12からコマンド(典型的にリードコマンド又はライトコマンド)を受領した際の、プロセッサ44の処理の一例を示したフローチャートである。プロセッサ44は、ホストコンピュータ12からコマンドを受領すると、まず転送パスを決定する(S8111)。具体的には、プロセッサ44は、転送元デバイス及び転送先デバイス、中継メモリ、そして利用する転送エンジンを決定する。そして、プロセッサ44は、予め定められている基準に従って、転送シーケンサ24/34を使うか否かを判定する(S8112)。
例えば、プロセッサ44に余力がある場合及び/又は転送シーケンサ24/34の稼働率が高く余力が無い場合、プロセッサ44は、転送シーケンサ24/34を使わないと判定する。具体的には、プロセッサ44は、プロセッサ44及び/又は転送シーケンサ24/34の稼働率を参照して、転送シーケンサ24/34を使うか否かを決定する。
例えば、プロセッサ44の稼働率が所定の閾値より小さい場合及び/又は転送シーケンサ24/34の稼働率が所定の閾値より大きい場合、転送シーケンサの能力不足により、性能向上効果が期待できない場合がある。そのため、プロセッサ44は、転送シーケンサ24/34を使わないと判定する。2つの閾値の値は典型的には異なる。データ転送が転送シーケンサ24、34の双方の担当転送エンジンを含む場合、プロセッサ44はその一方又は双方の使用の有無を決定する。
このほか、好ましい構成において、プロセッサ44は、ホストコンピュータ12からのI/Oコマンド(リードコマンド又はライトコマンド)を解析し、コマンドの対象ユーザデータ(リードデータ又はライトデータ)の格納位置に応じて、転送シーケンサ24/34の使用/不使用の判定を行う。
具体的には、対象ユーザデータの格納場所が異なる記憶デバイスである場合、全データを転送するためには、記憶デバイス毎に転送コマンドを作成し、これらを組み合わせなければならない場合がある。このような複雑なケースを全てサポートすると、転送シーケンサの構成が複雑になり、メモリも多く必要とする。これを避けるため、プロセッサ44は、転送シーケンサ24/34を使用しないと決定する。1つの記憶デバイスは1つのアドレス空間で定義され、転送エンジンは、1つのアドレス空間において、1つの記憶デバイスが提供する記憶領域にアクセスする。異なる記憶デバイスは、異なるアドレス空間を提供する。一般にこのようなケースは少ないため、転送シーケンサ24/34を使わないことによる性能への影響は小さい。
例えば、ホストコンピュータ12からのリードコマンドに対応する転送元(対象データの格納位置)が複数のキャッシュメモリ42やドライブ14に跨る場合、若しくは、ホストコンピュータ12からのライトコマンドに対応する転送先(対象データの格納位置)が複数のキャッシュメモリ42に跨る場合、プロセッサ44は、転送シーケンサ24/34を使用しないと決定する。理由は複数の記憶デバイスにデータが跨る前述の場合と同様である。
さらに好ましくは、ユーザデータの転送元又は転送先が連続領域(論理アドレスが連続している領域)ではない(不連続領域である)場合、プロセッサ44は、転送シーケンサ24/34を使用しないと決定する。理由は複数の記憶デバイスにデータが跨る前述の場合と同様である。このほか、転送長が大きく、中継メモリ上に連続した領域を確保できない場合、プロセッサ44は、転送シーケンサ24/34を使用しないと決定することが好ましい。こちらも、理由は複数の記憶デバイスにデータが跨る前述の場合と同様である。
好ましい構成において、プロセッサ44は、バッファ空き容量と転送データ長との関係に基づいて、転送シーケンサ24/34の使用/不使用を判定してもよい。プロセッサ44は、フロントエンドバッファ25やバックエンドバッファ35の空き容量が転送長に対して十分では無い場合、例えば、それらの差が所定の閾値未満である場合に、転送シーケンサ24/34を使用しないと決定する。転送シーケンサを用いる場合バッファを長時間占有するため、このようにバッファを長時間確保することによる影響が大きい場合は、転送シーケンサを使わないようにすることで、バッファを有効活用することができる。この他、同一データへのアクセスが他に発生することが予想される場合、プロセッサ44は、転送シーケンサ24/34を使わないと判定することが好ましい。一般にデータ転送を行う際、データの不整合を防ぐため、他のデータアクセスが発生しないよう排他を行う。このとき、転送シーケンサを用いると、長時間該当データへのアクセスを排他することになるため、他の処理を長時間待たせることになる。転送シーケンサを用いないようにすることで、排他する時間を細かく分割でき、他処理への影響を小さくすることができる。
これらの場合は、メモリ(ドライブの記憶媒体を含む)間の単純なデータ転送と異なる処理を必要とする。例えば、異なるキャッシュメモリデバイスへのデータの格納は、ホストコンピュータ12から受信したユーザデータを複数の部分に分け、それぞれ異なるキャッシュメモリに格納することを必要とする。転送シーケンサ24/34の構成(処理)をシンプルなものとして設計容易とするため、プロセッサ44が、これらの例外的処理を実行することが好ましい。
プロセッサ44は、上記複数の判定基準のうちの予め設定されている1つ又は複数を参照し、転送シーケンサ24/34の使用の有無を判定することができる。複数の判定基準を使用する場合、典型的には、プロセッサ44は、任意の1つの条件が不使用条件を満たす場合、転送シーケンサ24/34を使用することなくデータを転送する。プロセッサ44は、転送シーケンサ24/34の使用/不使用判定を個別に行うことができる。又は、一方の転送シーケンサ24/34が不使用である場合、他方の転送シーケンサ24/34も不使用と判定してもよい。
転送シーケンサを使う場合、プロセッサ44は、まず、転送パス上の全て中継メモリを確保する。つまり、プロセッサ44は、転送パス上のフロントエンドバッファ25、バックエンドバッファ35、キャッシュメモリ42等の中継メモリを確保する(S8113)。
次に、プロセッサ44は、転送コマンド及び転送シーケンスを作成する(S8114)。具体的には、プロセッサ44は、S8113で確保したメモリ領域が転送元/転送先になるように、S8111で決定した転送エンジンを用いる転送コマンドを作成する。そして、作成した転送コマンドを元に転送シーケンスを作成する。
次に、プロセッサ44は、作成した転送シーケンスを転送シーケンサ24及び/又は転送シーケンサ34に送信し、転送開始位置の転送シーケンサに転送実行を指示する(S8115)。そして、プロセッサ44は、最終転送位置の転送シーケンサからの応答を待ち(S8116)、最後にS8113で確保したバッファを解放して(S8117)処理を終了する。
一方、プロセッサ44は、S8112で転送シーケンサ24及び転送シーケンサ34を用いないと判定した場合、転送シーケンサを使わずに各段階のデータ転送を一つずつ行う。具体的には、プロセッサ44は、まず次のデータ転送に必要なメモリを確保する(S8118)。そして、次の転送に必要な転送コマンドを作成する(S8119)。
次に、プロセッサ44は、作成した転送コマンドを転送エンジンに送信する(S8120)。転送エンジンからの転送ステータス送信を待つ(S8121)。転送ステータスが到着すると、プロセッサ44は、転送の成功を確認し(S8122)、この転送に使われたバッファを解放する(S8123)。プロセッサ44は、必要なデータ転送が全て行われたかどうかを判定し(S8124)、まだ残っている場合には(S8124:N)、プロセッサ44はS8118に戻る。全て行われている場合には(S8124:Y)、プロセッサ44は処理を終了する。
図9は、転送シーケンサ24の構成の一例である。転送シーケンサ24は、図2に記載された処理を行うための内蔵プロセッサ241、実行中の転送シーケンスの進行状況を格納するシーケンス追跡テーブル242、転送シーケンスの内容を格納するシーケンステーブル243を有する。転送シーケンサ24の機能の少なくとも一部は、内蔵プロセッサ241と異なる論理回路で実装してもよい。
転送シーケンサ24は、例えば内蔵メモリを備え、そのメモリ内に内蔵プロセッサ241の実行するプログラム並びにシーケンス追跡テーブル242及びシーケンステーブル243を含むデータを格納する。転送シーケンサ24は、バッファ25を使用してもよい。これらデータ(プログラムを含む)は、ストレージコントローラ11内の不揮発性メモリ(不図示)又はドライブ14の不揮発性記憶領域からロードされる。尚、バックエンド基板3に搭載されている転送シーケンサ34も、同様の構成及び機能を有する。
図10は、シーケンス追跡テーブル242の一例である。シーケンス追跡テーブル242は、複数の転送シーケンスを識別するためのシーケンスID2421に対し、どの段階まで転送が進んだかを示す転送フェーズ2422を記憶するフィールドを有する。
図11は、転送シーケンサ24/34が行う処理の一例を示したフローチャートである。転送シーケンサ24/34はこの処理を繰り返し行うことで、プロセッサ44の代わりにデータ転送の順序制御を行う。
図11のフローチャートに示すように、まず、転送シーケンサ24/34は、プロセッサ44からの転送シーケンスを登録する。具体的には、まず、転送シーケンサ24/34は、転送シーケンスがプロセッサ44から送信されたかどうかを確認する(S8211)。新しく転送シーケンスが到着していた場合(S8212:Y)、転送シーケンサ24/34は、到着した転送シーケンスを転送シーケンステーブル243に追加する(S8213)。
転送シーケンサ24/34は、追加された転送シーケンスのうち、先頭の転送コマンドを転送シーケンスで指定された転送エンジンに送信する(S8214)。一方、S8212で転送シーケンスが到着していなかった場合、転送シーケンサ24/34は、そのままS8215に進む。次に、転送シーケンサ24/34は、DMA23/33やインタフェースLSI21/31といった転送エンジンの制御を行う。
具体的には、まず、転送シーケンサ24/34は、転送エンジンからの転送ステータスが到着したかどうかを確認する(S8215)。ステータスが到着していない場合(S8216:N)、転送シーケンサ24/34は、処理を終了する。
ステータスが到着している場合には(S8216:Y)、転送シーケンサ24/34は、ステータスの内容を解析し、該当する転送が成功したのか失敗したのかを確認する(S8217)。転送に成功していた場合は(S8218:Y)、転送シーケンサ24/34は、シーケンス追跡テーブル242を基に、次に実行すべき転送コマンドを転送シーケンステーブル243から検索する(S8219)。
次のコマンドが存在する、即ち終了したデータ転送がシーケンスの最後でない場合(S8220:N)、転送シーケンサ24/34は、次のコマンドを転送シーケンスで指定された転送エンジンに送信する(S8221)。そして、転送シーケンス追跡テーブル242の実行中転送コマンドを、今回実行したコマンドに更新し(S8222)、処理を終了する。
一方、S8220において、今回完了したコマンドが最後のコマンドである場合(S8220:Y)、転送シーケンサ24/34は、転送シーケンスに記載されたシーケンス終了時処理内容714を調べる(S8223)。S8223において、その処理内容が他シーケンス起動の場合、転送シーケンサ24/34は、指定された転送シーケンサに対してシーケンス起動メッセージを送信し(S8224)、処理を終了する。
一方、S8223において、シーケンス終了時処理内容714が、他シーケンス起動ではなく、プロセッサへのメッセージ(結果)の送信を示す場合、転送シーケンサ24/34は、転送シーケンス実行結果をプロセッサ44に対し送信し(S8225)、処理を終了する。一方、S8218で、転送失敗が判明した場合も、転送シーケンサ24/34は、シーケンスの実行結果をプロセッサ44に送信し、処理を終了する。
以上のように、転送シーケンサ24/34を設けることで、プロセッサ44が転送シーケンサ24/34に予め転送シーケンスを送信し、転送シーケンサ24/34がプロセッサ44からの指示に従って一連のデータ転送処理を行えるようになる。この結果、一連のデータ転送を行う際、データ転送毎(転送エンジンによる転送毎)にプロセッサ44が介在する必要がなくなるため、プロセッサ44の処理量が減少する。この結果、プロセッサ44の他の処理能力が向上し、ストレージシステム1の性能向上を実現できる。
本実施形態において、転送シーケンサ24、34は異なる基板2、3上に実装されている。転送シーケンサ24、34は、それぞれの基板2、3において、その基板上に実装されている転送エンジンを制御する。
つまり、フロントエンド基板2上の転送シーケンサ24は、フロントエンドDMA23及びホストインタフェースLSI21を制御する。一方、バックエンド基板3上の転送シーケンサ34は、バックエンドDMA33及びドライブインタフェースLSI31を制御する。このように、転送シーケンサ24/34が、同一基板上の転送エンジンのみを制御することで、エラー箇所の特定を容易に行うことができる。設計によっては、転送シーケンサは、異なる基板上の転送エンジンを制御してもよい。
第二の実施形態
第二の実施形態は、ストレージコントローラ11がホストコンピュータ12からI/O要求(リードコマンド又はライトコマンド)を受け取った場合に、転送シーケンサ24/34を適宜活用してI/O要求を処理する例を示す。図12は、ホストコンピュータ12からストレージコントローラ11がI/O要求を受け取った場合にプロセッサ44が行うI/O処理のフローチャートの一例である。
プロセッサ44は、ホストコンピュータ12からI/O要求を受け取ると、まず、コマンドの種別を解析する(S8311)。コマンドの種別がリードコマンドの場合(S8311:READ)、プロセッサ44は、要求されたデータがキャッシュメモリ42上に存在するかを調べる(S8312)。
具体的には、プロセッサ44は、キャッシュメモリ42にどのデータが格納されているかを管理するキャッシュディレクトリを検索し、ホストコンピュータ12から要求されたボリューム番号及びアドレスのデータが、キャッシュメモリ42上に存在するか否かを調べる。
データがキャッシュメモリ42上に存在する場合(S8312:Y)、プロセッサ44は、転送シーケンサ24を用いるかどうかを判定する(S8313)。転送シーケンサ24を用いる基準は、上述のように、要求されたデータがキャッシュメモリ42上の連続領域に格納されているか、フロントエンドバッファ25に十分な空きが存在するか、他に同一データにアクセスする処理が存在しないか等の一部又は全てを使用できる。
転送シーケンサ24を使う場合(S8313:Y)、プロセッサ44は、転送シーケンサ24を使ったリードヒット処理84を行う。一方、転送シーケンサ24を使わない場合(S8313:N)、プロセッサ44は、転送シーケンサ24を使わないリードヒット処理85を行う。
一方、S8312において、キャッシュメモリ42上に要求されたデータが存在しない場合(S8312:N)、プロセッサ44は、転送シーケンサ24及び34を使うかどうかを判定する(S8316)。転送シーケンサ24、34を用いる基準は、ユーザデータがドライブ14の連続領域に格納されているか、フロントエンドバッファ25及びバックエンドバッファ35に十分な空きが存在するか、他に同一データにアクセスする処理が存在しないか等の一部又は全てを使用できる。
転送シーケンサ24及び34を用いる場合(S8316:Y)、プロセッサ44は、転送シーケンサ24及び34を用いたリードミス処理86を行う。一方、転送シーケンサ24及び34を用いないと決定した場合(S8316:N)、プロセッサ44は、転送シーケンサ24及び34を用いないリードミス処理87を実施する。
一方、S8311において、ホストコマンドの種別がライトコマンドの場合(S8313:WRITE)、プロセッサ44は、転送シーケンサ24を使うかどうかを判定する(S8319)。ここで、転送シーケンサ24を用いる基準は、フロントエンドバッファ25に十分な空きが存在するか、他に同一データにアクセスする処理が存在しないか、転送先キャッシュメモリ42のアドレスが連続しているか等である。
転送シーケンサ24を用いる場合(S8319:Y)、プロセッサ44は、転送シーケンサ24を用いたフロントエンドライト処理88を行う。一方、S8319において、転送シーケンサ24を用いないと決定した場合(S8319:N)、プロセッサ44は、転送シーケンサ24を用いないフロントエンドライト処理89を行う。
図13は、転送シーケンサ24を使ったリードヒット処理84、或いは転送シーケンサ24を使わないリードヒット処理85における、転送エンジン(ホストインタフェースLSI21、DMA23)が行うデータ転送処理の内容を示している。
リードヒット処理84/85は、まず、フロントエンドDMA(FE DMA)23による、キャッシュメモリ42からフロントエンドバッファ(FE BUF.)25へのデータ転送を行う。具体的には、フロントエンドDMA23が、キャッシュメモリ42に対し、リード要求を発行する。フロントエンドDMA23は、キャッシュメモリ42から応答されたデータを受け取り、それをフロントエンドバッファ25に書き込む。
次に、ホストインタフェースLSI21が、フロントエンドバッファ25からホストコンピュータ12へデータを転送する。具体的には、ホストインタフェースLSI21がフロントエンドバッファ25に対しリード要求を発行する。そして、ホストインタフェースLSI21は、フロントエンドバッファ25から応答されたデータを受け取り、ホストコンピュータ12に返送する。
図14は、転送シーケンサ24を用いたリードヒット処理84の一例を示している。図8のS8113〜S8117が、本処理に対応する。本処理は、まず、フロントエンドバッファ25を確保する(S841)。これが、図8のS8113に対応する。
次に、プロセッサ44は、要求されたデータが格納されているキャッシュメモリ42からS841で確保したフロントエンドバッファ25へデータ転送を行うフロントエンドDMA23のコマンドを作成する(S842)。
そして、次に、プロセッサ44は、フロントエンドバッファ25からホストコンピュータ12にデータを返送するためのホストインタフェースLSI21の転送コマンドを作成する(S843)。そして、プロセッサ44は、これらの転送コマンドを基に、フロントエンドDMA23、ホストインタフェースLSI21を順に動作させる転送シーケンスを作成する(S844)。
次に、プロセッサ44は、作成した転送シーケンスをフロントエンド転送シーケンサ24に送信する(S845)。そして、プロセッサ44は、フロントエンド転送シーケンサ24からの応答を待つ(S846)。プロセッサ44は、フロントエンド転送シーケンサ24からの応答を受け取ると、転送シーケンスの成功を確認し(S847)、フロントエンドバッファ25を解放し(S848)、処理を終了する。
図15は、転送シーケンサ24を用いないリードヒット処理85の一例を示したものである。図8のS8118〜S8124が、本処理に対応する。本処理では、プロセッサ44は、まず、フロントエンドバッファ25を確保する(S850)。プロセッサ44は、要求されたデータが格納されているキャッシュメモリ42からS850で確保したフロントエンドバッファ25へデータ転送を行うフロントエンドDMA23のコマンドを作成する(S851)。
次に、プロセッサ44は、作成した転送コマンドを、フロントエンドDMA23に送信する(S852)。そして、プロセッサ44は、フロントエンドDMA23からの転送ステータス送信を待つ(S853)。プロセッサ44は、転送ステータスを受領すると、ステータスの内容を確認し、転送が成功したことを確認する(S854)。
次に、プロセッサ44は、フロントエンドバッファ25からホストコンピュータ12にデータを転送するホストインタフェースLSI21の転送コマンドを作成する(S855)。そして、プロセッサ44は、作成したコマンドをホストインタフェースLSI21に送信する(S856)。
プロセッサ44は、ホストインタフェースLSI21からの転送ステータス送信を待つ(S857)。プロセッサ44は、転送ステータスを受領すると、ステータスの内容を確認し、転送が成功したことを確認する(S858)。プロセッサ44は、確保したフロントエンドバッファ25を解放し(S859)、処理を終了する。
図16は、転送シーケンサ24及び34を使ったリードミス処理86、或いは転送シーケンサ24及び34を使わないリードミス処理87における、転送エンジン(ドライブインタフェースLSI31、バックエンドDMA(BE DMA)33、フロントエンドDMA23、ホストインタフェースLSI21)が行うデータ転送処理の内容を示したものである。
リードミス処理86/87では、まず、ドライブインタフェースLSI31が、ドライブ14からバックエンドバッファ(BE BUF.)35へデータを転送する。具体的には、ドライブインタフェースLSI31は、ドライブ14に対し、リードコマンドを発行する。ドライブインタフェースLSI31は、ドライブ14から応答されたデータを受け取り、バックエンドバッファ35に書き込む。
次に、バックエンドDMA33が、バックエンドバッファ35からキャッシュメモリ42へのデータを転送する。具体的には、バックエンドDMA33がバックエンドバッファ35に対しリード要求を発行する。そして、バックエンドDMA33は、バックエンドバッファ35から応答されたデータを受け取り、キャッシュメモリ42に書き込む。
次に、フロントエンドDMA23が、キャッシュメモリ42からフロントエンドバッファ25へのデータを転送する。具体的には、フロントエンドDMA23がキャッシュメモリ42に対しリード要求を発行する。そして、フロントエンドDMA23は、キャッシュメモリ42から応答されたデータを受け取り、フロントエンドバッファ25に書き込む。
最後に、フロントエンドバッファ25からホストコンピュータ12へのデータが転送される。具体的には、ホストインタフェースLSI21がフロントエンドバッファ25に対しリード要求を発行する。そして、ホストインタフェースLSI21は、フロントエンドバッファ25から応答されたデータを受け取り、ホストコンピュータ12に返送する。
図17は、転送シーケンサ24及び34を用いたリードミス処理86の一例を示したものである。図8のS8113〜S8117が、本処理に対応する。本処理では、まず、プロセッサ44は、一連の転送に必要な中継メモリの確保を行う。具体的には、プロセッサ44は、リードコマンドによって指定されているユーザデータを読み出すドライブ14に接続されているバックエンド基板3を特定し、その上のバックエンドバッファ35を確保する(S8611)。
次に、プロセッサ44は、キャッシュメモリ42のうち空いている領域の中から、今回要求されたデータを格納する領域を確保する(S8612)。次に、同様にして、プロセッサ44は、フロントエンドバッファ25を確保する(S8613)。以上により、一連の転送に必要な中継メモリの確保が完了する。
次に、プロセッサ44は、転送に必要な転送コマンド及び転送シーケンスを作成する。具体的には、プロセッサ44は、ドライブインタフェースLSI31を用いてドライブ14からバックエンドバッファ35に転送する転送コマンドを作成する(S8614)。次に、プロセッサ44は、バックエンドDMA33を用いてバックエンドバッファ35からキャッシュメモリ42にデータを転送する転送コマンドを作成する(S8615)。
次に、プロセッサ44は、フロントエンドDMA23を用いてキャッシュメモリ42からフロントエンドバッファ25にデータを転送する転送コマンドを作成する(S8616)。そして、プロセッサ44は、ホストインタフェースLSI21を用いてフロントエンドバッファ25のデータをホストコンピュータ12に転送する転送コマンドを作成する(S8617)。
次に、プロセッサ44は、作成したドライブインタフェースLSI31の転送コマンド、バックエンドDMA33の転送コマンドを用い、この順序でデータ転送を行う転送シーケンスを作成する(S8618)。この時、プロセッサ44は、転送シーケンス終了時の処理を、フロントエンド転送シーケンサ24の転送シーケンス起動に設定する。
次に、プロセッサ44は、作成したフロントエンドDMA33の転送コマンド、ホストインタフェースLSI21の転送コマンドを基に、この順序でデータ転送を行う転送シーケンスを作成する(S8619)。以上により、転送コマンド及び転送シーケンスの作成が完了する。
そして、プロセッサ44は、フロントエンド転送シーケンサ24に対し、S8619で作成した転送シーケンスを送信する(S8620)。次に、プロセッサ44は、バックエンド転送シーケンサ34に対し、S8618で作成した転送シーケンスを送信する(S8621)。そして、プロセッサ44は、バックエンド転送シーケンサ34に対し、転送シーケンスの実行を指示する(S8622)。
プロセッサ44は、フロントエンド転送シーケンサ24からの転送結果の応答を待つ(S8623)。転送結果が到着すると、プロセッサ44は、転送結果の内容を解析し、転送シーケンスの処理の成功を確認する(S8624)。そして、プロセッサ44は、先ほど確保したフロントエンドバッファ25を解放し(S8625)、次に同様にしてバックエンドバッファ35を解放し(S8626)、処理を終了する。
図18は、転送シーケンサ24及び34を用いないリードミス処理87の一例を示す。図8のS8118〜S8124が、本処理に対応する。本処理は、まず、ドライブ14からバックエンドバッファ35へデータを転送する。具体的には、まず、プロセッサ44は、バックエンドバッファ35を確保する(S8711)。次に、プロセッサ44は、ドライブインタフェースLSI31を用いてドライブ14からバックエンドバッファ35にデータを転送する転送コマンドを作成する(S8712)。
次に、プロセッサ44は、作成したコマンドをドライブインタフェースLSI31に送信する(S8713)。そして、プロセッサ44は、ドライブインタフェースLSI31からの実行結果ステータスが送信されるのを待つ(S8714)。プロセッサ44は、ステータスを受け取ると、内容を解析し、転送の成功を確認する(S8715)。
次に、プロセッサ44は、バックエンドバッファ35からキャッシュメモリ42へのデータ転送を行う。具体的には、まず、プロセッサ44は、キャッシュメモリ42を確保する(S8716)。次に、プロセッサ44は、バックエンドDMA33を用いてバックエンドバッファ35からキャッシュメモリ42にデータを転送する転送コマンドを作成する(S8717)。
次に、プロセッサ44は、作成したコマンドをバックエンドDMA33に送信する(S8718)。そして、プロセッサ44は、バックエンドDMA33からの実行ステータスが送信されるのを待つ(S8719)。プロセッサ44は、ステータスを受け取ると、内容を解析し、転送の成功を確認する(S8720)。そして、プロセッサ44は、バックエンドバッファ35を解放する(S8721)。
次に、プロセッサ44は、キャッシュメモリ42からフロントエンドバッファ25へのデータ転送を行う。具体的には、まず、プロセッサ44は、フロントエンドバッファ25を確保する(S8722)。次に、プロセッサ44は、フロントエンドDMA23を用いてキャッシュメモリ42からフロントエンドバッファ25にデータを転送する転送コマンドを作成する(S8723)。
次に、プロセッサ44は、作成したコマンドをフロントエンドDMA23に送信する(S8724)。そして、プロセッサ44は、フロントエンドDMA23からの実行結果ステータスが送信されるのを待つ(S8725)。プロセッサ44は、ステータスを受け取ると、内容を解析し、転送の成功を確認する(S8726)。
最後に、プロセッサ44は、フロントエンドバッファ25からホストコンピュータ12へのデータ転送を行う。具体的には、まず、プロセッサ44は、ホストインタフェースLSI21を用いてフロントエンドバッファ25からホストコンピュータ12にデータを転送する転送コマンドを作成する(S8727)。
プロセッサ44は、作成したコマンドをホストインタフェースLSI21に送信する(S8728)。そして、プロセッサ44は、ホストインタフェースLSI21からの実行結果ステータスが送信されるのを待つ(S8729)。プロセッサ44は、ステータスを受け取ると、内容を解析し、転送の成功を確認する(S8730)。最後に、プロセッサ44は、フロントエンドバッファ25を解放し(S8731)、処理を終了する。
図19は、転送シーケンサ24を使ったフロントエンドライト処理88、或いは転送シーケンサ24を使わないフロントエンドライト処理89における、転送エンジン(ホストインタフェースLSI21、フロントエンドDMA23)が行うデータ転送処理の内容を示している。
フロントエンドライト処理88/89は、まず、ホストインタフェースLSI21による、ホストコンピュータ12からフロントエンドバッファ25へのデータ転送を行う。具体的には、ホストインタフェースLSI21は、ホストコンピュータ12から送られたユーザデータを受け取る。ホストインタフェースLSI21は、そのデータを、フロントエンドバッファ25の予め転送コマンドで指定された場所に書き込む。
次に、フロントエンドDMA23が、フロントエンドバッファ25からキャッシュメモリ42へデータを転送する。具体的には、フロントエンドDMA23は、フロントエンドバッファ25に対し、リード要求を発行する。
フロントエンドDMA23は、フロントエンドバッファ25から応答されたデータを受け取り、キャッシュメモリ42へ書き込む。この時、ホストコンピュータ12から送られたデータ又は電源やキャッシュメモリ基板41の障害などにより、データが読めないことがある。このため、書き込みの際には、2つのキャッシュメモリ42のそれぞれに同一のデータを書き込むことで、片方に障害が発生し読み取りが不可能になった場合でも、データの消失を防ぐことが好ましい。
図20は、転送シーケンサ24を用いたフロントエンドライト処理88の一例を示している。図8のS8113〜S8117が、本処理に対応する。本処理では、プロセッサ44は、まず、一連の転送に必要な中継メモリを確保する。
具体的には、まず、プロセッサ44は、フロントエンドバッファ25を確保する(S881)。次に、プロセッサ44は、ホストコンピュータ12からのライトデータを格納するキャッシュメモリ42が既に確保されているかどうかを調べ、もし確保されていない場合には、キャッシュメモリ42を確保する(S882)。以上により、転送中継メモリの確保が完了する。
次にプロセッサ44は、転送コマンド及び転送シーケンスの作成を行う。具体的には、まず、プロセッサ44は、ホストインタフェースLSI21によってホストコンピュータ12からフロントエンドバッファ25へのデータ転送を行う転送コマンドを作成する(S883)。
次に、プロセッサ44は、フロントエンドDMA23によりフロントエンドバッファ25から2つのキャッシュメモリ42のそれぞれへデータを転送する転送コマンドを作成する(S884)。プロセッサ44は、作成した転送コマンドを基に、ホストインタフェースLSI21による転送及びフロントエンドDMA23による転送を順番に行う転送シーケンスを作成する(S885)。以上により、転送コマンド及び転送シーケンスの作成が完了する。
次に、プロセッサ44は、作成した転送シーケンスを、フロントエンド転送シーケンサ24に送信し、転送シーケンスの実行を指示する(S886)。そして、プロセッサ44は、転送シーケンサ24からの応答を待つ(S887)。プロセッサ44は、応答を受け取ると、転送シーケンスの実行の成功を確認し(S888)、フロントエンドバッファ25を解放する(S889)。そして、プロセッサ44は処理を終了する。
図21は、転送シーケンサを用いないフロントエンドライト処理89の一例を示したものである。図8のS8118〜S8124が、本処理に対応する。本処理では、プロセッサ44は、まず、ホストコンピュータ12からフロントエンドバッファ25へのデータ転送を行う。
具体的には、まず、プロセッサ44は、フロントエンドバッファ25を確保する(S890)。次に、プロセッサ44は、ホストインタフェースLSI21を用いてホストコンピュータ12からフロントエンドバッファ25へのデータ転送を行う転送コマンドを作成する(S891)。プロセッサ44は、作成したコマンドをホストインタフェースLSI21に転送する(S892)。
プロセッサ44は、ホストインタフェースLSI21からの実行結果ステータスが送信されるのを待つ(S893)。プロセッサ44は、ステータスを受け取ると内容を解析し、転送の成功を確認する(S894)。以上により、ホストコンピュータ12からフロントエンドバッファ25へのデータ転送が完了する。
次に、プロセッサ44は、フロントエンドバッファ25からキャッシュメモリ42へのデータ転送を行う。具体的には、プロセッサ44は、まず、フロントエンドDMA23を用いてフロントエンドバッファ25からキャッシュメモリ42へデータ転送を行う転送コマンドを作成する(S895)。そして、プロセッサ44は、作成したコマンドをフロントエンドDMA23に送信する(S896)。
プロセッサ44は、フロントエンドDMA23からの実行結果ステータスが送信されるのを待つ(S897)。プロセッサ44は、ステータスを受け取ると内容を解析し、転送の成功を確認する(S898)。最後に、プロセッサ44は、確保したフロントエンドバッファ25を解放し(S899)、処理を終了する。
図22は、ホストコンピュータ12から書き込まれ、キャッシュメモリ42に存在しているユーザデータをドライブ14に書き込むデステージ処理90の一例である。この処理は、ホストコンピュータ12から書き込まれたユーザデータがキャッシュメモリ42に存在し、かつ、キャッシュメモリ42の空き容量が足りなくなった場合、或いはストレージシステム1の処理能力に余裕がある場合に実行される。
本処理では、プロセッサ44は、書き込み先のドライブ14のRAIDレベルを調べる(S901)。そして、そのRAIDレベルがRAID1の場合(S901:RAID1)、プロセッサ44は、転送シーケンサ34を用いるかどうかを判定する(S902)。
プロセッサ44は、転送シーケンサ34を用いる基準として、デステージ対象となるデータがキャッシュメモリ42上の連続領域に格納されていること、データの格納先が複数のドライブ14に跨っていないこと、ドライブ14の格納先領域が連続していること、バックエンドバッファ35に十分な空きが存在すること、他に同一データにアクセスする処理が存在しないこと、書き込み先ドライブ14が属するRAIDグループの他のドライブ14に、障害が発生していないこと等の一部又は全てを参照する。
転送シーケンサ34を使う場合(S902:Y)、プロセッサ44は、転送シーケンサ34を使ったRAID1デステージ処理91を行う。一方、転送シーケンサ34を使わない場合(S902:N)、プロセッサ44は、転送シーケンサ34を使わないRAID1デステージ処理92を行う。S901において、書き込み先ドライブ14のRAIDレベルがRAID5の場合(S901:RAID5)、プロセッサ44は、転送シーケンサ34を用いるかどうかを判定する(S905)。
プロセッサ44は、転送シーケンサ34を用いる基準として、デステージ対象となるデータがキャッシュメモリ42上の連続領域に格納されていること、データの格納先が複数のドライブ14に跨っていないこと、ドライブ14の格納先領域が連続していること、バックエンドバッファ35に十分な空きが存在すること、他に同一データにアクセスする処理が存在しないこと、書き込み先ドライブ14が属するRAIDグループの他のドライブに障害が発生していないこと等の一部又は全てを参照する。
転送シーケンサ34を使う場合(S905:Y)、プロセッサ44は、転送シーケンサ34を使ったRAID5デステージ処理93を行う。一方、転送シーケンサ34を使わない場合(S905:N)、プロセッサ44は、転送シーケンサ34を使わないRAID5デステージ処理94を行う。
図23は、転送シーケンサ34を使ったRAID1デステージ処理91、或いは転送シーケンサ34を使わないRAID1デステージ処理92における、転送エンジンが行うデータ転送処理の内容を示している。
RAID1デステージ処理91/92は、キャッシュメモリ42上のデータを、2台のドライブ14(DRIVE1、DRIVE2)のそれぞれに書き込む。通常の構成において、ドライブ1(14)、ドライブ2(14)は別のバックエンド基板3、別のドライブインタフェースLSI31に接続されているため、転送に用いるバックエンドDMA33、バックエンドバッファ35も別のものである。
まず、第一のバックエンドDMA(BE1DMA)33は、キャッシュメモリ42から第一のバックエンドバッファ(BE1BUF.)35へデータを転送する。この時、第一バックエンドDMA33は、キャッシュメモリ42に対してリード要求を発行し、応答として受け取ったデータを第一バックエンドバッファ35に書き込む。
次に、第一のドライブインタフェースLSI(DRIVEI/F1LSI)31は、第一バックエンドバッファ35から第一ドライブ(DRIVE1)14へデータを転送する。同様に、第一のドライブインタフェースLSI31が第一バックエンドバッファ35に対してリード要求を発行してデータを受け取り、第一のドライブ14に対してライトコマンドを発行して受け取ったデータを書き込む。以上により、1台目のドライブ14への書き込みが終了する。
次に同様にして、RAID1デステージ処理91/92は、2台目のドライブ(DRIVE2)14への書き込みを行う。第二のバックエンドDMA(BE2DMA)33、第二のバックエンドバッファ(BE2BUF.)35、第二のドライブインタフェースLSI(DRIVEI/F2LSI)31が、第二のドライブ14へのデータ書き込みのため、上記処理と同様の処理を行う。
図24は、転送シーケンサを使ったRAID1デステージ処理91の一例を示している。図8のS8113〜S8117が、本処理に対応する。本処理では、プロセッサ44は、まず、一連の転送に必要な中継メモリを確保する。具体的には、まず、プロセッサ44は、第一のドライブ14に書き込むための第一のバックエンドバッファ35を確保する(S9111)。次に、プロセッサ44は、同様にして、第二のバックエンドバッファ35を確保する(S9112)。以上により転送中継メモリの確保が完了する。
次に、プロセッサ44は、転送コマンド及び転送シーケンスを作成する。具体的には、まず、プロセッサ44は、キャッシュメモリ41から第一のドライブ14へデステージを行う第一の転送シーケンスを作成する(S9113)。次に、プロセッサ44は、第二のドライブ14へデステージを行う第二のシーケンスを作成する(S9114)。これらの処理の詳細については図30で述べる。次に、プロセッサ44は、S9113で第一の転送シーケンスの終了時処理を、第二の転送シーケンス起動に設定する(S9115)。以上で、転送シーケンスの作成が完了する。
次に、プロセッサ44は、第一のドライブ14が接続されている第一のバックエンド基板3上の第一のバックエンド転送シーケンサ34に対し、S9113で作成した第一の転送シーケンスを送信する(S9116)。次に、プロセッサ44は、同様にして、第二のドライブ14が接続されている第二のバックエンド基板3上の第二のバックエンド転送シーケンサ34に対し、S9114で作成した第二の転送シーケンスを送信する(S9117)。
そして、プロセッサ44は、S9116で送信した転送シーケンサ34に対し、転送シーケンスの起動を指示する(S9118)。そして、プロセッサ44は、第二の転送シーケンスの終了したことを示すステータスが転送シーケンサ34から送信されるのを待つ(S9119)。プロセッサ44は、転送ステータスを受け取ると、転送シーケンスの実行が成功したことを確認し(S9120)、第一のバックエンドバッファ35の解放を行い(S9121)、次に第二のバックエンドバッファ35を解放する(S9122)。そして、プロセッサ44は処理を終了する。
図25は、転送シーケンサ34を使わないRAID1デステージ処理91の一例を示している。図8のS8118〜S8124が本処理に対応する。本処理では、まず、プロセッサ44は、第一のドライブ14にデータをデステージするため、第一のドライブ14に接続された第一のバックエンド基板3上の第一のバックエンドバッファ35を確保する(S921)。そして、プロセッサ44は、キャッシュメモリ42から第一のドライブ14へのデステージを行う(S922)。本処理の詳細については図31で述べる。そして、プロセッサ44は、第一のバックエンドバッファ35を解放する(S923)。
次に、同様に、プロセッサ44は、第二のドライブ14にデータをデステージするため、第二のドライブ14に接続された第二バックエンド基板3上の第二のバックエンドバッファ35を確保する(S924)。そして、プロセッサ44は、キャッシュメモリ42から第二のドライブ14へのデステージを行う(S925)。そして、プロセッサ44は、第二のバックエンドバッファ35を解放し(S926)、処理を終了する。
図26は、転送シーケンサを使ったRAID5デステージ処理93、或いは転送シーケンサ34を使わないRAID5デステージ処理94における、転送エンジンが行うデータ転送処理の内容を示したものである。
RAID5デステージ処理93/94は、RAID5のグループを構成するドライブ14のうち、データを格納するドライブ14(以下、データドライブ)、パリティを格納するドライブ14(以下、パリティドライブ)の2台のドライブ14に更新されたデータを書き込む。図26において、データドライブはDRIVE(D.)で表され、パリティドライブはDRIVE(P.)で表されている。
本処理は、まず、データドライブ14から更新前のデータ(以下、旧データ)をキャッシュメモリ42上に読み込む。具体的には、データドライブ(DRIVE(D.))14に接続されている第一のドライブインタフェースLSI(D.I/F1LSI)31が、同一基板上の第一のバックエンドバッファ(BE1BUF.)35へ旧データを読み込む。具体的には、第一のドライブインタフェースLSI31は、データドライブ14に対し旧データを読み込むリードコマンドを発行し、受け取ったデータを第一のバックエンドバッファ35に書き込む。
次に、第一のバックエンドバッファ35と同じバックエンド基板3上に存在する第一のバックエンドDMA(BE1DMA)33が、第一のバックエンドバッファ35上の旧データをキャッシュメモリ42に転送する。具体的には、バックエンドDMA33は、第一のバックエンドバッファ35に対し、リード要求を発行し、受け取った旧データをキャッシュメモリ42に書き込む。
次に、同様にして、RAID5デステージ処理93/94は、パリティドライブ(DRIVE(P.))14に格納されている更新前のパリティ(以下、旧パリティ)を、キャッシュメモリ42上に読み込む。手順は、第二バックエンド基板3上の、第二のドライブインタフェースLSI(D.I/F2LSI)31、第二のバックエンドバッファ(BE2BUF.)35、第二のバックエンドDMA(BE2DMA)33を用いることを除いて、上記ユーザデータの読み込みと同様である。
次に、RAID5デステージ処理93/94は、キャッシュメモリ42上に元々存在するホストから書き込まれたデータ(以下、新データ)、及び読み込んだ旧データ、旧パリティから、更新後のパリティ(以下、新パリティ)を生成する。具体的には、パリティ生成器(PARITY GEN.)36が、旧データ、旧パリティ、新データを読み込むリードコマンドをキャッシュメモリ42に対して発行する。パリティ生成器36は、受け取った3つのデータのXORを計算して新パリティを生成し、それをキャッシュメモリ42に書き込む。
この後、RAID5デステージ処理93/94は、新データをキャッシュメモリ42からデータドライブ14に書き込む。具体的には、まず、第一のバックエンドDMA33がキャッシュメモリ42に対してリード要求を発行し、受け取った新データを第一のバックエンドバッファ35に書き込む。次に、第一のドライブインタフェースLSI31が第一のバックエンドバッファ35にリード要求を発行し、受け取った新データをデータドライブ14に書き込むライトコマンドを発行する。
最後に、RAID5デステージ処理93/94は、旧パリティをキャッシュメモリ42からパリティドライブ14に書き込む。手順は、第二のバックエンドDMA33、第二のバックエンドバッファ35、第二のドライブインタフェースLSI31を用いることを除けば新データの書き込みと同様である。
図27は、転送シーケンサ34を用いたRAID5デステージ処理93の一例を示している。図8のS8113〜S8117が、本処理に対応する。本処理では、プロセッサ44は、まず転送中継メモリを確保する。具体的には、プロセッサ44は、旧データをデータドライブ14から読み込むため第一のバッファ領域を第一のバックエンドバッファ(BE1BUF.)35において確保する(S9311)。次に、プロセッサ44は、旧パリティをパリティドライブ14から読み込むため第二のバッファ領域を、第二のバックエンドバッファ(BE2BUF.)35において確保する(S9312)。
同様にして、プロセッサ44は、新データをキャッシュメモリ42からデータドライブ14に書き込む(デステージ)ための第三のバッファ領域を、第一のバックエンドバッファ35において確保する(S9313)。プロセッサ44は、新パリティをキャッシュメモリ42からパリティドライブ14に書き込むための第四のバッファ領域を、第二のバックエンドバッファ35において確保する(S9314)。以上により、転送中継メモリの確保が完了する。
次に、プロセッサ44は、転送コマンド及び転送シーケンスを作成する。具体的には、まず、プロセッサ44は、旧データをデータドライブ14からキャッシュメモリ42にステージする第一の転送シーケンスを作成する(S9315)。次に、プロセッサ44は、旧パリティをパリティドライブ14からキャッシュメモリ42にステージする第二の転送シーケンスを作成する(S9316)。
次に、プロセッサ44は、パリティ生成器36を用いて旧データ、旧パリティ、新データから新パリティを生成する第三の転送シーケンスを作成する(S9317)。本シーケンスは、パリティ生成器36に対し送信するパリティ生成に対応するデータ転送コマンドのみで構成される。次に、プロセッサ44は、新データをキャッシュメモリ42からデータドライブ14にデステージする第四の転送シーケンスを作成する(S9318)。プロセッサ44は、新パリティをキャッシュメモリ42からデータドライブ14にデステージする第五の転送シーケンスを作成する(S9319)。
プロセッサ44は、第一の転送シーケンスの終了時処理を第二の転送シーケンス起動に(S9320)、第二の転送シーケンスの終了時処理を第三の転送シーケンス起動に(S9321)、第三の転送シーケンスの終了時処理を第四の転送シーケンス起動に(S9322)、第四の転送シーケンスの終了時処理を第五の転送シーケンス起動に(S9323)、それぞれ設定する。以上により、転送シーケンスの作成が完了する。尚、ステージ、デステージを行う転送シーケンス作成処理の詳細は、図29、図30を参照して後述する。
プロセッサ44は、生成した各転送シーケンスを対応するバックエンド転送シーケンサ34に送信する(S9324)。具体的には、第一、第四の転送シーケンスは、データドライブ14が接続されている第一のバックエンド基板3上の第一の転送シーケンサ34に、第二、第五の転送シーケンスは、パリティドライブ14が接続されている第二のバックエンド基板3上の第二の転送シーケンサ34に送信される。
第三の転送シーケンスは、今回のパリティ生成で用いるパリティ生成器36が存在するバックエンド基板3上の転送シーケンサ34に送信される。尚、パリティ生成器36及びパリティ生成器36を動作させる転送シーケンサは、キャッシュメモリ基板41上など、別の場所にあっても良い。
次に、プロセッサ44は、第一の転送シーケンスの起動を、第一のバックエンド転送シーケンサ34に対し指示する(S9325)。プロセッサ44は、第五の転送シーケンスの完了を知らせるステータスが到着するのを待つ(S9326)。プロセッサ44は、ステータスを受け取ると、転送の成功を確認し(S9327)、確保した第一から第四のバッファ領域を解放する(S9328)。そして、プロセッサ44は処理を終了する。
図28は、転送シーケンサを使わないRAID5デステージ処理94の一例を示している。図8のS8118〜S8124が本処理に対応する。本処理では、まず、プロセッサ44は、旧データをデータドライブ14からキャッシュメモリ42にステージするための第一のバッファ領域を、データドライブ14が接続されている第一のバックエンド基板3上の第一のバックエンドバッファ35に確保する(S9411)。
次に、プロセッサ44は、旧データをデータドライブ14からキャッシュメモリ42にステージする(S9412)。そして、プロセッサ44は、確保した第一のバッファ領域を解放する(S9413)。
次に、プロセッサ44は、旧パリティをパリティドライブ14からキャッシュメモリ42にステージするための第二のバッファ領域を、パリティドライブ14が接続されている第二のバックエンド基板3上の第二のバックエンドバッファ35に確保する(S9414)。プロセッサ44は、旧パリティをパリティドライブ14からキャッシュメモリ42にステージする(S9415)。プロセッサ44は、確保した第二のバッファ領域を解放する(S9416)。
次に、プロセッサ44は、パリティ生成器36を用い、キャッシュメモリ42上の旧データ、旧パリティ、新データから、新パリティを生成する(S9417)。具体的には、プロセッサ44は、旧データ、旧パリティ、新データの3つを読み込んだ後に新パリティを生成し書き込むことを指示する転送コマンドを作成し、パリティ生成器36へ送信する。
次に、プロセッサ44は、新データをキャッシュメモリ42からデータドライブ14にデステージするための第三のバッファ領域を、データドライブ14が接続されている第一のバックエンド基板3上の第一のバックエンドバッファ35に確保する(S9418)。プロセッサ44は、新データをキャッシュメモリ42からデータドライブ14にデステージする(S9419)。プロセッサ44は、確保した第三のバッファ領域を解放する(S9420)。
次に、プロセッサ44は、新パリティをキャッシュメモリ42からパリティドライブ14にデステージするための第四のバッファ領域を、パリティドライブ14が接続されている第二のバックエンド基板3上の第二のバックエンドバッファ35に確保する(S9421)。プロセッサ44は、新パリティをキャッシュメモリ42からパリティドライブ14にデステージする(S9422)。プロセッサ44は、確保した第四のバッファ領域を解放する(S9423)。そして、プロセッサ44は処理を終了する。ここで、ステージ処理、デステージ処理の詳細は、図31、図32で述べる。
図29は、データのステージを行うための転送シーケンスを生成するステージシーケンス生成処理95の一例である。本処理では、まず、プロセッサ44は、ドライブインタフェースLSI31を用いてドライブ14からバックエンドバッファ35にデータ転送を行う転送コマンドを作成する(S951)。
次に、プロセッサ44は、バックエンドDMA33を用いてバックエンドバッファ35からキャッシュメモリ42にデータを転送する転送コマンドを作成する(S952)。さらに、プロセッサ44は、この2つの転送コマンドを順に行う転送シーケンスを作成し(S953)、処理を終了する。
図30は、データのデステージを行うための転送シーケンスを生成するデステージシーケンス生成処理96の一例である。本処理では、まず、プロセッサ44は、バックエンドDMA33を用いてキャッシュメモリ42からバックエンドバッファ35にデータを転送する転送コマンドを生成する(S961)。
次に、プロセッサ44は、ドライブインタフェースLSI31を用いてバックエンドバッファ35からドライブ14にデータ転送を行う転送コマンドを生成する(S962)。プロセッサ44は、この2つの転送コマンドを順に行う転送シーケンスを作成し(S963)、処理を終了する。
図31は、転送シーケンサ34を用いないデステージ処理で用いられる、データのキャッシュメモリ42へのステージ処理97の一例である。本処理では、まず、プロセッサ44は、ドライブインタフェースLSI31を用いてドライブ14からバックエンドバッファ35にデータ転送を行う転送コマンドを作成する(S971)。
次に、プロセッサ44は、作成したコマンドをドライブインタフェースLSI31に送信し、転送実施を指示する(S972)。プロセッサ44は、ドライブインタフェースLSI31からの転送が終了したことを示すステータスの送信を待つ(S973)。プロセッサ44は、ステータスを受け取ると、内容を解析し、転送の成功を確認する(S974)。
次に、プロセッサ44は、バックエンドDMA33を用いてバックエンドバッファ35からキャッシュメモリ42にデータ転送を行う転送コマンドを作成する(S975)。プロセッサ44は、作成したコマンドをバックエンドDMA33に送信し、転送実施を指示する(S976)。
プロセッサ44は、バックエンドDMA33からの転送が終了したことを示すステータスの送信を待つ(S977)。ステータスを受け取ると、内容を解析し、転送の成功を確認する(S978)。そして、プロセッサ44は、処理を終了する。
図32は、転送シーケンサ34を用いない、ドライブ14へのデータのデステージ処理98の一例である。本処理では、まず、プロセッサ44は、バックエンドDMA33を用いてキャッシュメモリ42からバックエンドバッファ35にデータ転送を行う転送コマンドを作成する(S981)。
プロセッサ44は、作成したコマンドをバックエンドDMA33に送信し、転送実施を指示する(S982)。プロセッサ44は、転送が終了したことを示すバックエンドDMA33からのステータス送信を待つ(S983)。プロセッサ44は、ステータスを受け取ると、内容を解析し、転送の成功を確認する(S984)。
次に、プロセッサ44は、ドライブインタフェースLSI31を用いてバックエンドバッファ35からドライブ14にデータ転送を行う転送コマンドを作成する(S985)。プロセッサ44は、作成したコマンドをドライブインタフェースLSI31に送信し、転送実施を指示する(S986)。プロセッサ44は、転送が終了したことを示すドライブインタフェースLSI31からのステータス送信を待つ(S987)。プロセッサ44は、ステータスを受け取ると、内容を解析し、転送の成功を確認する(S988)。そして、プロセッサ44は、処理を終了する。
転送シーケンサ24/34を用いる場合、転送を起動してから一連の転送が終わることを確認するまでの間、プロセッサ44が介在する必要が無い。このため、プロセッサ44の処理量が減少し、ストレージシステム1の処理能力が向上する。一方、転送シーケンサ24/34を用いない場合、バッファ(領域)を必要な時間だけ確保し解放するので、必要なバッファ領域の量を抑えることができる。
このため、プロセッサ44の処理能力に余力が有るとき、バッファ量に余裕が無いとき等は、転送シーケンサ24/34を用いない方が良い場合がある。また、転送すべきデータが連続した領域に無い場合など、一段階の転送に複数の転送コマンドが必要となる場合も、転送シーケンサを用いない方が、転送シーケンサ24/34の構造を単純化できるので好ましい。また、同一データへのアクセスが集中している場合も、転送シーケンサ24/34を用いずにプロセッサ44が転送を行う方が、長時間、データへのアクセス排他をする必要が無くなるため、効率が良い。
以上の構成により、ストレージシステムにおけるデータ転送において、プロセッサの処理量を減らすことができる。その結果、ストレージシステムの性能を向上させることができる。本実施形態において必要となる転送シーケンサはハードウェア通信を行うだけのシンプルなものであり、追加で必要となる資源(回路規模及びメモリ量)は小さい。
以上、本発明の実施形態を説明したが、本発明が上記の実施形態に限定されるものではない。当業者であれば、上記の実施形態の各要素を、本発明の範囲において容易に変更、追加、変換することが可能である。ある実施形態の構成の一部を他の実施形態の構成に置き換えることが可能であり、ある実施形態の構成に他の実施形態の構成を加えることも可能である。各実施形態の構成の一部について、他の構成の追加・削除・置換をすることが可能である。
本発明は、ドライブ又はキャッシュメモリを有していないストレージシステムに適用することができる。ドライブを有していないストレージシステムは、上記実施形態におけるキャッシュメモリに相当する記憶デバイスが、ユーザデータの最終的な記憶領域を提供する。典型的には、そのようなストレージシステムは、複数の電源装置を有し、ユーザデータを複数の記憶デバイスのそれぞれに格納することで、データ消失の蓋然性を低下させる。