(57)【特許請求の範囲】
【請求項１】
要求されたデータ書き込みまたはデータ読み出しをシーケンシャルアクセスと判定した場合に前記データ書き込みまたは前記データ読み出しのためのコマンドを優先的に処理するようにコマンド実行順序を変更するストレージ装置と、
前記ストレージ装置に要求予定のデータ書き込みの書き込みデータのサイズが、前記シーケンシャルアクセスに対応する特定のデータサイズ以上であることで、当該データ書き込みが前記ストレージ装置において前記シーケンシャルアクセスだと判定されると予測した場合には、前記書き込みデータを前記特定のサイズよりも小さく分割して分割データとし、分割データの各々に関してデータ書き込みコマンドを前記ストレージ装置に発行するとともに、前記ストレージ装置に要求予定のデータ読み出しの読み出しデータのサイズが、前記シーケンシャルアクセスに対応する特定のデータサイズ以上であることで、当該データ読み出しが前記ストレージ装置において前記シーケンシャルアクセスだと判定されると予測した場合には、前記読み出しデータを前記特定のサイズよりも小さいサイズに分割した分割データの各々を読み出すためのデータ読み出しコマンドを前記ストレージ装置に発行するサイズ調整処理を実行する制御装置と
を有することを特徴とするストレージシステム。
【請求項２】
前記制御装置は、前記ストレージ装置に発行された前記データ書き込みコマンドまたは前記データ読み出しコマンドのタイムアウトが発生してから所定期間において前記サイズ調整処理を実行する
ことを特徴とする請求項１記載のストレージシステム。
【請求項３】
前記制御装置は、前記ストレージ装置における未実行のコマンドの数に基づいて、前記サイズ調整処理を実行するか否かを決定する
ことを特徴とする請求項２記載のストレージシステム。
【請求項４】
前記制御装置は、前記未実行のコマンドの数が所定のしきい値以上であると判定した場合には、前記ストレージ装置に発行するコマンドに、前記ストレージ装置に対して受信順にコマンドを実行させる第１のモードを設定する
ことを特徴とする請求項３記載のストレージシステム。
【請求項５】
前記制御装置は、前記未実行のコマンドの数が前記しきい値以上であると判定した場合には、前記ストレージ装置に発行する前記データ読み出しコマンドによるデータ読み出しまたは前記データ書き込みコマンドによるデータ書き込みがシーケンシャルアクセスかランダムアクセスかを判定し、
ランダムアクセスと判定した場合には、前記ストレージ装置に発行するコマンドに前記第１のモードを設定し、
シーケンシャルアクセスと判定した場合には、前記ストレージ装置に発行するコマンドに、前記ストレージ装置に対してコマンドの実行順の変更を許容させる第２のモードを設定する
ことを特徴とする請求項４記載のストレージシステム。
【請求項６】
前記制御装置は、前記ストレージ装置に発行するコマンドに前記第１のモードを設定する制御を開始した後の一定時間は、前記ストレージ装置に発行するコマンドに当該第１のモードを設定する制御を継続する
ことを特徴とする請求項４記載のストレージシステム。
【請求項７】
前記制御装置は、前記サイズ調整処理を開始した後の一定時間は、前記サイズ調整処理を継続する
ことを特徴とする請求項１〜６のいずれか１項に記載のストレージシステム。
【請求項８】
前記ストレージシステムは、複数の前記ストレージ装置を含み、
前記制御装置は、
データが異なるストレージ装置に冗長化されるように前記複数のストレージ装置へのデータの書き込みを制御し、
前記複数のストレージ装置の少なくとも１つが、発行されたコマンドのタイムアウトが発生してから所定時間が経過していないタイムアウト状態にある場合に、前記複数のストレージ装置のうち少なくとも前記タイムアウト状態にあるストレージ装置に対して発行するコマンドについて前記サイズ調整処理を実行する
ことを特徴とする請求項１記載のストレージシステム。
【請求項９】
前記制御装置は、前記複数のストレージ装置のそれぞれに発行されたコマンドのうち各ストレージ装置において未実行のコマンドの数に基づいて、前記複数のストレージ装置が高負荷状態であるか否かをストレージ装置ごとに判定し、
前記複数のストレージ装置の少なくとも１つが前記高負荷状態にある場合には、前記複数のストレージ装置のうち少なくとも前記高負荷状態にあるストレージ装置に対して発行するコマンドについて前記サイズ調整処理を実行する
ことを特徴とする請求項８記載のストレージシステム。
【請求項１０】
前記制御装置は、
前記複数のストレージ装置へのデータの書き込みを、パリティを用いることでデータが異なるストレージ装置に冗長化されるように制御し、
前記複数のストレージ装置に対してデータ読み出しを指示するデータ読み出しコマンドが発行される際に、前記複数のストレージ装置のうち、前記タイムアウト状態または前記高負荷状態のいずれかの状態にあるストレージ装置が、１ストライプに含まれるパリティの数以下である場合には、前記複数のストレージ装置に対して発行するデータ読み出しコマンドについて前記サイズ調整処理を抑止するとともに、前記タイムアウト状態または前記高負荷状態のいずれかの状態にあるストレージ装置からのデータの読み出しを抑止し、前記タイムアウト状態または前記高負荷状態のいずれかの状態にあるストレージ装置から読み出すべきデータを、他のいずれかのストレージ装置から読み出したパリティを用いて復元する
ことを特徴とする請求項９記載のストレージシステム。
【請求項１１】
前記制御装置は、
前記複数のストレージ装置のうち、前記タイムアウト状態または前記高負荷状態のいずれかの状態にあるストレージ装置が、１ストライプに含まれるパリティの数より多い場合には、前記複数のストレージ装置の中に前記高負荷状態にあるストレージ装置があるかを判定し、
前記高負荷状態にあるストレージ装置が１台もない場合には、前記複数のストレージ装置に対して発行するデータ読み出しコマンドについて前記サイズ調整処理を実行し、
前記高負荷状態にあるストレージ装置がある場合には、前記複数のストレージ装置に対して発行するデータ読み出しコマンドについて前記サイズ調整処理を抑止する
ことを特徴とする請求項１０記載のストレージシステム。
【請求項１２】
前記制御装置は、
前記複数のストレージ装置のうち、前記タイムアウト状態または前記高負荷状態のいずれかの状態にあるストレージ装置が、１ストライプに含まれるパリティの数より多く、かつ、前記高負荷状態にあるストレージ装置がある場合には、発行するデータ読み出しコマンドによるデータ読み出しがシーケンシャルアクセスかランダムアクセスかを判定し、
ランダムアクセスと判定した場合に、前記複数のストレージ装置に発行するコマンドに、前記ストレージ装置に対してコマンドを受信順に実行させる第１のモードを設定し、シーケンシャルアクセスと判定した場合に、前記複数のストレージ装置に送信するコマンドに、前記ストレージ装置に対してコマンドの実行順の変更を許容させる第２のモードを設定する
ことを特徴とする請求項１１記載のストレージシステム。
【請求項１３】
記憶装置と、
前記記憶装置に対してデータ書き込みまたはデータ読み出しを指示するコマンドに含める書き込みデータサイズまたは読み出しデータサイズを、所定サイズ以下に制限する制御を行うコマンド発行制御部と、
前記コマンド発行制御部によって前記書き込みデータサイズまたは前記読み出しデータサイズが制限されたコマンドを前記記憶装置に送信する送信部と、
を有し、
前記コマンド発行制御部は、前記記憶装置に送信されたコマンドのうち前記記憶装置において未実行のコマンドの数が所定のしきい値以上であると判定した場合には、前記記憶装置に送信するコマンドに、前記記憶装置に受信順にコマンドを実行させるモードを設定する
ことを特徴とするストレージシステム。
【請求項１４】
複数の記憶装置と、
前記記憶装置に対してデータ書き込みまたはデータ読み出しを指示するコマンドに含める書き込みデータサイズまたは読み出しデータサイズを、所定サイズ以下に制限する制御を行うコマンド発行制御部と、
前記コマンド発行制御部によって前記書き込みデータサイズまたは前記読み出しデータサイズが制限されたコマンドを前記記憶装置に送信する送信部と、
前記複数の記憶装置へのデータの書き込みを、パリティを用いることでデータが異なる記憶装置に冗長化されるように制御する書き込み制御部と
を有し、
前記コマンド発行制御部は、
前記複数の記憶装置のそれぞれに送信されたコマンドのうち各記憶装置において未実行のコマンドの数に基づいて、前記複数の記憶装置が高負荷状態であるか否かを記憶装置ごとに判定し、
前記複数の記憶装置に対してデータ読み出しを指示するデータ読み出しコマンドが送信される際に、前記複数の記憶装置のうち、送信されたコマンドのタイムアウトが発生してから所定時間が経過していないタイムアウト状態または前記高負荷状態のいずれかの状態にある記憶装置が、１ストライプに含まれるパリティの数以下である場合には、前記複数の記憶装置に対して送信するデータ読み出しコマンドに含める前記読み出しデータサイズを前記所定サイズ以下に制限する制御の実行を抑止するとともに、前記タイムアウト状態または前記高負荷状態のいずれかの状態にある記憶装置からのデータの読み出しを抑止し、前記タイムアウト状態または前記高負荷状態のいずれかの状態にある記憶装置から読み出すべきデータを、他のいずれかの記憶装置から読み出したパリティを用いて復元する
ことを特徴とするストレージシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージシステムに関する。
【背景技術】
【０００２】
近年、記憶装置としてＨＤＤ（Hard Disk Drive）を備えるストレージシステムでは、ＨＤＤの大容量化やシステムの規模の拡大によって、各ＨＤＤに対して発行されるコマンド数が増大する傾向にある。このため、ＨＤＤが備えるコマンドキューに多数のコマンドが蓄積されて、ＨＤＤにおける読み出しまたは書き込みの速度が低下することがある。
【０００３】
このような問題に対して、近年のＨＤＤの中には、コマンドキューに蓄積されたコマンドの実行順を処理時間が短くなるように並べ替えるリオーダリング機能を備えるものがある。リオーダリング機能を備えるＨＤＤは、例えば、コマンドキューに蓄積されたコマンドの実行順を、シーク時間および回転待ち時間が短くなるように並べ替える。
【０００４】
なお、ＨＤＤのアクセス処理時間を短縮するための他の技術として、休止状態のＨＤＤからのデータ読み出しを抑止する代わりに、そのデータに基づくパリティを他のＨＤＤから読み出すようにしたストレージシステムがある。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００２−２３９６２号公報
【特許文献２】特開２００９−１６３３１０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
コマンドのリオーダリング機能を備えるＨＤＤでは、コマンドの実行順が並び替えられることで、特定のコマンドの実行が大きく遅延することがある。コマンドの実行遅延が大きくなると、コマンド発行側は、コマンドのタイムアウトが発生したと判定してしまうこともある。
【０００７】
１つの側面では、本発明は、記憶装置におけるコマンドの実行遅延を抑制することが可能なストレージシステムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
一態様によれば、要求されたデータ書き込みまたはデータ読み出しをシーケンシャルアクセスと判定した場合にデータ書き込みまたはデータ読み出しのためのコマンドを優先的に処理するようにコマンド実行順序を変更するストレージ装置と、ストレージ装置に要求予定のデータ書き込みの書き込みデータのサイズが、シーケンシャルアクセスに対応する特定のデータサイズ以上であることで、当該データ書き込みがストレージ装置においてシーケンシャルアクセスだと判定されると予測した場合には、書き込みデータを特定のサイズよりも小さく分割して分割データとし、分割データの各々に関してデータ書き込みコマンドをストレージ装置に発行するとともに、ストレージ装置に要求予定のデータ読み出しの読み出しデータのサイズが、シーケンシャルアクセスに対応する特定のデータサイズ以上であることで、当該データ読み出しがストレージ装置においてシーケンシャルアクセスだと判定されると予測した場合には、読み出しデータを特定のサイズよりも小さいサイズに分割して得られる分割データの各々を読み出すためのデータ読み出しコマンドをストレージ装置に発行するサイズ調整処理を実行する制御装置とを有するストレージシステムが提供される。
【発明の効果】
【００１１】
１態様によれば、記憶装置におけるコマンドの実行遅延を抑制することができる。
【図面の簡単な説明】
【００１２】
【図１】第１の実施の形態に係るストレージシステムの構成例およびその動作例を示す図である。
【図２】第２の実施の形態に係るストレージシステムの構成例を示す図である。
【図３】ＣＭ、およびＤＥ内のＨＤＤのハードウェア構成例を示す図である。
【図４】ＣＭ、およびＤＥ内のＨＤＤが備える処理機能の構成例を示すブロック図である。
【図５】コマンドのリオーダリングについて説明するための図である。
【図６】ＣＭが備える処理機能の詳細およびＣＭの動作例を示す図である。
【図７】ＲＡＩＤ制御部の処理手順の例を示すフローチャートである。
【図８】第２のコマンド発行制御について説明するための図である。
【図９】第２のコマンド発行制御の処理手順の例を示すフローチャートである。
【図１０】第３のコマンド発行制御について説明するための図である。
【図１１】読み出しブロック数の違いによるコマンドの実行順の変化について説明するための図である。
【図１２】第３のコマンド発行制御の処理手順の例を示すフローチャートである。
【図１３】第４のコマンド発行制御について説明するための図である。
【図１４】キューモードの違いによるコマンドの実行順の変化について説明するための図である。
【図１５】第４のコマンド発行制御の処理手順の例を示すフローチャートである。
【図１６】ディスク制御部の処理手順の例を示すフローチャートである。
【図１７】ＲＡＩＤ制御部の処理の変形例を示すフローチャートである。
【図１８】第３の実施の形態のＲＡＩＤ制御部の処理手順の例を示すフローチャートである。
【発明を実施するための形態】
【００１３】
以下、本発明の実施の形態について図面を参照して説明する。
〔第１の実施の形態〕
図１は、第１の実施の形態に係るストレージシステムの構成例およびその動作例を示す図である。図１に示すストレージシステム１は、記憶装置１０と、この記憶装置１０に対するアクセスを制御するストレージ制御装置２０とを備える。
【００１４】
記憶装置１０は、例えば記録媒体としてＨＤＤを備える。記憶装置１０は、ストレージ制御装置２０から発行されるコマンドを受信し、受信したコマンドに応じて、記録媒体へのデータの書き込み処理、あるいは記録媒体からのデータの読み出し処理を行う。
【００１５】
また、記憶装置１０は、受信したコマンドの実行順を変更するリオーダリング機能を備えている。例えば、記憶装置１０は、受信したコマンドを一時的に蓄積するコマンドキュー１１を備え、コマンドキュー１１からコマンドを１つずつ読み出し、読み出したコマンドに応じた処理を実行する。そして、記憶装置１０は、処理時間が短くなるように、コマンドキュー１１からのコマンドの読み出し順を入れ替える。記録媒体がＨＤＤである場合、記憶装置１０は、シーク時間および回転待ち時間が短くなるように、コマンドの読み出し順を入れ替える。
【００１６】
ストレージ制御装置２０は、記憶装置１０に対してコマンドを発行することで、記憶装置１０に対するアクセスを制御する。ストレージ制御装置２０は、例えば、記憶装置１０にコマンドを送信する送信部２１と、送信部２１におけるコマンドの発行の仕方を制御するコマンド発行制御部２２を備える。
【００１７】
コマンド発行制御部２２は、記憶装置１０に対してデータ書き込みまたはデータ読み出しを指示するコマンドに含める書き込みデータサイズまたは読み出しデータサイズを、所定サイズ以下に制限する制御を行うことが可能である。送信部２１が、コマンド発行制御部２２によって書き込みデータサイズまたは読み出しデータサイズが制限されたコマンドを記憶装置１０に送信することにより、記憶装置１０におけるコマンドの実行遅延を抑制することができる。
【００１８】
以下、ストレージシステム１における動作例について説明する。ここでは例として、記憶装置１０からデータが読み出される場合について説明する。
図１の第１の動作例では、ストレージ制御装置２０の送信部２１は、読み出しコマンドＣ１，Ｃ２，Ｃ３を、この順序で記憶装置１０に発行する。読み出しコマンドＣ１，Ｃ２，Ｃ３は、それぞれ、記憶装置１０に記憶されたデータＤ１，Ｄ２，Ｄ３を読み出すためのものである。
【００１９】
記憶装置１０のコマンドキュー１１には、コマンドＣ１，Ｃ２，Ｃ３の順にコマンドが蓄積され、記憶装置１０は、これらのコマンドＣ１，Ｃ２，Ｃ３の実行順を決定する。ここで、データＤ１，Ｄ３の各サイズは、上記の上限サイズより大きいものとし、データＤ２のサイズは、上限サイズ以下であるものとする。また、データＤ１，Ｄ３は、記憶装置１０における連続した記憶領域に記録されており、データＤ２は、データＤ１，Ｄ３とは離れた領域に記録されているものとする。
【００２０】
このような条件下では、記憶装置１０は、コマンドＣ１を実行した後、コマンドＣ２よりコマンドＣ３を先に実行する可能性が高い。この場合、コマンドＣ２について大きな実行遅延が生じることになる。記憶装置１０がコマンドＣ１，Ｃ３，Ｃ２の順に実行した場合、記憶装置１０からは、データＤ１，Ｄ３，Ｄ２の順にデータが読み出され、ストレージ制御装置２０に転送される。
【００２１】
一方、ストレージ制御装置２０のコマンド発行制御部２２は、第２の動作例として示すように、読み出しデータサイズが上限サイズ以下に制限された状態でコマンドが発行されるように、送信部２１におけるコマンド発行処理を切り替えることができる。
【００２２】
第２の動作例では、コマンド発行制御部２２は、データＤ１を上限サイズ以下に分割して得られるデータＤ１１，Ｄ１２，Ｄ１３をそれぞれ個別に読み出すように、コマンドの発行の仕方を変更する。このとき、送信部２１は、データＤ１１，Ｄ１２，Ｄ１３をそれぞれ読み出すためのコマンドＣ１１，Ｃ１２，Ｃ１３を、この順序で発行する。
【００２３】
また、コマンド発行制御部２２は、データＤ３を上限サイズ以下に分割して得られるデータＤ３１，Ｄ３２，Ｄ３３をそれぞれ個別に読み出すように、コマンドの発行の仕方を変更する。このとき、送信部２１は、データＤ３１，Ｄ３２，Ｄ３３をそれぞれ読み出すためのコマンドＣ３１，Ｃ３２，Ｃ３３を、この順序で発行する。
【００２４】
従って、第２の動作例では、送信部２１は、コマンドＣ１１，Ｃ１２，Ｃ１３，Ｃ２，Ｃ３１，Ｃ３２，Ｃ３３の順で、記憶装置１０にコマンドを発行する。
ここで、記憶装置１０のリオーダリング処理では、一般的に、ランダムアクセスのコマンドよりシーケンシャルアクセスのコマンドの方が優先的に実行される傾向がある。また、ランダムアクセスのコマンドは、シーケンシャルアクセスのコマンドより、アクセスされるデータサイズが小さいことが多い。
【００２５】
第２の動作例のように、コマンドごとにアクセスされるデータサイズを小さくすることで、記憶装置１０のコマンドキュー１１に蓄積された未実行のコマンドのうち、ランダムアクセスと推定されるコマンドの相対的な数が増加していく。これにより、コマンドの実行順序が後回しになりにくくなる。
【００２６】
また、コマンドごとにアクセスされるデータのサイズが小さくなって、コマンドキュー１１に蓄積されるコマンドの数が増加することで、次に実行するコマンドを決定する機会が増加する。その結果、ランダムアクセスのコマンドがより早い順序で実行される可能性が高まる。
【００２７】
このように、ランダムアクセスのコマンドの実行順序が後回しになりにくくなることで、新たに発行したコマンドは、コマンドの発行順に実行されやすくなる。例えば、図１に示すように、コマンドＣ２の実行順が、データＤ３に対応するデータＤ３１，Ｄ３２，Ｄ３３をそれぞれ読み出すためのコマンドＣ３１，Ｃ３２，Ｃ３３より前になる可能性が、第１の動作例より高くなる。また、コマンドＣ２が、コマンドＣ１３あるいはコマンドＣ１２より先に実行される可能性も、第１の動作例より高くなる。
【００２８】
また、上記の第２の動作例のように、コマンドに含める書き込みデータサイズまたは読み出しデータサイズが上限サイズ以下に制限されることで、発行されるコマンド数は増加する。このため、このようにコマンドに含める書き込みデータサイズまたは読み出しデータサイズを制限したコマンド発行処理を、常時実行することは好ましくない。なぜなら、コマンドの数が増加することで、記憶装置１０におけるデータアクセス効率が低下する可能性があるからである。
【００２９】
これに対して、コマンド発行制御部２２は、コマンドに含める書き込みデータサイズまたは読み出しデータサイズを上限サイズ以下に制限するか否かを、切り替えることができる。
【００３０】
例えば、コマンド発行制御部２２は、記憶装置１０に発行したコマンドのタイムアウトが発生してから所定期間において、コマンドに含める書き込みデータサイズまたは読み出しデータサイズを上限サイズ以下に制限する。これにより、すでにコマンドの大幅な実行遅延が生じている状態でのみ、そのような状態を解消するための措置を施すことができる。
【００３１】
また、コマンド発行制御部２２は、例えば、コマンドのタイムアウトが発生してから所定期間の間でも、記憶装置１０のコマンドキュー１１に蓄積されたコマンド数がしきい値以上であると判定した場合には、コマンドに含める書き込みデータサイズまたは読み出しデータサイズを上限サイズ以下に制限しないようにしてもよい。これにより、コマンドキュー１１に蓄積されたコマンド数が増大して、記憶装置１０での処理効率がさらに悪化する事態を回避することができる。
【００３２】
〔第２の実施の形態〕
図２は、第２の実施の形態に係るストレージシステムの構成例を示す図である。図２に示すストレージシステム１００は、ＣＭ（Controller Module）２００およびＤＥ（Drive Enclosure）３００を含む。また、ＣＭ２００にはホスト装置４００が接続されている。
【００３３】
ＣＭ２００は、ホスト装置４００からのＩ／Ｏ（In/Out）要求に応じて、ＤＥ３００内の記憶装置に対するデータの読み書きを行う。ＣＭ２００は、ＤＥ３００内の記憶装置によって実現される物理記憶領域をＲＡＩＤ（Redundant Arrays of Inexpensive Disks）によって管理し、これらの物理記憶領域に対するアクセスを制御する。
【００３４】
ＤＥ３００は、ＣＭ２００からのアクセス制御対象となる複数の記憶装置を備える。本実施の形態のＤＥ３００は、記憶装置としてＨＤＤを備えるディスクアレイ装置である。また、ＤＥ３００内のＨＤＤは、ＣＭ２００から受け付けたコマンドの実行順を適正化するコマンドリオーダリング機能を備えている。
【００３５】
ホスト装置４００は、ユーザの操作に応じて、ＣＭ２００に対して、ＤＥ３００内のＨＤＤへのアクセスを要求する。ホスト装置４００は、例えば、ユーザの操作に応じて、ＣＭ２００を通じて、ＤＥ３００内のＨＤＤからのデータの読み出しや、ＤＥ３００内のＨＤＤに対するデータの書き込みを行うことができる。
【００３６】
図３は、ＣＭ、およびＤＥ内のＨＤＤのハードウェア構成例を示す図である。
ＣＭ２００は、ＣＰＵ（Central Processing Unit）２０１によって装置全体が制御されている。ＣＰＵ２０１には、ＲＡＭ（Random Access Memory）２０２および複数の周辺機器が、バス２０９を介して接続されている。ＲＡＭ２０２は、ＣＭ２００の主記憶装置として使用され、ＣＰＵ２０１に実行させるプログラムの少なくとも一部や、このプログラムによる処理に必要な各種データを一時的に記憶する。
【００３７】
ＣＰＵ２０１には、周辺機器の例として、ＳＳＤ２０３、グラフィック処理装置２０４、入力インタフェース２０５、光学ドライブ装置２０６、ホストインタフェース２０７およびディスクインタフェース２０８が接続されている。
【００３８】
ＳＳＤ２０３は、ＣＭ２００の二次記憶装置として使用され、ＣＰＵ２０１によって実行されるプログラムやその実行に必要な各種のデータなどを記憶する。なお、二次記憶装置としては、例えば、ＨＤＤなどの他の種類の不揮発性記憶装置が使用されてもよい。
【００３９】
グラフィック処理装置２０４には、モニタ２０４ａが接続されている。グラフィック処理装置２０４は、ＣＰＵ２０１からの命令に従って、画像をモニタ２０４ａに表示させる。なお、モニタ２０４ａは、例えば、液晶ディスプレイである。
【００４０】
入力インタフェース２０５には、キーボード２０５ａ、マウス２０５ｂなどの入力装置が接続されている。入力インタフェース２０５は、入力装置からの出力信号をＣＰＵ２０１に送信する。
【００４１】
光学ドライブ装置２０６は、レーザ光などを利用して、光ディスク２０６ａに記録されたデータの読み取りを行う。光ディスク２０６ａは、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク２０６ａには、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（Rewritable）などがある。
【００４２】
ホストインタフェース２０７は、ホスト装置４００とＣＭ２００との間でデータを送受信するインタフェース処理を実行する。ディスクインタフェース２０８は、ＤＥ３００とＣＭ２００との間でデータを送受信するインタフェース処理を実行する。
【００４３】
一方、ＤＥ３００に搭載されるＨＤＤ３００ａは、それぞれコントローラ３０１、ＲＡＭ３０２および磁気ディスクドライブ３０３を備える。
コントローラ３０１は、ＨＤＤ３００ａ全体を制御する制御回路であり、例えばＣＰＵなどを備える。ＲＡＭ３０２は、コントローラ３０１が実行する処理に必要な各種のデータなどを記憶する。磁気ディスクドライブ３０３は、１つまたは複数の磁気ディスクを備え、コントローラ３０１による制御の下で磁気ディスクに対するデータの書き込みや磁気ディスクからのデータの読み出しを行う。
【００４４】
図４は、ＣＭ、およびＤＥ内のＨＤＤが備える処理機能の構成例を示すブロック図である。ＣＭ２００は、ホストＩ／Ｏ制御部２１０、ＲＡＩＤ制御部２２０およびディスク制御部２３０を備える。これらの各部の処理は、例えば、ＣＭ２００のＣＰＵ２０１が所定のプログラムを実行することで実現される。
【００４５】
ホストＩ／Ｏ制御部２１０は、ホスト装置４００から、ＤＥ３００内のＨＤＤによって実現される記憶領域に対するＩ／Ｏ要求（読み出し要求または書き込み要求）を受け付ける。ホストＩ／Ｏ制御部２１０は、ＣＭ２００のＲＡＭ２０２の一部を、ＤＥ３００に記録するデータをキャッシュするためのキャッシュ領域として使用しながら、ホスト装置４００からＤＥ３００の記憶領域へのアクセスを制御する。
【００４６】
例えば、ホストＩ／Ｏ制御部２１０は、ホスト装置４００から書き込みが要求されたデータを、キャッシュ領域に一時的に蓄積する。ホストＩ／Ｏ制御部２１０は、キャッシュ領域へのデータの書き込みとは非同期のタイミングで、キャッシュ領域に蓄積されたデータをＤＥ３００の記憶領域に記憶させる「ライトバック」を実行する。ライトバックを実行する際、ホストＩ／Ｏ制御部２１０は、ライトバックの対象とするデータをＲＡＩＤ制御部２２０に出力して、ＤＥ３００への書き込みを依頼する。
【００４７】
また、ホストＩ／Ｏ制御部２１０は、ホスト装置４００からデータの読み出し要求を受け付けると、読み出しを要求されたデータがキャッシュ領域に蓄積されているかを判定する。読み出しを要求されたデータがキャッシュ領域に蓄積されている「キャッシュヒット」の状態である場合、ホストＩ／Ｏ制御部２１０は、データをキャッシュ領域から読み出してホスト装置４００に送信する。
【００４８】
一方、読み出しを要求されたデータがキャッシュ領域に蓄積されていない「キャッシュミス」の状態である場合、ホストＩ／Ｏ制御部２１０は、読み出しを要求されたデータをＤＥ３００から読み出す「ステージング（staging）」を実行する。ステージングを実行する際、ホストＩ／Ｏ制御部２１０は、読み出しを要求されたデータの論理位置を示す先頭アドレスおよびデータ長をＲＡＩＤ制御部２２０に通知して、そのデータの読み出しを依頼する。ホストＩ／Ｏ制御部２１０は、ＤＥ３００から読み出されたデータを、キャッシュ領域に格納するとともに、ホスト装置４００に送信する。
【００４９】
ＲＡＩＤ制御部２２０は、ホストＩ／Ｏ制御部２１０からのＩ／Ｏ要求に応じて、ディスク制御部２３０を通じてＤＥ３００内のＨＤＤにアクセスする。ＲＡＩＤ制御部２２０は、ＤＥ３００内のＨＤＤによって実現される記憶領域を、ＲＡＩＤ管理テーブル２４０を参照しながら、ＲＡＩＤによって管理する。
【００５０】
ＲＡＩＤ管理テーブル２４０には、ＲＡＩＤグループごとに、ＲＡＩＤグループに属するＨＤＤの識別番号、ＲＡＩＤグループで利用されるＲＡＩＤレベルなどの管理情報が登録されている。ＲＡＩＤグループとは、ＤＥ３００に搭載された複数のＨＤＤの物理記憶領域を組み合わせて構成される論理記憶領域である。
【００５１】
例えば、ＲＡＩＤ制御部２２０は、ホストＩ／Ｏ制御部２１０からあるＲＡＩＤグループに対するデータの書き込み要求を受けると、そのＲＡＩＤグループに関してＲＡＩＤ管理テーブル２４０に設定された情報に基づいて、データが冗長化されるように書き込み処理を制御する。例としてディスク数「４」のＲＡＩＤ−５で制御されるＲＡＩＤグループに書き込みを行うものとすると、ＲＡＩＤ制御部２２０は、ホストＩ／Ｏ制御部２１０から受信したデータを一定のデータ長で分割し、連続する３個の分割データとそれらに基づくパリティとを、４台のＨＤＤにおける同一ストライプ番号の領域に分散させて記録する。
【００５２】
ＲＡＩＤ制御部２２０は、上記のように、ＲＡＩＤ管理テーブル２４０に基づいて、ホストＩ／Ｏ制御部２１０から書き込みが要求されたデータの分割やパリティ計算を行うとともに、分割データおよびパリティの書き込み先とするＨＤＤを特定する。ＲＡＩＤ制御部２２０は、ディスク制御部２３０に対して、特定したそれぞれのＨＤＤに対する分割データおよびパリティの書き込みを依頼する。
【００５３】
また、ＲＡＩＤ制御部２２０は、ホストＩ／Ｏ制御部２１０からデータの読み出し依頼を受けると、ＲＡＩＤ管理テーブル２４０に基づいて、データが格納されているＨＤＤを特定する。ＲＡＩＤ制御部２２０は、ディスク制御部２３０に対して、特定したそれぞれのＨＤＤからのデータの読み出しを依頼する。
【００５４】
ディスク制御部２３０は、ＲＡＩＤ制御部２２０からのＩ／Ｏ要求に応じて、ＤＥ３００内のＨＤＤにアクセスし、データの読み出しまたはデータの書き込みを実行する。ディスク制御部２３０は、アクセス先のＨＤＤにコマンドを発行することで、コマンドに設定された情報に応じた処理をＨＤＤに実行させる。
【００５５】
さらに、ＲＡＩＤ制御部２２０およびディスク制御部２３０は、上記のような基本的な処理の他に、次のような処理を実行可能になっている。
ＲＡＩＤ制御部２２０は、ＤＥ３００内のＨＤＤごとにコマンドの実行状態を示すステータスが登録されたディスク管理テーブル２５０を参照可能になっている。ＲＡＩＤ制御部２２０は、ディスク管理テーブル２５０を参照し、アクセス対象のＲＡＩＤグループに属する各ＨＤＤのステータスに応じて、コマンドの実行遅延が生じにくくなるように、ディスク制御部２３０からのコマンドの発行のさせ方を調整する。なお、ディスク管理テーブル２５０は、例えば、ＣＭ２００のＲＡＭ２０２に一時的に記録される。
【００５６】
ディスク制御部２３０は、ＤＥ３００内の各ＨＤＤにおけるコマンドの実行状態を監視し、その監視結果に応じて、ディスク管理テーブル２５０内のステータスを更新する。なお、ディスク制御部２３０は、コマンドの実行状態を判定する際に、ＲＡＩＤ管理テーブル２４０を参照する。
【００５７】
次に、ＤＥ３００内の各ＨＤＤ３００ａが備える機能について説明する。ＤＥ３００内のＨＤＤ３００ａは、キュー制御部３１１を備える。また、キュー制御部３１１には、コマンドキュー３１２が接続されている。キュー制御部３１１の処理は、コントローラ３０１によって実現される。また、コマンドキュー３１２は、ＲＡＭ３０２に記録される。
【００５８】
コマンドキュー３１２には、ＣＭ２００のディスク制御部２３０から発行されたコマンドが蓄積される。ＨＤＤ３００ａのコントローラ３０１は、コマンドキュー３１２からコマンドを１つずつ読み出し、読み出したコマンドに応じた処理を実行する。キュー制御部３１１は、コマンドリオーダリング機能を実現する処理ブロックであり、コマンドキュー３１２に蓄積されたコマンドの実行順を決定する。
【００５９】
ここで、ＣＭ２００から発行されるコマンドには、シンプルキュー（Simple Queue）またはオーダードキュー（Ordered Queue）のいずれかのキューモードが設定される。キューモードとは、そのコマンドがコマンドキュー３１２に蓄積されたときにどのような方法でキューイングされるかを示す。シンプルキューに設定されたコマンドは、発行先のＨＤＤ３００ａのキュー制御部３１１によって実行順が変更されることが許容されたコマンドである。一方、オーダードキューに設定されたコマンドは、発行先のＨＤＤ３００ａのコマンドキュー３１２に登録された順番で実行される。
【００６０】
図５は、コマンドのリオーダリングについて説明するための図である。
キュー制御部３１１は、コマンドキュー３１２に蓄積されたコマンドのうち、シンプルキューに設定されたコマンドの実行順を、それらのコマンドに応じた処理が短時間に完了するように適正化する。キュー制御部３１１は、基本的に、アクセス領域のＬＢＡ（Logical Block Address）が近いコマンドを連続して実行させることで、磁気ヘッドのシーク時間や磁気ディスクの回転待ち時間を短縮させる。
【００６１】
図５では、ＨＤＤ３００ａ内の１つの磁気ディスク３２０のトラックのうち、ある１つのトラック３２１上の２つの領域Ａ，Ｂにそれぞれ記録されたデータの例を示している。領域Ａには、データ＃０，＃１，＃３，＃４が連続的に記録されている。領域Ｂにはデータ＃２が記録されている。なお、データ＃２のサイズは、データ＃０，＃１，＃３，＃４と比較して小さいものとする。
【００６２】
ここで、ＨＤＤ３００ａのコマンドキュー３１２に対して、データ＃０の読み出しを要求するコマンド＃０、データ＃１の読み出しを要求するコマンド＃１、データ＃２の読み出しを要求するコマンド＃２、データ＃３の読み出しを要求するコマンド＃３、データ＃４の読み出しを要求するコマンド＃４が、順に登録されたものとする。この場合、データ＃０，＃１，＃３，＃４は連続した領域に記録されており、データ＃２はこれらの領域から離れた領域に記録されていることから、キュー制御部３１１は、コマンドの実行順をコマンド＃０，＃１，＃３，＃４，＃２の順に決定する。
【００６３】
このようなコマンドのリオーダリングにより、磁気ヘッドのシーク時間や磁気ディスクの回転待ち時間が短くなるように制御される。その結果、ＨＤＤのアクセス性能（読み出し速度および書き込み速度）が向上する。近年、ＨＤＤの大容量化やシステム全体の大規模化などによって、ＨＤＤに発行されるコマンドの数が増大しているが、上記のようにコマンドのリオーダリングが行われることで、大量のコマンドが効率よく実行されるようになり、読み出しや書き込みに要する時間が短縮される。
【００６４】
その一方で、以下のように、コマンドのリオーダリングによって、実行されるまでの遅延時間が極端に大きいコマンドが発生するという問題もある。
上記のようにコマンドのリオーダリングが行われることで、実行順が早まるコマンドと、実行順が遅くなるコマンドとが生じる。一般的に、ＲＡＩＤ制御部２２０に対してシーケンシャルアクセスとランダムアクセスとが混在して要求された場合、上記のようなリオーダリング機能を有するＨＤＤでは、ランダムアクセスよりシーケンシャルアクセスの方が優先的に実行される傾向がある。また、シーケンシャルアクセスが要求された場合より、ランダムアクセスが要求された場合の方が、ＨＤＤに発行されるコマンドによって指定されるアクセスの範囲が小さいことが多い。
【００６５】
従って、図５の例のように、コマンドキュー３１２の中に、コマンド＃０，＃１，＃３，＃４のようなシーケンシャルアクセスに対応する多数のコマンドと、コマンド＃２のようなランダムアクセスに対応する少数のコマンドとが蓄積されている場合には、ランダムアクセスに対応するコマンドの実行順が後回しになる傾向が強まる。ＨＤＤに対してシーケンシャルアクセスに対応するコマンドが多数連続して発行されると、ランダムアクセスに対応するコマンドの実行は、ＣＭ２００がタイムアウトと判定してしまうほど遅延してしまうことがある。
【００６６】
また、ＣＭの中には、アクセス時のエラー検出回数をＨＤＤごとに記憶し、エラー検出回数が所定数に達したＨＤＤを、故障したものとして使用中止にする機能を備えるものがある。さらに、コマンドのタイムアウトが発生した場合にもエラー発生と判断するＣＭもある。このような仕様のＣＭは、上記のようにリオーダリングによってタイムアウトが何度も発生した場合、タイムアウトが発生したＨＤＤを、故障が発生していないにもかかわらず故障したと判定して、使用中止にしてしまう。
【００６７】
本実施の形態のＣＭ２００は、上記の問題点に鑑み、アクセス対象のＲＡＩＤグループに属する各ＨＤＤのステータスに応じて、アクセス性能をできるだけ高く維持しつつ、コマンドの実行遅延が生じにくくなるように、各ＨＤＤへのコマンドの発行のさせ方を調整する。
【００６８】
図６は、ＣＭが備える処理機能の詳細およびＣＭの動作例を示す図である。
この図６では、ステージングを実行するために、ディスク＃０〜＃３という４つのＨＤＤが属するＲＡＩＤグループに対して、データの読み出しが要求された場合の例を挙げて説明する。また、例として、読み出し要求の対象とされたＲＡＩＤグループのＲＡＩＤレベルはＲＡＩＤ−５であり、ストライプデプスは、ブロック数「０ｘ８０」であるものとする。ここで言う「ブロック」とは、１つのＬＢＡが指し示すＨＤＤ上の領域である。また、「ストライプデプス」とは、ＲＡＩＤグループに属する各ＨＤＤにおいて１ストライプに対応する領域の大きさである。なお、“０ｘ”は、１６進数で表記されていることを示す。
【００６９】
まず、図６を用いて、ディスク＃０〜＃３からのデータ読み出し処理の基本的な流れについて説明する。ホストＩ／Ｏ制御部２１０から読み出し要求を受けたＲＡＩＤ制御部２２０は、要求されたデータが格納されているＲＡＩＤグループを判別し、ＲＡＩＤ管理テーブル２４０に基づいて、読み出しが要求されたデータが格納されているＨＤＤを特定する。
【００７０】
ここでは例として、読み出しが要求されたデータは３つのデータに分割されて、分割データがそれぞれディスク＃０，＃１，＃２に格納されているとともに、それらの分割データに基づくパリティがディスク＃３に格納されているものとする。この場合、ＲＡＩＤ制御部２２０は、ディスク制御部２３０に対して、ディスク＃０，＃１，＃２からそれぞれ分割データを読み出すように依頼する。
【００７１】
ＲＡＩＤ制御部２２０は、ＨＤＤへのアクセスをディスク制御部２３０に依頼する際、ＡＣＢ（Action Control Block）と呼ばれる制御情報をディスク制御部２３０に受け渡す。ＡＣＢは、ＨＤＤごとにディスク制御部２３０に受け渡される。ＡＣＢには、依頼する処理の種別を示す「コマンド名」、アクセス先の先頭位置を示す「先頭ＬＢＡ」、アクセス範囲の先頭からのサイズを示す「ブロック数」、および前述の「キューモード」が設定される。
【００７２】
図６の例では、ＲＡＩＤ制御部２２０は、ディスク＃０，＃１，＃２のそれぞれから分割データを読み出すための３つのＡＣＢを、ディスク制御部２３０に受け渡す。ディスク制御部２３０は、受け取ったＡＣＢに基づいて、ディスク＃０，＃１，＃２のそれぞれに対してコマンドを発行する。発行されるコマンドには、ＡＣＢに設定されていた情報が含まれる。
【００７３】
発行されたコマンドは、ディスク＃０，＃１，＃２のそれぞれが備えるコマンドキュー３１２に登録され、ディスク＃０，＃１，＃２のそれぞれのコントローラ３０１によって処理される。図６の例では、ディスク＃０，＃１，＃２のそれぞれから、読み出しを要求された分割データがＣＭ２００に送信される。ＣＭ２００のディスク制御部２３０は、受信した分割データをＲＡＩＤ制御部２２０に受け渡し、ＲＡＩＤ制御部２２０は、受け取った分割データを結合して、ホストＩ／Ｏ制御部２１０に受け渡す。ホストＩ／Ｏ制御部２１０は、ＲＡＩＤ制御部２２０から受け取ったデータをＲＡＭ２０２のキャッシュ領域に格納するとともに、そのデータをホスト装置４００に送信する。
【００７４】
次に、コマンドの実行遅延を生じにくくするための処理機能について説明する。このような処理機能として、ディスク制御部２３０は、状態監視部２３１を備え、ＲＡＩＤ制御部２２０は、状態判定部２２１およびコマンド発行制御部２２２を備えている。
【００７５】
状態監視部２３１は、ＤＥ３００内の各ＨＤＤにおけるコマンドの蓄積状況や実行状況を監視し、各ＨＤＤのステータスを判定する。ステータスとしては、「ＮＯＲＭＡＬ」、「ＨＩＧＨ」、「ＴＩＭＥＯＵＴ」があるものとする。
【００７６】
「ＨＩＧＨ」は、ＨＤＤのコマンドキュー３１２に蓄積された未実行コマンドの数が過多であり、ＨＤＤの負荷が高い状態を示す。後述するように、状態監視部２３１は、例えば、コマンドキュー３１２に登録された未実行コマンドの数が所定数以上の場合、あるいは、そのＨＤＤにおける未実行コマンドの数が、同一ＲＡＩＤグループに属する全ＨＤＤにおける未実行コマンド数の平均値より所定割合だけ高い場合に、ステータスを「ＨＩＧＨ」と判定する。
【００７７】
「ＴＩＭＥＯＵＴ」は、コマンドのタイムアウトが発生した状態を示す。後述するように、状態監視部２３１は、コマンドのタイムアウトが発生すると、その後の所定時間はステータスを「ＴＩＭＥＯＵＴ」のままにする。
【００７８】
なお、ステータスとしては、「ＨＩＧＨ」かつ「ＴＩＭＥＯＵＴ」という状態もあり得るものとする。以下、このような状態を「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」と記述する。
「ＮＯＲＭＡＬ」は、「ＨＩＧＨ」、「ＴＩＭＥＯＵＴ」、「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」のいずれでもない状態を示す。すなわち、「ＮＯＲＭＡＬ」は、対応するＨＤＤにおいて特に負荷が高くなく、コマンドの実行遅延量も特に大きくない通常状態を示す。
【００７９】
ＲＡＩＤ制御部２２０の状態判定部２２１は、ホストＩ／Ｏ制御部２１０から読み出しまたは書き込みの要求を受けると、ディスク管理テーブル２５０から、アクセス先のＨＤＤのステータスを読み込む。
【００８０】
コマンド発行制御部２２２は、状態判定部２２１によって判定された、ＲＡＩＤグループに属する各ＨＤＤのステータスに基づいて、ディスク制御部２３０に受け渡すＡＣＢを設定する。コマンド発行制御部２２２は、ＲＡＩＤグループに属する各ＨＤＤのステータスに基づき、アクセス先のＨＤＤにおけるアクセス性能を高く維持しつつ、各ＨＤＤでのコマンドの実行遅延が抑制されるように、ディスク制御部２３０によるコマンドの発行のさせ方を調整する。
【００８１】
次に、ＣＭ２００の処理の詳細について説明する。以下の説明では、例として、上記の図６と同様に、ステージングによってＤＥ３００からデータが読み出される場合を想定する。
【００８２】
図７は、ＲＡＩＤ制御部の処理手順の例を示すフローチャートである。ＲＡＩＤ制御部２２０は、ホストＩ／Ｏ制御部２１０からＩ／Ｏ要求（ここでは読み出し要求）を受け付けるたびに、図７の処理を実行する。
【００８３】
［ステップＳ１１］ＲＡＩＤ制御部２２０は、ホストＩ／Ｏ制御部２１０から読み出し要求を受け付ける。
［ステップＳ１２］ＲＡＩＤ制御部２２０は、読み出しが要求されたデータが格納されているＲＡＩＤグループを判別する。ここでは例として、読み出しが要求されたデータが格納されているＲＡＩＤグループは、ディスク＃０〜＃３という４つのＨＤＤが属し、ＲＡＩＤレベルがＲＡＩＤ−５であるものとする。
【００８４】
ＲＡＩＤ制御部２２０の状態判定部２２１は、ＲＡＩＤ管理テーブル２４０を参照して、判別されたＲＡＩＤグループに属するＨＤＤを特定する。状態判定部２２１は、特定した各ＨＤＤのステータスをディスク管理テーブル２５０から読み出し、読み出したすべてのステータスが「ＮＯＲＭＡＬ」であるかを判定する。すべてのステータスが「ＮＯＲＭＡＬ」である場合、ステップＳ１３の処理が実行される。一方、読み出したステータスの中に１つでも「ＮＯＲＭＡＬ」以外のものがある場合、ステップＳ１４の処理が実行される。
【００８５】
［ステップＳ１３］ＲＡＩＤ制御部２２０のコマンド発行制御部２２２は、第１のコマンド発行制御を実行する。第１のコマンド発行制御は、通常の制御であり、コマンド発行制御部２２２は、ディスク＃０〜＃３のそれぞれから、読み出しを要求されたデータを分割した分割データを読み出すためのＡＣＢをＨＤＤごとに設定して、ディスク制御部２３０に受け渡す。このとき、各ＡＣＢには、キューモードとしてシンプルキューが設定される。
【００８６】
コマンド発行制御部２２２は、ディスク制御部２３０からの応答を待機し、ディスク＃０〜＃３から読み出された分割データをディスク制御部２３０から受け取る。コマンド発行制御部２２２は、受け取った分割データを結合して、ホストＩ／Ｏ制御部２１０に受け渡す。
【００８７】
［ステップＳ１４］コマンド発行制御部２２２は、ステップＳ１２でディスク管理テーブル２５０から読み出したステータスの中で、「ＮＯＲＭＡＬ」以外のステータスは１つだけかを判定する。「ＮＯＲＭＡＬ」以外のステータスが１つの場合、ステップＳ１５の処理が実行される。一方、「ＮＯＲＭＡＬ」以外のステータスが２つ以上ある場合、ステップＳ１６の処理が実行される。
【００８８】
［ステップＳ１５］コマンド発行制御部２２２は、第２のコマンド発行制御を実行する。後述するように、第２のコマンド発行制御では、コマンド発行制御部２２２は、アクセス先のＲＡＩＤグループに属するＨＤＤのうち、ステータスが「ＮＯＲＭＡＬ」以外であるＨＤＤからのデータ読み出しを抑止する。コマンド発行制御部２２２は、必要に応じて分割データの代わりにパリティを読み出すようにＡＣＢを設定し、読み出されたパリティを基に一部の分割データを計算によって復元する。
【００８９】
［ステップＳ１６］コマンド発行制御部２２２は、ステップＳ１２でディスク管理テーブル２５０から読み出したステータスのうち、「ＮＯＲＭＡＬ」以外のステータスがすべて「ＴＩＭＥＯＵＴ」であるかを判定する。「ＮＯＲＭＡＬ」以外のステータスがすべて「ＴＩＭＥＯＵＴ」である場合、ステップＳ１７の処理が実行される。一方、「ＮＯＲＭＡＬ」以外のステータスの中に「ＴＩＭＥＯＵＴ」以外のステータス（「ＨＩＧＨ」または「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」）が１つ以上ある場合、ステップＳ１８の処理が実行される。
【００９０】
［ステップＳ１７］コマンド発行制御部２２２は、第３のコマンド発行制御を実行する。後述するように、第３のコマンド発行制御では、コマンド発行制御部２２２は、各ＨＤＤから１つのコマンドを用いて読み出すデータサイズ（ブロック数）を小さくするように制御する。
【００９１】
［ステップＳ１８］コマンド発行制御部２２２は、第４のコマンド発行制御を実行する。後述するように、第４のコマンド発行制御では、コマンド発行制御部２２２は、アクセスパターンがランダムアクセスである場合に、発行するコマンドのキューモードをオーダードキューに変更するように制御する。
【００９２】
以下、第２〜第４のコマンド発行制御について説明する。
まず、図８は、第２のコマンド発行制御について説明するための図である。
図８の例では、ホストＩ／Ｏ制御部２１０は、ＲＡＩＤ制御部２２０に対してデータ＃１０の読み出しを要求する。読み出しを要求されたデータ＃１０は、３つの分割データ＃１０〜＃１２に分割されており、分割データ＃１０，＃１１，＃１２がそれぞれディスク＃０，＃１，＃２の同一ストライプ番号の領域に記録されているものとする。また、ディスク＃３における分割データ＃１０〜＃１２と同一ストライプ番号の領域には、分割データ＃１０〜＃１２を基に算出されたパリティ＃１０が記録されている。
【００９３】
通常制御である第１のコマンド発行制御（図７のステップＳ１３）では、ＲＡＩＤ制御部２２０のコマンド発行制御部２２２は、ディスク＃０から分割データ＃１０を読み出すためのコマンド、ディスク＃１から分割データ＃１１を読み出すためのコマンド、ディスク＃２から分割データ＃１２を読み出すためのコマンドをそれぞれ発行させるように設定したＡＣＢを生成して、これら３つのＡＣＢをディスク制御部２３０に受け渡す。
【００９４】
これに対して、図７のステップＳ１４で、例えばディスク＃１〜＃３のステータスが「ＮＯＲＭＡＬ」であるが、ディスク＃０のステータスが「ＮＯＲＭＡＬ」以外（例えば「ＨＩＧＨ」）であった場合、コマンド発行制御部２２２は、第２のコマンド発行制御（図７のステップＳ１５）を実行する。この場合、コマンド発行制御部２２２は、ディスク＃０から分割データ＃１０を読み出すためのＡＣＢをディスク制御部２３０に受け渡さないようにして、ディスク＃０からのデータの読み出しを抑止する。その代わりに、コマンド発行制御部２２２は、ディスク＃３からパリティ＃１０を読み出すためのＡＣＢをディスク制御部２３０に受け渡す。
【００９５】
ディスク制御部２３０は、ディスク＃１〜＃３にそれぞれコマンドを発行し、ディスク＃１，＃２，＃３からそれぞれ分割データ＃１１，＃１２、パリティ＃１０を読み出す。コマンド発行制御部２２２は、読み出された分割データ＃１１，＃１２、パリティ＃１０を用いて、排他的論理和（ＸＯＲ）などの所定の演算を実行することで、分割データ＃１０を復元する。コマンド発行制御部２２２は、復元した分割データ＃１０と、読み出された分割データ＃１１，＃１２とを結合して分割データ＃１０を復元し、分割データ＃１０をホストＩ／Ｏ制御部２１０に受け渡す。
【００９６】
上記の処理では、ステータスが「ＮＯＲＭＡＬ」でないＨＤＤに対するコマンドの発行が抑止されるので、コマンド発行制御部２２２は、そのＨＤＤのコマンドキュー３１２に蓄積されているコマンド数を減らすことができる。例えば、ステータスが「ＨＩＧＨ」であるＨＤＤに対するコマンドの発行を抑止することで、そのＨＤＤのステータスを確実に「ＮＯＲＭＡＬ」に戻すことができ、ステータスが「ＮＯＲＭＡＬ」に戻った後のアクセス速度を向上させることができる。また、例えば、ステータスが「ＴＩＭＥＯＵＴ」であるＨＤＤに対するコマンドの発行を抑止することで、そのＨＤＤのコマンドキュー３１２に蓄積されたコマンドのうち、過大な実行遅延が生じているコマンドが確実に実行されるようになり、タイムアウトも発生しにくくなる。
【００９７】
図９は、第２のコマンド発行制御の処理手順の例を示すフローチャートである。
［ステップＳ２１］コマンド発行制御部２２２は、アクセス先のＲＡＩＤグループに属するＨＤＤのうち、ステータスが「ＮＯＲＭＡＬ」である各ＨＤＤから分割データおよびパリティを読み出すためのＡＣＢを、ＨＤＤごとに生成する。このとき、コマンド発行制御部２２２は、各ＡＣＢに、キューモードとしてシンプルキューを設定する。コマンド発行制御部２２２は、設定したＡＣＢをディスク制御部２３０に受け渡し、コマンドの発行を依頼する。
【００９８】
［ステップＳ２２］コマンド発行制御部２２２は、発行されたコマンドに応じて、ステータスが「ＮＯＲＭＡＬ」である各ＨＤＤから読み出された分割データおよびパリティを、ディスク制御部２３０から受け取る。コマンド発行制御部２２２は、読み出しが要求されたデータに含まれる分割データの中に、ステータスが「ＮＯＲＭＡＬ」以外のＨＤＤに記録されている分割データがある場合には、その分割データを、同一ストライプ番号に属する他の分割データおよびパリティを基に計算によって復元する。コマンド発行制御部２２２は、復元した分割データと、ＨＤＤから読み出された分割データとを結合して、ホストＩ／Ｏ制御部２１０に受け渡す。
【００９９】
なお、以上の図８、図９では、アクセス先のＲＡＩＤグループのＲＡＩＤレベルがＲＡＩＤ−５であった場合について説明したが、ＲＡＩＤ−４である場合でも同様の処理が実行される。また、アクセス先のＲＡＩＤグループのＲＡＩＤレベルがＲＡＩＤ−６である場合には、図７の処理が次のように変更される。
【０１００】
図７のステップＳ１４の判定処理では、ステータスが「ＮＯＲＭＡＬ」以外のＨＤＤが１台または２台の場合、ステップＳ１５の処理が実行され、ステータスが「ＮＯＲＭＡＬ」以外のＨＤＤが３台以上ある場合、ステップＳ１６の処理が実行される。ステップＳ１５の第２のコマンド発行制御（図９の処理）では、ステータスが「ＮＯＲＭＡＬ」以外のＨＤＤに対するコマンドの発行が抑止される。そして、必要に応じて、ＨＤＤから読み出された分割データおよび１つまたは２つのパリティを基に、ステータスが「ＮＯＲＭＡＬ」以外のＨＤＤに記録されている分割データが復元される。
【０１０１】
上記のように、ステップＳ１４での台数の条件は、ＲＡＩＤグループにおけるデータの冗長度に応じて変更される。具体的には、ステップＳ１４での台数の判定しきい値としては、１ストライプに含まれるパリティの数が設定される。
【０１０２】
次に、図１０は、第３のコマンド発行制御について説明するための図である。
図１０の例では、ホストＩ／Ｏ制御部２１０は、ＲＡＩＤ制御部２２０に対してデータ＃２０の読み出しを要求する。読み出しを要求されたデータ＃２０は、６つの分割データ＃２０〜＃２５に分割されているものとする。そして、分割データ＃２０，＃２１，＃２２がそれぞれディスク＃０，＃１，＃２の同一ストライプ番号の領域に記録され、分割データ＃２３，＃２４，＃２５がそれぞれディスク＃３，＃０，＃１の同一ストライプ番号の領域に記録されているものとする。また、ディスク＃３における分割データ＃２０〜＃２２と同一ストライプ番号の領域には、分割データ＃２０〜＃２２を基に算出されたパリティ＃２０が記録され、ディスク＃２における分割データ＃２３〜＃２５と同一ストライプ番号の領域には、分割データ＃２３〜＃２５を基に算出されたパリティ＃２１が記録されている。
【０１０３】
上記のケースで、通常制御である第１のコマンド発行制御（図７のステップＳ１３）が実行される場合の処理を、図１０中にコマンド発行処理Ｐ０として示す。この場合、ＲＡＩＤ制御部２２０のコマンド発行制御部２２２は、ディスク＃０から分割データ＃２０，＃２４を読み出すためのコマンド、ディスク＃１から分割データ＃２１，＃２５を読み出すためのコマンド、ディスク＃２から分割データ＃２２を読み出すためのコマンド、および、ディスク＃３から分割データ＃２３を読み出すためのコマンドをそれぞれ発行させるように設定したＡＣＢを生成して、これら４つのＡＣＢをディスク制御部２３０に受け渡す。このようにＡＣＢが生成された場合、ディスク＃０，＃１のそれぞれに対して、ストライプデプス（ブロック数「０ｘ８０」）より大きなサイズのデータを読み出すためのコマンドが発行される。
【０１０４】
これに対して、図７のステップＳ１６で、例えばディスク＃２，＃３のステータスが「ＮＯＲＭＡＬ」であるが、ディスク＃０，＃１のステータスが「ＴＩＭＥＯＵＴ」であった場合、コマンド発行制御部２２２は、第３のコマンド発行制御（図７のステップＳ１７）を実行する。この場合、コマンド発行制御部２２２は、少なくともディスク＃０，＃１にそれぞれに発行される１コマンド当たりの読み出しデータサイズ（すなわち、１コマンドに設定するブロック数）が小さくなるように制御する。
【０１０５】
本実施の形態では例として、コマンド発行制御部２２２は、各ＨＤＤに発行される１コマンド当たりの読み出しブロック数の上限が、１ストライプデプスに対応するブロック数「０ｘ８０」になるように制御する。
【０１０６】
具体的には、コマンド発行制御部２２２は、図１０にコマンド発行処理Ｐ１，Ｐ２として示すように、ディスク＃０から分割データ＃２０を読み出すためのコマンドと、ディスク＃０から分割データ＃２４を読み出すためのコマンドを、ディスク制御部２３０に別々に発行させる。すなわち、コマンド発行制御部２２２は、前者のコマンドの発行を指示するためのＡＣＢと、後者のコマンドの発行を指示するためのＡＣＢとを、ディスク制御部２３０に受け渡す。
【０１０７】
また、コマンド発行制御部２２２は、ディスク＃１から分割データ＃２１を読み出すためのコマンドと、ディスク＃１から分割データ＃２５を読み出すためのコマンドを、ディスク制御部２３０に別々に発行させる。すなわち、コマンド発行制御部２２２は、前者のコマンドの発行を指示するためのＡＣＢと、後者のコマンドの発行を指示するためのＡＣＢとを、ディスク制御部２３０に受け渡す。
【０１０８】
なお、パリティ＃２０，＃２１についてはＨＤＤから特に読み出す必要はない。ただし、コマンド発行制御部２２２は、ディスク＃２から分割データ＃２２を読み出すためのコマンド、ディスク＃２からパリティ＃２１を読み出すためのコマンド、ディスク＃３からパリティ＃２０を読み出すためのコマンド、ディスク＃３から分割データ＃２３を読み出すためのコマンドを、ディスク制御部２３０に別々に発行させて、パリティ＃２０，＃２１も読み出されるようにしてもよい。この場合、各ＨＤＤに発行されるコマンド数が揃えられ、コマンドの管理を容易にすることができる。
【０１０９】
図５で述べたように、ＨＤＤでのコマンドのリオーダリング処理では、読み出しブロック数が小さいコマンドほど、実行順が後になる可能性が高まる。図１０のケースでは、ステータスが「ＴＩＭＥＯＵＴ」であるディスク＃０，＃１のそれぞれのコマンドキュー３１２では、多数のシーケンシャルアクセスのコマンド（すなわち、読み出しブロック数が比較的大きいコマンド）と、少数のランダムアクセスのコマンド（すなわち、読み出しブロック数が比較的小さいコマンド）とが混在している状態と推定される。そして、ディスク＃０，＃１のそれぞれのコマンドキュー３１２では、すでにランダムアクセスのコマンドについての大きな実行遅延が発生していると推定される。
【０１１０】
このような状態で、例えばディスク＃０に対して、図１０の分割データ＃２０，＃２４を一度に読み出すためのコマンドのような、シーケンシャルアクセスのコマンドをさらに発行してしまうと、すでに実行が大きく遅延しているランダムアクセスのコマンドの実行順がさらに後回しになる可能性が高まる。
【０１１１】
このような事態を防止するために、第３のコマンド発行制御では、発行されたそれぞれのコマンドに応じてＨＤＤから読み出されるブロック数が小さくなるように制御される。これにより、コマンドの実行遅延が発生しにくくなる。
【０１１２】
ここで、図１１は、読み出しブロック数の違いによるコマンドの実行順の変化について説明するための図である。この図１１では、図５と同様に、あるＨＤＤ内の１つの磁気ディスク３２０のトラックのうち、１つのトラック３２１上の２つの領域Ａ，Ｂにそれぞれ記録されたデータの例を示している。
【０１１３】
図１１の例では、領域Ａにはデータ＃３０，＃３２が連続的に記録されており、領域Ｂにはデータ＃３１が記録されている。データ＃３０，＃３２のブロック数はともに２ストライプデプスに対応する「０ｘ１００」であり、データ＃３１のブロック数は１ストライプデプスより小さい「０ｘ３０」であるとする。以下、ホストＩ／Ｏ制御部２１０からＲＡＩＤ制御部２２０に対して、データ＃３０，＃３１，＃３２をそれぞれ読み出すような読み出し要求が、この順番で出力されたものとする。
【０１１４】
第１のコマンド発行制御が行われる場合、ＲＡＩＤ制御部２２０のコマンド発行制御部２２２は、データ＃３０の読み出しを要求するコマンド＃３０、データ＃３１の読み出しを要求するコマンド＃３１、データ＃３２の読み出しを要求するコマンド＃３２を、ディスク制御部２３０に順に発行させる。この場合、データ＃３０，＃３２は連続した領域に記録されているため、ＨＤＤのキュー制御部３１１は、コマンド＃３０，＃３２，＃３１の順に実行する可能性が高い。
【０１１５】
一方、第３のコマンド発行制御が行われる場合、コマンド発行制御部２２２は、データ＃３０が、それぞれブロック数「０ｘ８０」のデータ＃３０＿０，＃３０＿１に分割して読み出されるように制御する。また、コマンド発行制御部２２２は、データ＃３２が、それぞれブロック数「０ｘ８０」のデータ＃３２＿０，＃３２＿１に分割して読み出されるように制御する。
【０１１６】
これにより、ＨＤＤのコマンドキュー３１２には、データ＃３０＿０の読み出しを要求するコマンド＃３０＿０、データ＃３０＿１の読み出しを要求するコマンド＃３０＿１、データ＃３１の読み出しを要求するコマンド＃３１、データ＃３２＿０の読み出しを要求するコマンド＃３２＿０、データ＃３２＿１の読み出しを要求するコマンド＃３２＿１の順にコマンドが蓄積される。
【０１１７】
このような第３のコマンド発行制御によれば、コマンドごとに読み出されるデータのサイズが小さくなることで、ＨＤＤのコマンドキュー３１２に蓄積された未実行のコマンドのうち、ランダムアクセスと推定されるコマンドの相対的な数が増加していく。一方、優先的に実行されやすいシーケンシャルアクセスのコマンドの相対的な数は減少していく。これにより、コマンドの実行順序が後回しになりにくくなる。
【０１１８】
このため、キュー制御部３１１は、例えば、コマンド＃３０＿０の次にコマンド＃３０＿１を実行させるとは限らず、コマンド＃３１を先に実行させてから、コマンド＃３０＿１，＃３２＿０，＃３２＿１の順に実行させるようにコマンド実行順を決定する可能性もある。あるいは、キュー制御部３１１は、コマンド＃３０＿０，＃３０＿１を実行した後に、コマンド＃３１を実行させるように、コマンド実行順を決定する可能性もある。
【０１１９】
また、ＨＤＤのキュー制御部３１１は、基本的にはＬＢＡが近いデータが読み出されるようにコマンド実行順を決定するものの、例えば、次の１つのコマンドだけでなく、複数のコマンドを実行したときの処理時間が短くなるようにコマンド実行順を決定する。このため、キュー制御部３１１は、上記のように、コマンド＃３０＿０の次にコマンド＃３０＿１を実行させるとは限らず、コマンド＃３１を先に実行させてから、コマンド＃３０＿１，＃３２＿０，＃３２＿１の順に実行させるようにコマンド実行順を決定する可能性もある。
【０１２０】
換言すると、コマンドごとに読み出されるデータのサイズが小さくなって、蓄積されるコマンドの数が増加することで、次に実行するコマンドを決定する機会が増加する。その結果、ランダムアクセスのコマンドが第１のコマンド発行制御の実行時より早い順序で実行される可能性が高まる、とも言える。
【０１２１】
さらに、例えば、データ＃３０，＃３２の読み出しとデータ＃３１の読み出しとがそれぞれ別のＣＭから要求される場合もある。このケースで、データ＃３０，＃３２の読み出しを要求するＣＭにおいて第３のコマンド発行制御が行われると、ＨＤＤのコマンドキュー３１２には、コマンド＃３０＿０，＃３１，＃３０＿１，＃３２＿０，＃３２＿１の順にコマンドが蓄積される可能性もある。この場合には、コマンド＃３０＿１より先にコマンド＃３１が実行される可能性がさらに高まる。
【０１２２】
以上のように、第３のコマンド発行制御によれば、コマンドキュー３１２に蓄積される１コマンド当たりの読み出しブロック数が小さくされることで、ランダムアクセスのコマンドの実行遅延が生じにくくなり、タイムアウトの発生確率が低下する。また、すでに実行が大きく遅延していたランダムアクセスのコマンドの実行順が、さらに後回しになる確率も低くなる。
【０１２３】
図１２は、第３のコマンド発行制御の処理手順の例を示すフローチャートである。
［ステップＳ３１］コマンド発行制御部２２２は、アクセス先のＲＡＩＤグループに属するＨＤＤのそれぞれから読み出すデータの中に、ストライプデプスより大きいサイズのデータがあるかを判定する。ストライプデプスより大きいサイズの読み出しデータがない場合には、ステップＳ３２の処理が実行される。一方、ストライプデプスより大きいサイズの読み出しデータがある場合には、ステップＳ３３の処理が実行される。
【０１２４】
［ステップＳ３２］コマンド発行制御部２２２は、アクセス先のＲＡＩＤグループに属するＨＤＤのうち、読み出し対象のデータが格納されたＨＤＤのそれぞれからデータを読み出すためのＡＣＢを、ＨＤＤごとに１つずつ生成する。このとき、コマンド発行制御部２２２は、各ＡＣＢに、キューモードとしてシンプルキューを設定する。コマンド発行制御部２２２は、生成したＡＣＢをディスク制御部２３０に受け渡し、コマンドの発行を依頼する。
【０１２５】
［ステップＳ３３］コマンド発行制御部２２２は、各ＨＤＤから読み出すデータのうち、ストライプデプスより大きいサイズのデータの範囲を、ストライプデプス単位で分割する。
【０１２６】
［ステップＳ３４］コマンド発行制御部２２２は、ステップＳ３３で分割した範囲のそれぞれからデータを読み出すためのＡＣＢを生成する。これにより、ストライプデプスより大きいサイズのデータを読み出すＨＤＤについては複数のＡＣＢが生成される。また、コマンド発行制御部２２２は、ストライプデプス以下のサイズのデータを読み出すＨＤＤがある場合には、そのＨＤＤについて、ステップＳ３２と同様に１つのＡＣＢを生成する。なお、コマンド発行制御部２２２は、このようにして生成した各ＡＣＢに、キューモードとしてシンプルキューを設定する。コマンド発行制御部２２２は、生成したＡＣＢをディスク制御部２３０に受け渡し、コマンドの発行を依頼する。
【０１２７】
［ステップＳ３５］コマンド発行制御部２２２は、発行されたコマンドに応じてＨＤＤから読み出されたデータを、ディスク制御部２３０から受け取る。コマンド発行制御部２２２は、受け取ったデータを結合して、ホストＩ／Ｏ制御部２１０に受け渡す。
【０１２８】
なお、以上の第３のコマンド発行制御の処理手順では、コマンド発行制御部２２２は、アクセス先のＲＡＩＤグループに属するＨＤＤのうち、ストライプデプスより大きいサイズのデータが読み出されるすべてのＨＤＤについて、１コマンド当たりの読み出しブロック数の上限がストライプデプスのブロック数になるように制御した。しかしながら、コマンド発行制御部２２２は、例えば、ストライプデプスより大きいサイズのデータを読み出すＨＤＤのうち、ステータスが「ＴＩＭＥＯＵＴ」であるＨＤＤについてのみ、１コマンド当たりの読み出しブロック数の上限がストライプデプスのブロック数になるようにしてもよい。
【０１２９】
また、図５に示したように、本実施の形態において、コマンド発行制御部２２２は、アクセス先のＲＡＩＤグループに属するＨＤＤのうち、複数のＨＤＤのステータスが「ＴＩＭＥＯＵＴ」で、その他のＨＤＤのステータスが「ＮＯＲＭＡＬ」である場合に、第３のコマンド発行制御を実行した。しかしながら、他の例として、コマンド発行制御部２２２は、アクセス先のＲＡＩＤグループに属するＨＤＤのうち、１つのＨＤＤのステータスが「ＴＩＭＥＯＵＴ」で、その他のＨＤＤのステータスが「ＮＯＲＭＡＬ」である場合にも、第２のコマンド発行制御ではなく第３のコマンド発行制御を実行してもよい。また、この場合、第３のコマンド発行制御では、ステータスが「ＴＩＭＥＯＵＴ」であるＨＤＤについてのみ、１コマンド当たりの読み出しブロック数の上限がストライプデプスのブロック数になるように制御されてもよい。
【０１３０】
次に、第４のコマンド発行制御について説明する。図７のステップＳ１６において、ステータスが「ＮＯＲＭＡＬ」でないＨＤＤの中に、ステータスが「ＨＩＧＨ」または「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」であるＨＤＤが１つでも存在する場合には、ステップＳ１８の第４のコマンド発行制御が実行される。ステータスが「ＨＩＧＨ」または「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」であるＨＤＤでは、コマンドキューに多数の未実行コマンドが蓄積されていて、負荷が過多の状態になっている。このように負荷が高くなったＨＤＤに対して、第３のコマンド発行制御を適用して、通常より多くのコマンドを発行してしまうと、そのＨＤＤの負荷がさらに高くなってしまう。
【０１３１】
そこで、コマンド発行制御部２２２は、次のような第４のコマンド発行制御を行う。第４のコマンド発行制御では、コマンド発行制御部２２２は、ＨＤＤへのアクセスパターンがシーケンシャルかランダムかを判定し、ランダムアクセスと判定した場合に、発行するコマンドのキューモードをシンプルキューからオーダードキューに変更する。
【０１３２】
図１３は、第４のコマンド発行制御について説明するための図である。
図１３では例として、ホストＩ／Ｏ制御部２１０からＲＡＩＤ制御部２２０に対して、読み出し要求＃１，＃２，＃３という３回の読み出し要求が順に行われたものとする。また、図１３では例として、アクセス先のＲＡＩＤグループに属するディスク＃０〜＃３のうち、ディスク＃０，＃１のステータスが「ＨＩＧＨ」であり、ディスク＃２，＃３のステータスが「ＮＯＲＭＡＬ」であるものとする。
【０１３３】
読み出し要求＃１によって読み出しを要求されたデータは、６つの分割データ＃４０〜＃４５に分割されているものとする。そして、分割データ＃４０，＃４１，＃４２がそれぞれディスク＃０，＃１，＃２の同一ストライプ番号の領域に記録され、分割データ＃４３，＃４４，＃４５がそれぞれディスク＃３，＃０，＃１の同一ストライプ番号の領域に記録されているものとする。また、ディスク＃３における分割データ＃４０〜＃４２と同一ストライプ番号の領域には、分割データ＃４０〜＃４２を基に算出されたパリティ＃４０が記録され、ディスク＃２における分割データ＃４３〜＃４５と同一ストライプ番号の領域には、分割データ＃４３〜＃４５を基に算出されたパリティ＃４１が記録されている。
【０１３４】
読み出し要求＃２によって読み出しを要求されたデータは、それぞれディスク＃０，＃１，＃２に記録された分割データ＃５０，＃５１，＃５２を含むものとする。ただし、分割データ＃５０，＃５１，＃５２のそれぞれのサイズは、ストライプデプスより小さいものとする。すなわち、読み出し要求＃２では、間欠的な領域に格納されたデータの読み出しが要求されている。また、ディスク＃３における分割データ＃５０〜＃５２と同一ストライプ番号の領域には、分割データ＃５０〜＃５２を基に算出されたパリティ＃５０が記録されている。
【０１３５】
読み出し要求＃３によって読み出しを要求されたデータは、６つの分割データ＃６０〜＃６５に分割されているものとする。そして、分割データ＃６０，＃６１，＃６２がそれぞれディスク＃０，＃１，＃２の同一ストライプ番号の領域に記録され、分割データ＃６３，＃６４，＃６５がそれぞれディスク＃３，＃０，＃１の同一ストライプ番号の領域に記録されているものとする。また、ディスク＃３における分割データ＃６０〜＃６２と同一ストライプ番号の領域には、分割データ＃６０〜＃６２を基に算出されたパリティ＃６０が記録され、ディスク＃２における分割データ＃６３〜＃６５と同一ストライプ番号の領域には、分割データ＃６３〜＃６５を基に算出されたパリティ＃６１が記録されている。
【０１３６】
第４のコマンド発行制御では、ＲＡＩＤ制御部２２０のコマンド発行制御部２２２は、読み出し要求ごとに、ＨＤＤへのアクセスタイプがシーケンシャルアクセスかランダムアクセスかを判定する。本実施の形態では例として、コマンド発行制御部２２２は、すべてのＨＤＤからの読み出しデータサイズがストライプデプス以下である場合に、ランダムアクセスと判定する。
【０１３７】
コマンド発行制御部２２２は、読み出し要求＃１を受けたとき、ディスク＃０から分割データ＃４０，＃４４を読み出すためのコマンド、ディスク＃１から分割データ＃４１，＃４５を読み出すためのコマンド、ディスク＃２から分割データ＃４２を読み出すためのコマンド、および、ディスク＃３から分割データ＃４３を読み出すためのコマンドをそれぞれ発行させるように設定したＡＣＢを生成して、これら４つのＡＣＢをディスク制御部２３０に受け渡す。この場合、ディスク＃０，＃１から読み出されるデータのサイズがストライプデプスより大きくなることから、コマンド発行制御部２２２は、生成した４つのＡＣＢにおいてキューモードをシンプルキューに設定する。
【０１３８】
一方、コマンド発行制御部２２２は、読み出し要求＃２を受けたとき、ディスク＃０から分割データ＃５０を読み出すためのコマンド、ディスク＃１から分割データ＃５１を読み出すためのコマンド、および、ディスク＃２から分割データ＃５２を読み出すためのコマンドをそれぞれ発行させるように設定したＡＣＢを生成して、これら３つのＡＣＢをディスク制御部２３０に受け渡す。この場合、ディスク＃０〜＃３から読み出されるデータのサイズがいずれもストライプデプス以下になることから、コマンド発行制御部２２２は、生成した３つのＡＣＢにおいてキューモードをオーダードキューに設定する。
【０１３９】
なお、読み出し要求＃３を受けた場合も、ディスク＃０，＃１から読み出されるデータのサイズがストライプデプスより大きくなることから、コマンド発行制御部２２２は、発行させるコマンドのキューモードをシンプルキューに設定する。
【０１４０】
図１４は、キューモードの違いによるコマンドの実行順の変化について説明するための図である。この図１４では、図５と同様に、あるＨＤＤ内の１つの磁気ディスク３２０のトラックのうち、１つのトラック３２１上の２つの領域Ａ，Ｂにそれぞれ記録されたデータの例を示している。
【０１４１】
図１４の例では、領域Ａにはデータ＃７０，＃７２が連続的に記録されており、領域Ｂにはデータ＃７１が記録されている。データ＃７０，＃７２のブロック数はともに２ストライプデプスに対応する「０ｘ１００」であり、データ＃７１のブロック数は１ストライプデプスより小さい「０ｘ３０」であるとする。また、ＲＡＩＤ制御部２２０のコマンド発行制御部２２２は、データ＃７０，＃７１，＃７２をそれぞれ読み出すためのコマンド＃７０，＃７１，＃７２が、この順番で発行されるように制御するものとする。
【０１４２】
第４のコマンド発行制御では、コマンド発行制御部２２２は、コマンド＃７０，＃７２のキューモードをシンプルキューに設定する一方、コマンド＃７１のキューモードをオーダードキューに設定する。仮に、コマンド＃７１のキューモードも、コマンド＃７０，＃７２と同様にシンプルキューである場合、コマンドの実行順はコマンド＃７０，＃７２，＃７１となる可能性が高い。これに対して、コマンド＃７１のキューモードがオーダードキューに設定されることで、コマンド＃７１はコマンド＃７２より前に確実に実行されるようになる。
【０１４３】
このように、第４のコマンド発行制御では、コマンド発行制御部２２２は、第３のコマンド発行制御のようにアクセス先のＨＤＤに対して発行するコマンド数を増やす代わりに、発行するコマンドのキューモードをアクセスパターンに応じて変更する。発行するコマンド数が増えないことで、すでに負荷が高くなっているアクセス先のＨＤＤにおいてさらに負荷が高くなる事態が回避される。
【０１４４】
また、コマンド発行制御部２２２は、発行するすべてのコマンドのキューモードをオーダードキューに設定するのではなく、ランダムアクセスのコマンドのみをオーダードキューに設定する。これにより、実行遅延が生じやすいコマンドのみがオーダードキューに設定されるようになる。一方、シーケンシャルアクセスのコマンドについては、キューモードがシンプルキューのまま変更されないことで、ＨＤＤのリオーダリング機能によって効率よく実行されるようになる。
【０１４５】
第４のコマンド発行制御では、ランダムアクセスのコマンドのキューモードがオーダードキューに設定されることで、第３のコマンド発行制御と比較して、シーク時間や回転待ち時間が長くなり、その結果、読み出し速度が低下する可能性がある。しかしながら、リオーダによって実行遅延が発生しにくいシーケンシャルアクセスのコマンドについてはオーダードキューに設定しないことで、読み出し速度の低下幅が抑制される。すなわち、第４のコマンド発行制御によれば、ＨＤＤからの読み出し速度の低下幅を抑制しながら、コマンドのタイムアウトの発生確率を低下させることができる。
【０１４６】
図１５は、第４のコマンド発行制御の処理手順の例を示すフローチャートである。
［ステップＳ４１］コマンド発行制御部２２２は、アクセス先のＲＡＩＤグループに属するＨＤＤのそれぞれから読み出すデータの中に、ストライプデプスより大きいサイズのデータがあるかを判定する。ストライプデプスより大きいサイズの読み出しデータがない場合には、ステップＳ４３の処理が実行される。一方、ストライプデプスより大きいサイズの読み出しデータが１つでもある場合には、ステップＳ４２の処理が実行される。
【０１４７】
［ステップＳ４２］コマンド発行制御部２２２は、アクセス先のＲＡＩＤグループに属するＨＤＤのうち、読み出し対象のデータが格納されたＨＤＤのそれぞれからデータを読み出すためのＡＣＢを、ＨＤＤごとに１つずつ生成する。このとき、コマンド発行制御部２２２は、各ＡＣＢに、キューモードとしてシンプルキューを設定する。コマンド発行制御部２２２は、生成したＡＣＢをディスク制御部２３０に受け渡し、コマンドの発行を依頼する。
【０１４８】
［ステップＳ４３］コマンド発行制御部２２２は、アクセス先のＲＡＩＤグループに属するＨＤＤのうち、読み出し対象のデータが格納されたＨＤＤのそれぞれからデータを読み出すためのＡＣＢを、ＨＤＤごとに１つずつ生成する。このとき、コマンド発行制御部２２２は、各ＡＣＢに、キューモードとしてオーダードキューを設定する。コマンド発行制御部２２２は、生成したＡＣＢをディスク制御部２３０に受け渡し、コマンドの発行を依頼する。
【０１４９】
［ステップＳ４４］コマンド発行制御部２２２は、発行されたコマンドに応じてＨＤＤから読み出されたデータを、ディスク制御部２３０から受け取る。コマンド発行制御部２２２は、受け取ったデータを結合して、ホストＩ／Ｏ制御部２１０に受け渡す。
【０１５０】
ＲＡＩＤ制御部２２０のコマンド発行制御部２２２は、以上で説明した第２〜第４のコマンド発行制御を、ＲＡＩＤグループに属するＨＤＤのステータスに応じて選択して実行する。これにより、アクセス先のＨＤＤにおけるアクセス性能を高く維持しつつ、各ＨＤＤでのコマンドの実行遅延が抑制されて、コマンドのタイムアウトが発生しにくくなる。
【０１５１】
また、例えば、ディスク制御部２３０がＨＤＤごとのエラー点数をカウントする機能を備え、コマンドのタイムアウトが発生した場合もエラーと判定する場合には、エラー点数がむやみに増加しないようにすることができる。ディスク制御部２３０は、エラー点数をカウントする機能を備える場合、エラー点数が所定値に達すると、対応するＨＤＤが故障していると判定して、そのＨＤＤをＲＡＩＤグループから切り離して使用不可能にする。第２〜第４のコマンド発行制御が適応的に実行されることで、コマンドの実行遅延という故障ではない原因によって、ＨＤＤが切り離される事態の発生確率を低減することができる。
【０１５２】
次に、図１６は、ディスク制御部の処理手順の例を示すフローチャートである。この図１６の処理は、図７の手順に従ってＲＡＩＤ制御部２２０から出力された１つのＡＣＢを受け付けるごとに、ディスク制御部２３０によって実行される。従って、図１６の処理は、アクセス先のＨＤＤごとに実行される。
【０１５３】
［ステップＳ５１］ディスク制御部２３０の状態監視部２３１は、アクセス先のＨＤＤのコマンドキュー３１２に蓄積された未実行コマンドの数が、所定の最大値の８０％以上であるかを判定する。未実行コマンドの数が最大値の８０％未満である場合には、ステップＳ５２の処理が実行される。一方、未実行コマンドの数が最大値の８０％以上である場合には、ステップＳ５３の処理が実行される。
【０１５４】
なお、ディスク制御部２３０は、例えば、ＲＡＩＤ制御部２２０から受け取り、かつ、対応するコマンドの応答を受信していないＡＣＢの数を計数することで、アクセス先のＨＤＤのコマンドキュー３１２に蓄積された未実行コマンドの数を認識することができる。
【０１５５】
また、このステップＳ５１で判定に使用される割合のしきい値は、任意に設定可能である。
［ステップＳ５２］状態監視部２３１は、ＲＡＩＤ管理テーブル２４０を参照して、アクセス先のＨＤＤが属するＲＡＩＤグループを判別する。状態監視部２３１は、判別したＲＡＩＤグループに属する全ＨＤＤのコマンドキュー３１２に蓄積された未実行コマンドの数を判別し、これらの未実行コマンド数の平均値を計算する。
【０１５６】
状態監視部２３１は、アクセス先のＨＤＤのコマンドキュー３１２に蓄積された未実行コマンドの数が、算出した平均値の２倍以上かを判定する。この判定では、未実行コマンドの数が平均値の２倍以上である場合に、ＲＡＩＤグループに属するＨＤＤ間で未実行コマンド数に大きな偏りが発生していて、アクセス先のＨＤＤの負荷が相対的に過多になっていると判定される。
【０１５７】
未実行コマンドの数が平均値の２倍以上である場合には、ステップＳ５３の処理が実行される。一方、未実行コマンドの数が平均値の２倍未満である場合には、ステップＳ５４の処理が実行される。
【０１５８】
なお、このステップＳ５２で判定に使用されるしきい値は、任意に設定可能である。
［ステップＳ５３］ステップＳ５１またはステップＳ５２で「Ｙｅｓ」と判定された場合、アクセス先のＨＤＤの負荷が過多になっていると判定される。このとき、状態監視部２３１は、ディスク管理テーブル２５０に登録された、アクセス先のＨＤＤのステータスを、「ＨＩＧＨ」に更新する。なお、登録されているステータスが「ＴＩＭＥＯＵＴ」の場合には、「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」に更新される。また、登録されているステータスが「ＨＩＧＨ」または「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」の場合には、そのまま維持される。
【０１５９】
［ステップＳ５４］状態監視部２３１は、ディスク管理テーブル２５０を参照して、アクセス先のＨＤＤのステータスが「ＴＩＭＥＯＵＴ」であるかを判定する。ステータスが「ＴＩＭＥＯＵＴ」である場合には、ステップＳ５６の処理が実行される。一方、ステータスが「ＴＩＭＥＯＵＴ」以外である場合、すなわち、ステータスが「ＮＯＲＭＡＬ」、「ＨＩＧＨ」、「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」のいずれかである場合には、ステップＳ５５の処理が実行される。
【０１６０】
［ステップＳ５５］ステップＳ５１およびステップＳ５２でともに「Ｎｏ」と判定された場合、アクセス先のＨＤＤの負荷は特に高くないと判定される。このとき、状態監視部２３１は、ディスク管理テーブル２５０に登録された、アクセス先のＨＤＤのステータスを、「ＮＯＲＭＡＬ」に更新する。
【０１６１】
ただし、登録されているステータスが「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」の場合、状態判定部２２１は、ステータスを「ＴＩＭＥＯＵＴ」に更新する。また、登録されているステータスが「ＮＯＲＭＡＬ」の場合には、そのまま維持される。
【０１６２】
［ステップＳ５６］ディスク制御部２３０は、ＲＡＩＤ制御部２２０から受け付けたＡＣＢに基づいて、ＨＤＤにコマンドを発行する。
［ステップＳ５７］状態監視部２３１は、ステップＳ５６でコマンドが発行されてからの経過時間をカウントし、コマンド発行から所定時間内にＨＤＤから応答があったかを判定する。所定時間内に応答があった場合には、ステップＳ６０の処理が実行される。一方、所定時間内に応答がなかった場合には、ステップＳ５８の処理が実行される。
【０１６３】
［ステップＳ５８］状態監視部２３１は、ステップＳ５７でコマンド発行から所定時間内に応答がなかった場合、タイムアウトが発生したと判定する。状態監視部２３１は、ディスク管理テーブル２５０に登録された、アクセス先のＨＤＤのステータスを、「ＴＩＭＥＯＵＴ」に更新する。
【０１６４】
ただし、登録されているステータスが「ＨＩＧＨ」の場合、状態監視部２３１は、ステータスを「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」に更新する。また、登録されているステータスが「ＴＩＭＥＯＵＴ」または「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」の場合には、そのまま維持される。
【０１６５】
［ステップＳ５９］状態監視部２３１は、ステップＳ５８の処理が実行されてからの経過時間のカウントを開始する。また、ステップＳ５８の実行前の時点でステータスがすでに「ＴＩＭＥＯＵＴ」または「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」であった場合には、状態監視部２３１は、経過時間のカウント値を初期値に戻してカウントを継続する。すなわち、ステップＳ５９では、アクセス先のＨＤＤについて、最後にタイムアウトが検出されてからの経過時間のカウントが開始される。
【０１６６】
［ステップＳ６０］状態監視部２３１は、ディスク管理テーブル２５０を参照し、アクセス先のＨＤＤのステータスをチェックする。ステータスが「ＴＩＭＥＯＵＴ」または「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」である場合には、ステップＳ６１の処理が実行される。一方、ステータスが「ＮＯＲＭＡＬ」または「ＨＩＧＨ」である場合には、ステップＳ６３の処理が実行される。
【０１６７】
［ステップＳ６１］状態監視部２３１は、アクセス先のＨＤＤについて最後にタイムアウトが検出されてからの経過時間をチェックする。経過時間が１０分以上である場合には、ステップＳ６２の処理が実行される。一方、経過時間が１０分未満である場合には、ステップＳ６３の処理が実行される。
【０１６８】
なお、このステップＳ６１で判定に使用される経過時間のしきい値は、任意に設定可能である。
［ステップＳ６２］状態監視部２３１は、ディスク管理テーブル２５０に登録された、アクセス先のＨＤＤのステータスを、「ＮＯＲＭＡＬ」に更新する。ただし、登録されているステータスが「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」の場合、状態監視部２３１は、ステータスを「ＨＩＧＨ」に更新する。
【０１６９】
［ステップＳ６３］ディスク制御部２３０は、ＲＡＩＤ制御部２２０に対して応答する。ステップＳ５６でのコマンド発行から所定時間内にＨＤＤからの応答を受信した場合（ステップＳ５７で「Ｙｅｓ」の場合）、ディスク制御部２３０は、ＨＤＤから読み出されたデータをＲＡＩＤ制御部２２０に受け渡す。一方、ステップＳ５６でのコマンド発行から所定時間内にＨＤＤからの応答を受信できなかった場合（ステップＳ５７で「Ｎｏ」の場合）、ディスク制御部２３０は、ＲＡＩＤ制御部２２０から受け取ったＡＣＢに基づくコマンドについてタイムアウトが発生したことをＲＡＩＤ制御部２２０に通知する。
【０１７０】
上記のフローチャートのステップＳ５７〜Ｓ６２では、状態監視部２３１は、発行したコマンドに対する応答を所定時間以内に受信したかを監視する。そして、状態監視部２３１は、所定時間以内に受信しなかった場合には、タイムアウトが検出されたことを示すようにステータスを更新する（ステップＳ５８）。また、状態監視部２３１は、タイムアウトが検出されなくなった場合でも、最後にタイムアウトが検出されてから所定時間が経過するまでは、ステータスの値をタイムアウトが検出されたことを示す状態のままにする（ステップＳ６１で「Ｎｏ」の場合に対応）。
【０１７１】
ここで、前述のように、ディスク制御部２３０は、ＨＤＤごとにエラー点数をカウントする機能を備えていてもよい。例えば、ディスク制御部２３０は、ＨＤＤにアクセスしたときにエラーが検出されると、検出されたエラーの種類に応じた点数を、アクセス先のＨＤＤに対応付けられたエラー点数に加算する。
【０１７２】
また、ディスク制御部２３０は、あるＨＤＤについて最後にエラーが検出されてから一定時間が経過すると、そのＨＤＤに対応するエラー点数を「０」にリセットしてもよい。これは、一定時間エラーが検出されない場合、それ以前に検出されたエラーは一時的な原因によるものと推定されるからである。
【０１７３】
このようなエラー点数のリセット機能を備え、かつ、コマンドのタイムアウトが発生した場合でもエラーと判定する場合には、図１６においてタイムアウトが検出されてからの経過時間のカウント機能が、エラー点数のリセットの要否を判定するためのカウント機能と共用されてもよい。この場合、ステップＳ６１の判定で使用される経過時間のしきい値を、エラー点数をリセットすると判定する際のしきい値と一致させてもよい。
【０１７４】
また、前述のように、図１６の処理によれば、状態監視部２３１は、タイムアウトが検出されなくなった場合でも、最後にタイムアウトが検出されてから所定時間が経過するまでは、ステータスの値をタイムアウトが検出されたことを示す状態のままにする。これにより、ＲＡＩＤグループに属するいずれかのＨＤＤにおいて最後にタイムアウトが検出されてから一定の期間では、ＲＡＩＤグループに属するＨＤＤの少なくとも１つのＨＤＤのステータスが「ＴＩＭＥＯＵＴ」または「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」になる。
【０１７５】
このため、ＲＡＩＤ制御部２２０のコマンド発行制御部２２２は、ＲＡＩＤグループに属するいずれかのＨＤＤにおいて最後にタイムアウトが検出されてから一定の期間、通常処理ではない第２〜第４のコマンド発行制御のいずれかを実行する。これにより、コマンドキューに多数の未実行コマンドが蓄積されている状態、あるいはコマンドの実行が大きく遅延している状態が解消される可能性を高めることができる。
【０１７６】
さらに、上記の図１６の例では、最後にタイムアウトが検出されてからの経過時間に基づいて、第２〜第４のコマンド発行制御が一定時間継続されるようにしたが、他の例として、第２〜第４のコマンド発行制御の開始から一定時間は、同じ種別のコマンド発行制御が継続されるようにしてもよい。以下、このような処理が実行されるようにした処理例について説明する。
【０１７７】
図１７は、ＲＡＩＤ制御部の処理の変形例を示すフローチャートである。この図１７では、図７と同じ処理には同じステップ番号を付して示し、それらの処理についての説明を省略する。
【０１７８】
図１７の処理では、図７のステップＳ１１とステップＳ１２との間に、ステップＳ７１，Ｓ７２の処理が実行される。
［ステップＳ７１］ＲＡＩＤ制御部２２０の状態判定部２２１は、アクセス対象のＲＡＩＤグループについて、コマンド発行制御部２２２が第３のコマンド発行制御（ステップＳ１７）の実行を開始してから所定時間が経過したかを判定する。ここで言う経過時間とは、コマンド発行制御部２２２が、コマンド発行制御の種別を第３以外のコマンド発行制御から第３のコマンド発行制御に変更してからの経過時間を指す。実行開始から所定時間が経過した場合には、ステップＳ７２の処理が実行される。一方、実行開始から所定時間が経過していない場合には、ステップＳ１７の処理が実行される。
【０１７９】
［ステップＳ７２］ＲＡＩＤ制御部２２０の状態判定部２２１は、アクセス対象のＲＡＩＤグループについて、コマンド発行制御部２２２が第４のコマンド発行制御（ステップＳ１８）の実行を開始してから所定時間が経過したかを判定する。ここで言う経過時間とは、コマンド発行制御部２２２が、コマンド発行制御の種別を第４以外のコマンド発行制御から第４のコマンド発行制御に変更してからの経過時間を指す。実行開始から所定時間が経過した場合には、ステップＳ１２の処理が実行される。一方、実行開始から所定時間が経過していない場合には、ステップＳ１８の処理が実行される。
【０１８０】
以上の処理によれば、コマンド発行制御部２２２は、一旦第３のコマンド発行制御を実行してからは、ＲＡＩＤグループに属するＨＤＤのステータスの変化に関係なく、第３のコマンド発行制御を一定時間継続する。また、コマンド発行制御部２２２は、一旦第４のコマンド発行制御を実行してからは、ＲＡＩＤグループに属するＨＤＤのステータスの変化に関係なく、第４のコマンド発行制御を一定時間継続する。このように、第３のコマンド発行制御および第４のコマンド発行制御が確実に一定時間以上継続されるようにすることで、コマンドの実行遅延を解消する効果を大きくすることができる。
【０１８１】
なお、第２のコマンド発行制御についても同様に一定時間以上継続されるようにしてもよい。ただし、ＲＡＩＤグループに属するＨＤＤのうち複数のＨＤＤのステータスが「ＮＯＲＭＡＬ」以外になった場合には、「ＮＯＲＭＡＬ」以外のステータスを持つ少なくとも１つのＨＤＤについては、負荷軽減効果やコマンド実行遅延の抑制効果は得られない。このため、図１７のように、第２のコマンド発行制御については、ステップＳ１４で「Ｙｅｓ」と判定された場合のみ実行される方が好ましい。
【０１８２】
また、第３，第４のコマンド発行制御は、第２のコマンド発行制御と比較して、より積極的にコマンド実行遅延を抑制しようとするものである。このため、図１７のように第３，第４のコマンド発行制御についてのみ一定時間以上継続されるようにした場合でも、十分なコマンド実行遅延の抑制効果が得られる。
【０１８３】
さらに、第３，第４のコマンド発行制御のうちの一方のみが、確実に一定時間以上継続されるようにしてもよい。例えば、第３，第４のコマンド発行制御のうち、第４のコマンド発行制御のみ確実に一定時間以上継続されるようにしてもよい。この場合、図１７の処理は、ステップＳ１１の次にステップＳ７２が実行されるように変形される。
【０１８４】
第３のコマンド発行制御が実行されると、発行されるコマンド数が増加してしまうことから、ステータスが「ＨＩＧＨ」または「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」のＨＤＤが存在する状況では、第３のコマンド発行制御が実行されるのは好ましくない。第３，第４のコマンド発行制御のうち、第４のコマンド発行制御のみ確実に一定時間以上継続されるようにすると、ステップＳ１６で「Ｙｅｓ」と判定された場合のみ第３のコマンド発行制御が実行されるようになる。これにより、ＨＤＤのコマンドキューに蓄積されるコマンド数を減少させることができる。
【０１８５】
また、例えば、図１７のステップＳ７１で「Ｎｏ」と判定されたとき、アクセス先のＲＡＩＤグループに属するＨＤＤのうちの少なくとも１つのステータスが「ＨＩＧＨ」または「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」になっている場合には、ステップＳ１７ではなくステップＳ１３またはステップＳ１８の処理が実行されるようにしてもよい。これにより、第３のコマンド発行制御の実行が開始されてから所定時間未満の期間でも、未実行コマンド数が過多になったＨＤＤが出現した場合には、第３のコマンド発行制御を実行させないようにすることができる。
【０１８６】
以上説明した第２の実施の形態では、データの読み出しを行う場合について説明したが、データの書き込みを行う場合には、次のように変形されればよい。データの書き込みを行う場合には、第２のコマンド発行制御を実行できない。そこで、図７または図１７の処理においてＲＡＩＤ制御部２２０が書き込み要求を受け付けた場合には、ステップＳ１４の処理が次のように変更される。コマンド発行制御部２２２は、ステータスが「ＴＩＭＥＯＵＴ」であるＨＤＤが１台のみある場合には、ステップＳ１７の第３のコマンド発行制御を実行する。また、コマンド発行制御部２２２は、ステータスが「ＨＩＧＨ」または「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」であるＨＤＤが１台のみある場合には、ステップＳ１８の第４のコマンド発行制御を実行する。
【０１８７】
〔第３の実施の形態〕
以下の第３の実施の形態は、第２の実施の形態のコマンド発行制御部２２２が、ＲＡＩＤグループ単位でコマンド発行制御を行う代わりに、ＨＤＤ単位でコマンド発行制御を行うように変形したものである。
【０１８８】
図１８は、第３の実施の形態のＲＡＩＤ制御部の処理手順の例を示すフローチャートである。
［ステップＳ１１ａ］ＲＡＩＤ制御部２２０は、ホストＩ／Ｏ制御部２１０から読み出し要求を受け付ける。次のステップＳ１２ａ以降の処理は、読み出しが要求されたデータが格納されているＨＤＤごとに実行される。
【０１８９】
［ステップＳ１２ａ］ＲＡＩＤ制御部２２０の状態判定部２２１は、アクセス先のＨＤＤのステータスをディスク管理テーブル２５０から読み出し、読み出したステータスが「ＮＯＲＭＡＬ」であるかを判定する。ステータスが「ＮＯＲＭＡＬ」である場合、ステップＳ１３ａの処理が実行される。一方、読み出したステータスが「ＮＯＲＭＡＬ」でない場合、ステップＳ１６ａの処理が実行される。
【０１９０】
［ステップＳ１３ａ］ＲＡＩＤ制御部２２０のコマンド発行制御部２２２は、第１のコマンド発行制御を実行する。このステップＳ１３ａの処理は、図７のステップＳ１３と基本的に同じであるが、ディスク制御部２３０に受け渡すＡＣＢは１つのみになる。
【０１９１】
［ステップＳ１６ａ］コマンド発行制御部２２２は、アクセス先のＨＤＤのステータスが「ＴＩＭＥＯＵＴ」であるかを判定する。ステータスが「ＴＩＭＥＯＵＴ」である場合、ステップＳ１７ａの処理が実行される。一方、ステータスが「ＴＩＭＥＯＵＴ」以外である、すなわち「ＨＩＧＨ」または「ＨＩＧＨ｜ＴＩＭＥＯＵＴ」である場合、ステップＳ１８ａの処理が実行される。
【０１９２】
［ステップＳ１７ａ］コマンド発行制御部２２２は、第３のコマンド発行制御を実行する。このステップＳ１７ａの処理は、図７のステップＳ１７と基本的に同じであるが、アクセス先の１つのＨＤＤにコマンドを発行させるためのＡＣＢのみが生成されて、ディスク制御部２３０に受け渡される。
【０１９３】
［ステップＳ１８ａ］コマンド発行制御部２２２は、第４のコマンド発行制御を実行する。このステップＳ１８ａの処理は、図７のステップＳ１８と基本的に同じであるが、ディスク制御部２３０に受け渡すＡＣＢは１つのみになる。
【０１９４】
なお、第３の実施の形態においても、図１７で説明したように、一旦第３のコマンド発行制御が実行されると、ＨＤＤのステータスの変化に関係なく、第３のコマンド発行制御が一定時間継続されるようにしてもよい。また、一旦第４のコマンド発行制御が実行されると、ＨＤＤのステータスの変化に関係なく、第４のコマンド発行制御が一定時間継続されるようにしてもよい。さらに、第３のコマンド発行制御の実行が開始されてから所定時間未満の期間でも、ＨＤＤに蓄積された未実行コマンド数が過多になった場合には、第３のコマンド発行制御を実行させないようにしてもよい。
【０１９５】
また、図１８ではデータの読み出しを行う場合について説明したが、データの書き込みを行う場合にも同様の処理が実行されればよい。
以上の第３の実施の形態によれば、ＨＤＤからの読み出し速度の低下幅を抑制しながら、コマンドのタイムアウトの発生確率を低下させることができる。
【０１９６】
なお、上記の各実施の形態に示したストレージ制御装置およびＣＭの処理機能は、コンピュータによって実現することができる。その場合、各装置が有すべき機能の処理内容を記述したプログラムが提供され、そのプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、磁気記憶装置、光ディスク、光磁気記録媒体、半導体メモリなどがある。磁気記憶装置には、ハードディスク装置（ＨＤＤ）、フレキシブルディスク（ＦＤ）、磁気テープなどがある。光ディスクには、ＤＶＤ、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ、ＣＤ−Ｒ／ＲＷなどがある。光磁気記録媒体には、ＭＯ（Magneto-Optical disk）などがある。
【０１９７】
プログラムを流通させる場合には、例えば、そのプログラムが記録されたＤＶＤ、ＣＤ−ＲＯＭなどの可搬型記録媒体が販売される。また、プログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
【０１９８】
プログラムを実行するコンピュータは、例えば、可搬型記録媒体に記録されたプログラムまたはサーバコンピュータから転送されたプログラムを、自己の記憶装置に格納する。そして、コンピュータは、自己の記憶装置からプログラムを読み取り、プログラムに従った処理を実行する。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することもできる。また、コンピュータは、ネットワークを介して接続されたサーバコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムに従った処理を実行することもできる。
【０１９９】
以上の各実施の形態に関し、さらに以下の付記を開示する。
（付記１）  記憶装置と、
前記記憶装置に対してデータ書き込みまたはデータ読み出しを指示するコマンドに含める書き込みデータサイズまたは読み出しデータサイズを、所定サイズ以下に制限する制御を行うコマンド発行制御部と、
前記コマンド発行制御部によって前記書き込みデータサイズまたは前記読み出しデータサイズが制限されたコマンドを前記記憶装置に送信する送信部と、
を有することを特徴とするストレージシステム。
【０２００】
（付記２）  前記コマンド発行制御部は、前記記憶装置に送信されたコマンドのタイムアウトが発生してから所定期間において、前記書き込みデータサイズまたは前記読み出しデータサイズを前記所定サイズ以下に制限することを特徴とする付記１記載のストレージシステム。
【０２０１】
（付記３）  前記コマンド発行制御部は、前記記憶装置に送信されたコマンドのうち前記記憶装置において未実行のコマンドの数に基づいて、前記書き込みデータサイズまたは前記読み出しデータサイズを前記所定サイズ以下に制限するか否かを決定することを特徴とする付記２記載のストレージシステム。
【０２０２】
（付記４）  前記コマンド発行制御部は、前記未実行のコマンドの数が所定のしきい値以上であると判定した場合には、前記記憶装置に送信するコマンドに、前記記憶装置に受信順にコマンドを実行させるモードを設定することを特徴とする付記３記載のストレージシステム。
【０２０３】
（付記５）  前記コマンド発行制御部は、
前記未実行のコマンドの数が前記しきい値以上であると判定した場合には、送信するコマンドによって前記記憶装置が実行するアクセスがシーケンシャルアクセスかランダムアクセスかを判定し、
ランダムアクセスと判定した場合には、前記記憶装置に送信するコマンドに、前記記憶装置にコマンドを受信順に実行させるモードを設定し、シーケンシャルアクセスと判定した場合には、前記記憶装置に送信するコマンドに、前記記憶装置にコマンドの実行順の変更を許容するモードを設定する、
ことを特徴とする付記４記載のストレージシステム。
【０２０４】
（付記６）  前記コマンド発行制御部は、前記記憶装置に送信するコマンドに、前記記憶装置にコマンドを受信順に実行させるモードに設定する制御を開始した後、一定時間は、前記記憶装置に発行するコマンドに当該モードを設定する制御を継続することを特徴とする付記４記載のストレージシステム。
【０２０５】
（付記７）  前記コマンド発行制御部は、前記書き込みデータサイズまたは前記読み出しデータサイズを前記所定サイズ以下に制限する制御を開始した後、一定時間は、前記書き込みデータサイズまたは前記読み出しデータサイズを前記所定サイズ以下に制限する制御を継続することを特徴とする付記１〜６のいずれか１項に記載のストレージシステム。
【０２０６】
（付記８）  前記ストレージシステムは、
複数の記憶装置と、
データが異なる記憶装置に冗長化されるように前記複数の記憶装置へのデータの書き込みを制御する書き込み制御部と、
を有し、
前記コマンド発行制御部は、前記複数の記憶装置の少なくとも１つが、送信されたコマンドのタイムアウトが発生してから所定時間が経過していないタイムアウト状態にある場合に、前記複数の記憶装置のうち少なくとも前記タイムアウト状態にある記憶装置に対して送信するコマンドに含める前記書き込みデータサイズまたは前記読み出しデータサイズを、前記所定サイズ以下に制限する、
ことを特徴とする付記１記載のストレージシステム。
【０２０７】
（付記９）  前記コマンド発行制御部は、
前記複数の記憶装置のそれぞれに送信されたコマンドのうち各記憶装置において未実行のコマンドの数に基づいて、前記複数の記憶装置が高負荷状態であるか否かを記憶装置ごとに判定し、
前記複数の記憶装置の少なくとも１つが前記高負荷状態にある場合には、前記複数の記憶装置のうち少なくとも前記高負荷状態にある記憶装置に対して送信するコマンドに含める前記書き込みデータサイズまたは前記読み出しデータサイズを前記所定サイズ以下に制限する制御の実行を抑止する、
ことを特徴とする付記８記載のストレージシステム。
【０２０８】
（付記１０）  前記書き込み制御部は、前記複数の記憶装置へのデータの書き込みを、パリティを用いることでデータが異なる記憶装置に冗長化されるように制御し、
前記コマンド発行制御部は、前記複数の記憶装置に対してデータ読み出しを指示する読み出しコマンドが送信される際に、前記複数の記憶装置のうち、前記タイムアウト状態または前記高負荷状態のいずれかの状態にある記憶装置が、１ストライプに含まれるパリティの数以下である場合には、前記複数の記憶装置に対して送信する読み出しコマンドに含める前記読み出しデータサイズを前記所定サイズ以下に制限する制御の実行を抑止するとともに、前記タイムアウト状態または前記高負荷状態のいずれかの状態にある記憶装置からのデータの読み出しを抑止し、前記タイムアウト状態または前記高負荷状態のいずれかの状態にある記憶装置から読み出すべきデータを、他のいずれかの記憶装置から読み出したパリティを用いて復元する、
ことを特徴とする付記９記載のストレージシステム。
【０２０９】
（付記１１）  前記コマンド発行制御部は、
前記複数の記憶装置のうち、前記タイムアウト状態または前記高負荷状態のいずれかの状態にある記憶装置が、１ストライプに含まれるパリティの数より多い場合には、前記複数の記憶装置の中に前記高負荷状態にある記憶装置があるかを判定し、
前記高負荷状態にある記憶装置が１台もない場合には、前記複数の記憶装置に対して送信する読み出しコマンドに含める前記読み出しデータサイズを前記所定サイズ以下に制限し、
前記高負荷状態にある記憶装置がある場合には、前記複数の記憶装置に対して送信する読み出しコマンドに含める前記読み出しデータサイズを前記所定サイズ以下に制限する制御の実行を抑止する、
ことを特徴とする付記１０記載のストレージシステム。
【０２１０】
（付記１２）  前記コマンド発行制御部は、
前記複数の記憶装置のうち、前記タイムアウト状態または前記高負荷状態のいずれかの状態にある記憶装置が、１ストライプに含まれるパリティの数より多く、かつ、前記高負荷状態にある記憶装置がある場合には、送信する読み出しコマンドによって送信先の記憶装置が実行するアクセスがシーケンシャルアクセスかランダムアクセスかを判定し、
ランダムアクセスと判定した場合に、前記複数の記憶装置に送信するコマンドに、送信先の記憶装置にコマンドを受信順に実行させるモードを設定し、シーケンシャルアクセスと判定した場合に、前記複数の記憶装置に送信するコマンドに、送信先の記憶装置にコマンドの実行順の変更を許容するモードを設定する、
ことを特徴とする付記１１記載のストレージシステム。
【０２１１】
（付記１３）  記憶装置に対するアクセスを制御する制御装置におけるストレージ制御方法であって、
前記記憶装置に対してデータ書き込みまたはデータ読み出しを指示するコマンドに含める書き込みデータサイズまたは読み出しデータサイズを、所定サイズ以下に制限し、
前記書き込みデータサイズまたは前記読み出しデータサイズが制限されたコマンドを前記記憶装置に送信する、
ことを特徴とするストレージ制御方法。
【０２１２】
（付記１４）  前記記憶装置に送信したコマンドのタイムアウトが発生してから所定期間において、前記書き込みデータサイズまたは前記読み出しデータサイズを前記所定サイズ以下に制限することを特徴とする付記１３記載のストレージ制御方法。
【０２１３】
（付記１５）  前記記憶装置に送信されたコマンドのうち前記記憶装置において未実行のコマンドの数に基づいて、前記書き込みデータサイズまたは前記読み出しデータサイズを前記所定サイズ以下に制限するか否かを決定することを特徴とする付記１４記載のストレージ制御方法。
【０２１４】
（付記１６）  前記未実行のコマンドの数が所定のしきい値以上であると判定した場合には、前記記憶装置に送信するコマンドに、前記記憶装置に受信順にコマンドを実行させるモードを設定することを特徴とする付記１５記載のストレージ制御方法。
【０２１５】
（付記１７）  前記未実行のコマンドの数が前記しきい値以上であると判定した場合には、送信するコマンドによって前記記憶装置が実行するアクセスがシーケンシャルアクセスかランダムアクセスかを判定し、
ランダムアクセスと判定した場合には、前記記憶装置に送信するコマンドに、前記記憶装置にコマンドを受信順に実行させるモードを設定し、シーケンシャルアクセスと判定した場合には、前記記憶装置に送信するコマンドに、前記記憶装置にコマンドの実行順の変更を許容するモードを設定する、
ことを特徴とする付記１６記載のストレージ制御方法。
【０２１６】
（付記１８）  前記制御装置には複数の記憶装置が接続され、
前記複数の記憶装置に対するアクセスを制御するとともに、データが異なる記憶装置に冗長化されるように前記複数の記憶装置へのデータの書き込みを制御し、
前記複数の記憶装置の少なくとも１つが、送信されたコマンドのタイムアウトが発生してから所定時間が経過していないタイムアウト状態にある場合に、前記複数の記憶装置のうち少なくとも前記タイムアウト状態にある記憶装置に対して送信するコマンドに含める前記書き込みデータサイズまたは前記読み出しデータサイズを、前記所定サイズ以下に制限する、
処理を含むことを特徴とする付記１３記載のストレージ制御方法。
【０２１７】
（付記１９）  前記複数の記憶装置のそれぞれに送信されたコマンドのうち各記憶装置において未実行のコマンドの数に基づいて、前記複数の記憶装置が高負荷状態であるか否かを記憶装置ごとに判定し、
前記複数の記憶装置の少なくとも１つが前記高負荷状態にある場合、前記複数の記憶装置のうち少なくとも前記高負荷状態にある記憶装置に対して送信するコマンドに含める前記書き込みデータサイズまたは前記読み出しデータサイズを前記所定サイズ以下に制限する制御の実行を抑止する、
ことを特徴とする付記１８記載のストレージ制御方法。
【０２１８】
（付記２０）  記憶装置に対するアクセスを制御するためのストレージ制御プログラムにおいて、
コンピュータに、
前記記憶装置に対してデータ書き込みまたはデータ読み出しを指示するコマンドに含める書き込みデータサイズまたは読み出しデータサイズを、所定サイズ以下に制限し、
前記書き込みデータサイズまたは前記読み出しデータサイズが制限されたコマンドを前記記憶装置に送信する、
処理を実行させることを特徴とするストレージ制御プログラム。
【符号の説明】
【０２１９】
１  ストレージシステム
１０  記憶装置
１１  コマンドキュー
２０  ストレージ制御装置
２１  送信部
２２  コマンド発行制御部
【図１】
0005958020.tif 000002
【図２】
0005958020.tif 000003
【図３】
0005958020.tif 000004
【図４】
0005958020.tif 000005
【図５】
0005958020.tif 000006
【図６】
0005958020.tif 000007
【図７】
0005958020.tif 000008
【図８】
0005958020.tif 000009
【図９】
0005958020.tif 000010
【図１０】
0005958020.tif 000011
【図１１】
0005958020.tif 000012
【図１２】
0005958020.tif 000013
【図１３】
0005958020.tif 000014
【図１４】
0005958020.tif 000015
【図１５】
0005958020.tif 000016
【図１６】
0005958020.tif 000017
【図１７】
0005958020.tif 000018
【図１８】
0005958020.tif 000019