(57)【要約】【課題】Ｄｒｉｖｅ−ＩＯ（ホストからのＩ／Ｏコマンドに基づき生成されるドライブ向けのＩ／Ｏコマンド）のキュー管理を改善し、以って、分散ストレージシステムのＩ／Ｏ性能の向上に寄与する。【解決手段】分散ストレージシステムを構成する各ノードが、一つ以上のコントローラを有する。各コントローラは、当該コントローラに物理的に接続されているドライブ毎に実キュー群を有することに加えて、複数のドライブの各々につい仮想キュー群を有する。いずれかのコントローラにより発行され受け付けられたＤｒｉｖｅ−ＩＯは、当該Ｄｒｉｖｅ−ＩＯの発行先ドライブに対応した実キュー群に蓄積される前に、当該発行先ドライブに対応した仮想キュー群に蓄積される。【選択図】図２
2020135155.tif 000002
【特許請求の範囲】
【請求項１】
ホストシステムに論理ボリュームを提供する分散ストレージシステムであって、
複数のドライブが関連付けられた複数のストレージノードを有し、
前記複数のストレージノードの各々は、一つ以上のコントローラを有し、
各コントローラにとって、前記複数のドライブには、当該コントローラに物理的に接続されているドライブである接続ドライブがあり、
前記各コントローラは、ホストシステムから送信され論理ボリュームのアドレスを指定したＩ／Ｏ（Input/Output）コマンドであるＨｏｓｔ−ＩＯを前記ホストシステム又は別のコントローラから受け付けた場合、当該受け付けたＨｏｓｔ−ＩＯに基づきドライブのアドレスを指定したＩ／ＯコマンドであるＤｒｉｖｅ−ＩＯを発行するようになっており、
前記各コントローラは、当該コントローラの接続ドライブ毎に一つ以上の実キューである実キュー群を有することに加えて、前記複数のドライブの各々について一つ以上の仮想キューである仮想キュー群を有し、
各実キューは、ドライブに送信されるＤｒｉｖｅ−ＩＯが蓄積されるキューであり、
各仮想キューは、受け付けられたＤｒｉｖｅ−ＩＯが蓄積されるキューであり、
いずれかのコントローラにより受け付けられたＤｒｉｖｅ−ＩＯである対象Ｄｒｉｖｅ−ＩＯは、当該対象Ｄｒｉｖｅ−ＩＯの発行先ドライブに対応した実キュー群に蓄積される前に、当該発行先ドライブに対応した仮想キュー群に蓄積される、
分散ストレージシステム。
【請求項２】
前記各コントローラには、
各ドライブについて、当該ドライブに対応した仮想キュー群に蓄積可能なＤｒｉｖｅ−ＩＯの数の上限である仮想上限値と、
当該コントローラの各接続ドライブについて、当該接続ドライブに対応した実キュー群に蓄積可能なＤｒｉｖｅ−ＩＯの数の上限である実上限値と
が設定されている、
請求項１に記載の分散ストレージシステム。
【請求項３】
前記各コントローラにおいて、前記各ドライブに関し、当該ドライブに対応した仮想上限値は、当該ドライブが接続ドライブであるコントローラに設定される実上限値と同じ又はそれよりも大きい値である、
請求項２に記載の分散ストレージシステム。
【請求項４】
前記各コントローラにおいて、前記各ドライブに関し、
当該ドライブに対応した仮想上限値は、当該ドライブのハード仕様に従う上限値に基づく値であり、
当該ドライブを接続ドライブとしたコントローラに設定される実上限値は、当該ドライブのハード仕様に従う上限値に基づく値を、当該ドライブが接続ドライブであるコントローラの数で割った値である、
請求項３に記載の分散ストレージシステム。
【請求項５】
前記複数のストレージノードにおける複数のコントローラの少なくとも一つには、当該コントローラに物理的に接続されていないドライブである非接続ドライブがあり、
前記対象Ｄｒｉｖｅ−ＩＯが受け付けられた受付コントローラと、前記発行先ドライブが接続ドライブである実行コントローラとが異なっている場合、前記対象Ｄｒｉｖｅ−ＩＯは、
前記受付コントローラにおける複数の仮想キュー群のうち前記発行先ドライブに対応した仮想キュー群から前記受付コントローラにより取得され、
前記受付コントローラから前記実行コントローラに転送され、
前記実行コントローラにおける複数の実キュー群のうち前記発行先ドライブに対応した実キュー群に、前記実行コントローラにより蓄積される、
請求項３に記載の分散ストレージシステム。
【請求項６】
前記実行コントローラは、前記対象Ｄｒｉｖｅ−ＩＯを前記受付コントローラから受け付けた場合、前記実行コントローラにおける複数の仮想上限値のうち、前記発行先ドライブに対応した仮想上限値を下げる、
請求項５に記載の分散ストレージシステム。
【請求項７】
前記各コントローラは、複数のプロセッサコアを有し、
前記各コントローラにおいて、当該コントローラにおけるプロセッサコア毎に仮想キュー及び実キューの各々が備えられ、
前記実行コントローラにおいて前記発行先ドライブに対応した仮想上限値のデフォルト値は、前記発行先ドライブのハード仕様に従う上限値に基づく値であり、
前記受付コントローラと前記実行コントローラとが異なっている場合、前記実行コントローラにおいて前記発行先ドライブに対応した仮想上限値は、前記実行コントローラが有するプロセッサコア数と同じ値に下げられる、
請求項６に記載の分散ストレージシステム。
【請求項８】
前記実行コントローラは、周期的に、当該実行コントローラにおいてデフォルト値と異なる値になっている仮想上限値があれば当該仮想上限値をデフォルト値に戻す、
請求項６に記載の分散ストレージシステム。
【請求項９】
前記複数のストレージノードの各々が、二つ以上のコントローラを有する、
請求項１に記載の分散ストレージシステム。
【請求項１０】
前記複数のストレージノードは、複数のノード群を有し、
前記複数のノード群の各々は、冗長化されたストレージノードであり、
各ストレージノードにおいて、前記二つ以上のコントローラは、冗長化されたコントローラである、
請求項８に記載の分散ストレージシステム。
【請求項１１】
前記各コントローラは、当該コントローラに設定されている複数の仮想上限値の各々を動的に調整する、
請求項２に記載の分散ストレージシステム。
【請求項１２】
前記各コントローラは、当該コントローラに設定されている複数の仮想上限値の各々を、当該仮想上限値に対応したドライブに対するＤｒｉｖｅ−ＩＯの実行状況に応じて調整する、
請求項１１に記載の分散ストレージシステム。
【請求項１３】
前記各コントローラは、当該コントローラに設定されている複数の仮想上限値の各々を周期的に調整する、
請求項１に記載の分散ストレージシステム。
【請求項１４】
前記各コントローラは、周期的に、当該コントローラにおいてデフォルト値と異なる値になっている仮想上限値があれば当該仮想上限値をデフォルト値に戻す、
請求項１３に記載の分散ストレージシステム。
【請求項１５】
ホストシステムに論理ボリュームを提供する分散ストレージシステムで実現される記憶制御方法であって、
前記分散ストレージシステムは、複数のドライブが関連付けられた複数のストレージノードを有し、
前記複数のストレージノードの各々は、一つ以上のコントローラを有し、
各コントローラにとって、前記複数のドライブには、当該コントローラに物理的に接続されているドライブである接続ドライブがあり、
前記各コントローラは、ホストシステムから送信され論理ボリュームのアドレスを指定したＩ／Ｏ（Input/Output）コマンドであるＨｏｓｔ−ＩＯを前記ホストシステム又は別のコントローラから受け付けた場合、当該受け付けたＨｏｓｔ−ＩＯに基づきドライブのアドレスを指定したＩ／ＯコマンドであるＤｒｉｖｅ−ＩＯを発行するようになっており、
前記記憶制御方法は、
前記各コントローラに、当該コントローラの接続ドライブ毎に一つ以上の実キューである実キュー群と、前記複数のドライブの各々について一つ以上の仮想キューである仮想キュー群とを設定し、
各実キューは、ドライブに送信されるＤｒｉｖｅ−ＩＯが蓄積されるキューであり、
各仮想キューは、受け付けられたＤｒｉｖｅ−ＩＯが蓄積されるキューであり、
いずれかのコントローラにより発行されたＤｒｉｖｅ−ＩＯである対象Ｄｒｉｖｅ−ＩＯを、当該対象Ｄｒｉｖｅ−ＩＯの発行先ドライブに対応した実キュー群に蓄積される前に、当該対象Ｄｒｉｖｅ−ＩＯを受け付けたコントローラにより、当該発行先ドライブに対応した仮想キュー群に蓄積する、
記憶制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、概して、複数のストレージノードを有する分散ストレージシステムに関する。
【背景技術】
【０００２】
ストレージシステムでは、Ｉ／Ｏ（Input/Output）コマンドの管理にキューが使用される。ストレージシステムにおけるキューの使用に関する技術として、例えば特許文献１がある。特許文献１には、「外部装置１とデータ入出力要求コマンドを受信する論理デバイスとを組合せたコマンド授受対に対応させて、コマンド処理資源の割当個数を管理する割当個数管理部１３と、コマンド授受対に関して、割当個数管理部１３によって管理されている割当個数を上限値とする数のコマンド処理資源に、データ入出力要求コマンドを割り当てる割当制御部１４とをそなえて構成する。」が記載されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１０−２０６９４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
複数のドライブが関連付けられた複数のストレージノードを有する分散ストレージシステムが知られている。分散ストレージシステムは、ホストシステムからＶＯＬ（論理ボリューム）のアドレスを指定したＩ／Ｏコマンド（以下、Ｈｏｓｔ−ＩＯ）を受け付け、当該Ｈｏｓｔ−ＩＯを基に、一つ以上のドライブに対する一つ以上（典型的には複数）のＩ／Ｏコマンド（以下、Ｄｒｉｖｅ−ＩＯ）を発行する。Ｄｒｉｖｅ−ＩＯでは、発行先のドライブのアドレスが指定される。
【０００５】
Ｉ／Ｏコマンドが蓄積されるキューを管理する分散ストレージシステムでは、各ストレージノードは、ドライブについて発行されたＤｒｉｖｅ−ＩＯが蓄積されるキュー（以下、実キュー）を管理する。一つのドライブにつき実キュー群（一つ以上の実キュー）が管理される。
【０００６】
一般に、ドライブ毎に、当該ドライブのハード仕様に基づきＩＯ上限値（Ｄｒｉｖｅ−ＩＯの数の上限値）が決まっている。各ドライブについて、ＩＯ上限値を超える数のＤｒｉｖｅ−ＩＯを実キュー群に蓄積することはできない。
【０００７】
また、各ストレージノードは、一つ以上のコントローラ（以下、ＣＴＬ）を有する。各ＣＴＬは、Ｈｏｓｔ−ＩＯの受け付けもＤｒｉｖｅ−ＩＯの発行も行うことができる。各ＣＴＬにとって、接続ドライブと非接続ドライブのうち少なくとも接続ドライブがある。各ＣＴＬについて、接続ドライブは、当該ＣＴＬに物理的に接続されているドライブ（言い換えれば、別のＣＴＬ非経由にアクセス可能なドライブ）であり、非接続ドライブは、当該ＣＴＬに物理的に接続されていないドライブ（言い換えれば、別のＣＴＬ経由にアクセス可能なドライブ）である。
【０００８】
分散ストレージシステムでは、下記の第１及び第２の問題のうちの少なくとも一つがある。
【０００９】
第１の問題は、次の通りである。各ＣＴＬに、当該ＣＴＬの接続ドライブ毎に、当該ＣＴＬ用のＩＯ上限値が設定され、且つ、二つ以上のＣＴＬについて同一の接続ドライブが存在する場合、それら二つ以上のＣＴＬの各々に設定されるＣＴＬ用のＩＯ上限値は、当該接続ドライブのＩＯ上限値よりも小さい。例えば、ＣＴＬ用のＩＯ上限値は、接続ドライブのＩＯ上限値を、当該接続ドライブを共有するＣＴＬの数で割った値である。接続ドライブのＩＯ上限値がいずれのＣＴＬにも設置されてしまうと、当該接続ドライブのＩＯ上限値を超えるＤｒｉｖｅ−ＩＯが当該接続ドライブに送信され得るからである。このため、各ＣＴＬでは、発行されたＤｒｉｖｅ−ＩＯの数がＣＴＬ用のＩＯ上限値に達してしまったが故に接続ドライブには余裕があってもＤｒｉｖｅ−ＩＯを発行できない（又は、発行されてもエラーとなる）ことが起こり得る。これは、接続ドライブを共有するＣＴＬの数が多い程、起こる可能性が高い。結果として、ＣＴＬの性能が十分に発揮されない。
【００１０】
第２の問題は、Ｈｏｓｔ−ＩＯを受け付けたＣＴＬが当該Ｈｏｓｔ−ＩＯに基づくＤｒｉｖｅ−ＩＯを発行しても、当該Ｄｒｉｖｅ−ＩＯの発行先のドライブが、当該ＣＴＬの非接続ドライブの場合、当該Ｄｒｉｖｅ−ＩＯのＣＴＬ間での転送が必要になるが、転送先のＣＴＬにおいて、当該ドライブに対応した実キュー群がフルの場合（転送先のＣＴＬ用のＩＯ上限値にＩＯ数が達している場合）、Ｄｒｉｖｅ−ＩＯの転送不可となる。この場合、ＣＴＬ間の転送のリトライといったオーバーヘッドが生じ得る。
【００１１】
以上の第１及び第２の問題のうちの少なくとも一つにより、分散ストレージシステムのＩＯ性能が低下し得る。
【００１２】
特許文献１には、このような課題やその課題を解決する手段は開示も示唆もされていない。具体的には、特許文献１には、分散ストレージシステムの開示は無く、且つ、Ｄｒｉｖｅ−ＩＯのキュー管理に関する開示も無い。
【課題を解決するための手段】
【００１３】
ホストシステムに論理ボリュームを提供する分散ストレージシステムが、複数のドライブが関連付けられた複数のストレージノードを有する。複数のストレージノードの各々は、一つ以上のコントローラを有する。各コントローラにとって、複数のドライブには、当該コントローラに物理的に接続されているドライブである接続ドライブがある。各コントローラは、ホストシステムから送信され論理ボリュームのアドレスを指定したＩ／Ｏ（Input/Output）コマンドであるＨｏｓｔ−ＩＯをホストシステム又は別のコントローラから受け付けた場合、当該受け付けたＨｏｓｔ−ＩＯに基づきドライブのアドレスを指定したＩ／ＯコマンドであるＤｒｉｖｅ−ＩＯを発行するようになっている。各コントローラは、当該コントローラの接続ドライブ毎に一つ以上の実キューである実キュー群を有することに加えて、複数のドライブの各々について一つ以上の仮想キューである仮想キュー群を有する。各実キューは、取得されドライブに送信されるＤｒｉｖｅ−ＩＯが蓄積されるキューである。各仮想キューは、発行され受け付けられたＤｒｉｖｅ−ＩＯが蓄積されるキューである。いずれかのコントローラにより発行され受け付けられたＤｒｉｖｅ−ＩＯである対象Ｄｒｉｖｅ−ＩＯは、当該対象Ｄｒｉｖｅ−ＩＯの発行先ドライブに対応した実キュー群に蓄積される前に、当該発行先ドライブに対応した仮想キュー群に蓄積される。
【発明の効果】
【００１４】
Ｄｒｉｖｅ−ＩＯのキュー管理が改善され、結果として、分散ストレージシステムのＩ／Ｏ性能の向上に寄与することができる。
【図面の簡単な説明】
【００１５】
【図１】本発明の一実施形態に係るシステム全体の構成例を示す。
【図２】ＣＴＬ６が有する機能及びテーブルの一例を示す。
【図３】構成テーブルの構成例を示す。
【図４】オーナー権テーブルの構成例を示す。
【図５】請負フラグテーブルの構成例を示す。
【図６】仮想キュー管理テーブルの構成例を示す。
【図７】実キュー管理テーブルの構成例を示す。
【図８】受付ＣＴＬと実行ＣＴＬが同じ場合についての処理流れの一例の概要を示す。
【図９】受付ＣＴＬと実行ＣＴＬが異なる場合についての処理流れの一例の概要を示す。
【図１０】受付ＣＴＬと実行ＣＴＬが異なるが故にＤｒｉｖｅ−ＩＯのＣＴＬ間転送が生じた場合に行われる仮想上限値の制限とその解除の一例を示す。
【図１１】請負フラグと周期的に行われる調整処理との関係の一例を示す。
【図１２】調整処理のフローの一例を示す。
【発明を実施するための形態】
【００１６】
以下の説明では、「インターフェース装置」は、一つ以上のインターフェースデバイスでよい。当該一つ以上のインターフェースデバイスは、一つ以上の同種の通信インターフェースデバイス（例えば一つ以上のＮＩＣ（Network Interface Card））であってもよいし二つ以上の異種の通信インターフェースデバイス（例えばＮＩＣとＨＢＡ（Host Bus Adapter））であってもよい。
【００１７】
また、以下の説明では、「メモリ」は、一つ以上のメモリデバイスであり、典型的には主記憶デバイスでよい。メモリにおける少なくとも一つのメモリデバイスは、揮発性メモリデバイスであってもよいし不揮発性メモリデバイスであってもよい。
【００１８】
また、以下の説明では、「ドライブ」は、不揮発性の記憶デバイス（例えば補助記憶デバイス）であり、具体的には、例えば、ＨＤＤ（Hard Disk Drive）又はＳＳＤ（Solid State Drive）である。複数のドライブは、一つ以上のＲＡＩＤ（Redundant Array of Independent (or Inexpensive) Disks）グループを構成してもよい。ＲＡＩＤグループは、二つ以上のドライブで構成されており、パリティグループと呼ばれてもよい。
【００１９】
また、以下の説明では、「プロセッサ」は、一つ以上のプロセッサデバイスである。少なくとも一つのプロセッサデバイスは、典型的には、ＣＰＵ（Central Processing Unit）のようなマイクロプロセッサデバイスであるが、ＧＰＵ（Graphics Processing Unit）のような他種のプロセッサデバイスでもよい。少なくとも一つのプロセッサデバイスは、シングルコアでもよいしマルチコアでもよい。少なくとも一つのプロセッサデバイスは、プロセッサコアでもよい。少なくとも一つのプロセッサデバイスは、処理の一部又は全部を行うハードウェア回路（例えばＦＰＧＡ（Field-Programmable Gate Array）又はＡＳＩＣ（Application Specific Integrated Circuit））といった広義のプロセッサデバイスでもよい。
【００２０】
また、以下の説明では、「ｘｘｘテーブル」といった表現にて、入力に対して出力が得られる情報を説明することがあるが、当該情報は、どのような構造のデータでもよいし、入力に対する出力を発生するニューラルネットワークのような学習モデルでもよい。従って、「ｘｘｘテーブル」を「ｘｘｘ情報」と言うことができる。また、以下の説明において、各テーブルの構成は一例であり、一つのテーブルは、二つ以上のテーブルに分割されてもよいし、二つ以上のテーブルの全部又は一部が一つのテーブルであってもよい。
【００２１】
また、以下の説明では、「ｋｋｋ部」の表現にて機能を説明することがあるが、機能は、一つ以上のコンピュータプログラムがプロセッサによって実行されることで実現されてもよいし、一つ以上のハードウェア回路（例えばＦＰＧＡ又はＡＳＩＣ）によって実現されてもよい。プログラムがプロセッサによって実行されることで機能が実現される場合、定められた処理が、適宜にメモリ及び／又はインターフェース装置等を用いながら行われるため、機能はプロセッサの少なくとも一部とされてもよい。機能を主語として説明された処理は、プロセッサあるいはそのプロセッサを有する装置が行う処理としてもよい。プログラムは、プログラムソースからインストールされてもよい。プログラムソースは、例えば、プログラム配布計算機又は計算機が読み取り可能な記録媒体（例えば非一時的な記録媒体）であってもよい。各機能の説明は一例であり、複数の機能が一つの機能にまとめられたり、一つの機能が複数の機能に分割されたりしてもよい。
【００２２】
また、以下の説明では、「ＶＯＬ」は、論理ボリュームの略であり、論理的な記憶デバイスでよい。ＶＯＬは、実体的なＶＯＬ（ＲＶＯＬ）であってもよいし、仮想的なＶＯＬ（ＶＶＯＬ）であってもよい。「ＲＶＯＬ」は、そのＲＶＯＬを提供するストレージシステムが有する永続記憶装置に基づくＶＯＬでよい。「ＶＶＯＬ」は、複数の仮想領域（仮想的な記憶領域）で構成されており容量仮想化技術（典型的にはThin Provisioning）に従うＶＯＬでよい。「プール」は、複数の実領域（実体的な記憶領域）で構成された記憶領域（例えば複数のＶＯＬの集合）でよい。ストレージシステムが、ホストシステムから受信したライト要求が指定するアドレスが属する仮想領域に実領域が割り当てられていない場合、その仮想領域にプールから実領域を割り当ててよい。
【００２３】
また、以下の説明では、「ホストシステム」は、一つ以上の物理的なホスト計算機でよいし、物理的な計算資源（例えばプロセッサ及びメモリ）に基づき実現された一つ以上の仮想的なホスト計算機でもよい。以下、ホストシステムを「ホスト」と略記する。
【００２４】
また、以下の説明では、ＩＤ（識別情報）として、識別番号が採用されるが、番号に代えて又は加えて他種の符号が採用されてもよい。
【００２５】
以下、一実施形態を図面に基づいて説明する。
【００２６】
図１は、本実施形態に係るシステム全体の構成例を示す。なお、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号のうちの共通部分を使用し、同種の要素を区別する場合は、要素の参照符号を使用することがある。例えば、ホストを区別しない場合には、「ホスト１」と言い、ホストを区別する場合には、「ホスト１Ａ」、「ホスト１Ｂ」のように言うことがある。
【００２７】
複数（又は一つ）のホスト１が、複数のストレージモジュール（以下、モジュール）１１を含んだ分散ストレージシステム１００に接続される。各モジュール１１は、一つ以上のストレージノード（以下、ノード）１０と、一つ以上のドライブボックス９とを有する。各ノード１０は、汎用計算機でもよいが、本実施形態では、冗長化された構成を有するストレージ装置である。ドライブボックス９は、一つ以上のドライブを含む。ドライブボックス９が、一つ以上のＲＡＩＤグループを含んでもよい。また、二つ以上のドライブボックス９における二つ以上のドライブから一つのＲＡＩＤグループが構成されてもよい。
【００２８】
各ホスト１は、分散ストレージシステム１００における複数のノード１０のうちの少なくとも一つのノード１０にネットワーク４９経由で通信可能に接続される。
【００２９】
ネットワーク４９とは異なる（又は同一の）ネットワーク５０に、分散ストレージシステム１００と、ストレージ管理サーバ２０１とが接続される。ネットワーク５０（及び４９）は、ファイバチャネル（Fibre Channel）、イーサネット（登録商標）、InfiniBand又はＬＡＮ（Local Area Network）などから構成される一つ以上のネットワークでよい。
【００３０】
分散ストレージシステム１００は、一つ又は複数のＳＮ（Service and Network box）４を有する。一つ又は複数のＳＮ４は、管理サーバ２０１にネットワーク５０経由で接続され、且つ、複数のノード１０の各々に接続される。ＳＮ４は、スイッチ装置の一例である。ＳＮ４は、専用線４８（又はネットワーク５０）を介して、別のＳＮ４に接続される。
【００３１】
各ＳＮ４に関しては、ＳＮ４Ａを例に取れば、例えば次の通りである。すなわち、ＳＮ４Ａは、管理端末２Ａと、ＩＳＷ（Interconnect-Switch）群とを有する。管理端末２Ａは、プロセッサ及びメモリを有する計算機である。管理端末２Ａは、ネットワーク５０を介して管理サーバ２０１と通信可能に接続される。ＩＳＷ群は、一つ以上のＩＳＷ３、本実施形態では、冗長化されたＩＳＷ３Ａ０及び３Ａ１である。各ＩＳＷ３は、後述の冗長化されているコントローラ６Ａ０及び６Ａ１間を、後述の冗長化されているＩＥ５Ａ０及び５Ａ１をそれぞれ介して接続するスイッチ装置である。
【００３２】
各ノード１０に関しては、ノード１０Ａを例に取れば、例えば次の通りである。ノード１０Ａは、複数（又は一つ）のＦＥ−ＩＦ（Front End Interface）群、一つ（又は複数）のＣＴＬユニット群、及び、複数（又は一つ）のＩＥ（Interconnect-Edge）群を有する。
【００３３】
各ＦＥ−ＩＦ群は、冗長化されたＦＥ−ＩＦ７である（例えば、ＦＥ−ＩＦ７Ａ０及び７Ａ１が、冗長化されたＦＥ−ＩＦ７である）。各ＦＥ−ＩＦ７は、ホスト１からＨｏｓｔ−ＩＯを受け付けるインターフェースデバイスである。
【００３４】
ＣＴＬユニット群は、冗長化されたＣＴＬユニット８Ａ０及び８Ａ１である。例えばＣＴＬユニット８Ａ０は、ＣＴＬ（コントローラ）６Ａ０と、ＣＴＬ６Ａ０に接続されたＢＥ−ＩＦ（Back End Interface）１２Ａ０とを有する。ＣＴＬ６Ａ０は、例えばプロセッサ及びメモリを計算機である。ＣＴＬ６Ａ０（及び６Ａ１）に、管理端末２Ａが例えばＬＡＮ経由で接続されている。ＢＥ−ＩＦ１２Ａ０は、ドライブボックス９Ａ及び９Ｅ内のドライブと通信するインターフェースデバイスである。
【００３５】
各ＩＥ群は、冗長化されたＩＥ５である。例えば、ＩＥ５Ａ０及び５Ａ１が、冗長化されたＩＥである。ＩＥ５は、いずれかのＳＮ４内のいずれかのＩＳＷ３に例えばＬＡＮ（Local Area Network）経由で接続される。また、ＩＥ５は、いずれかのＣＴＬ６に接続される。つまり、ＩＥ５は、ＩＳＷ３とＣＴＬ６を接続するためのインターフェースデバイスである。例えば、ＩＥ５Ａ０は、ＩＳＷ３Ａ０とＣＴＬ６Ａ０を接続するためのインターフェースデバイスである。
【００３６】
本実施形態では、分散ストレージシステム１００は、ホスト１からのＨＯＳＴ−ＩＯに従うデータがいずれのノード１０を介していずれのドライブボックス９にも入出力可能に構成されている。例えば、モジュール１１も冗長化されている。モジュール１１Ａ内のノード１０Ａ及び１０Ｂのいずれも、モジュール１１Ａ内のドライブボックス９Ａ〜９Ｄのいずれにもアクセス可能であり、且つ、モジュール１１Ｂ内のドライブボックス９Ｅ〜９Ｈのいずれにもアクセス可能である。同様に、モジュール１１Ｂ内のノード１０Ｃ及び１０Ｄのいずれも、モジュール１１Ｂ内のドライブボックス９Ｅ〜９Ｈのいずれにもアクセス可能であり、且つ、モジュール１１Ａ内のドライブボックス９Ａ〜９Ｄのいずれにもアクセス可能である。ホスト１からのＨＯＳＴ−ＩＯは、ノード１０Ａ〜１０Ｄが有するＦＥ−ＩＦ７Ａ〜７Ｄのうちのいずれによって受け付けられてもよいし、ノード１０Ａ〜１０Ｄが有するＣＴＬ６Ａ〜６Ｄのいずれによって処理されてもよい。具体的には、例えば、ＨＯＳＴ−ＩＯがノード１０Ａにより受け付けられたが当該ＨＯＳＴ−ＩＯの処理担当はノード１０Ｄである場合（例えば、当該ＨＯＳＴ−ＩＯで指定されたボリュームの担当がノード１０Ｄである場合）、ＦＥ−ＩＥ７Ａ０〜７Ａ７のいずれかを経由してＣＴＬ６Ａ０又は６Ａ１に受け付けられた当該ＨＯＳＴ−ＩＯは、下記の（Ｐ）又は（Ｑ）経由でＣＴＬ６Ｄ０又は６Ｄ１に転送され、ＣＴＬ６Ｄ０又は６Ｄ１が、当該ＨＯＳＴ−ＩＯに基づく一つ以上のＤｒｉｖｅ−ＩＯを、ＢＥ−ＩＦ１２Ｄ０又は１２Ｄ１を経由して、ドライブボックス９Ａ〜９Ｈのいずれかにおけるドライブに送信する。
（Ｐ）ＩＥ５Ａ０又は５Ａ１、ＩＳＷ３Ａ０、ＳＮ４Ａ、専用線４８Ａ、ＳＮ４Ｃ、ＩＳＷ３Ｃ１、及び、ＩＥ５Ｄ０又は５Ｄ１。
（Ｑ）ＩＥ５Ａ２又は５Ａ３、ＩＳＷ３Ｂ０、ＳＮ４Ｂ、専用線４８Ｂ、ＳＮ４Ｄ、ＩＳＷ３Ｄ１、及び、ＩＥ５Ｄ２又は５Ｄ３。
【００３７】
また、分散ストレージシステム１００は、管理サーバ２０１がネットワーク５０経由でいずれのノード１０とも通信可能に構成されている。具体的には、例えば、管理サーバ２０１は、ＳＮ４Ａ〜４Ｄにおける管理端末２Ａ〜２Ｄを介してノード１０Ａ〜１０Ｄからそれぞれ構成情報を取得することができる。
【００３８】
図１の例によれば、各ノード１０において、インターフェース装置の一例が、複数のＦＥ−ＩＥ７、複数のＩＥ５、及び複数のＢＥ−ＩＦ１２であり、メモリの一例が、複数のＣＴＬ６内の複数のメモリであり、プロセッサの一例が、複数のＣＴＬ内の複数のＣＰＵである。また、複数のノード１０に関連付けられる複数のドライブの一例が、複数のドライブボックス９である。
【００３９】
また、図１によれば、例えば、ＣＴＬ６Ａ０にとって、接続ドライブ（物理的に接続されているドライブ）は、ドライブボックス９Ａ及び９Ｃ内の各ドライブであり、非接続ドライブ（物理的に接続されていないドライブ）は、ドライブボックス９Ｂ、９Ｄ及び９Ｅ〜９Ｈ内の各ドライブである。
【００４０】
図２は、ＣＴＬ６が有する機能及びテーブルの一例を示す。
【００４１】
ＣＴＬ６は、メモリ２５１と、メモリ２５１に接続されているプロセッサ２５２とを有する。プロセッサ２５２は、複数のＣＰＵを有し、各ＣＰＵが、複数のプロセッサコア２６０を有する。プロセッサコア２６０は、例えばマイクロプロセッサでよい。
【００４２】
メモリ２５１には、プロセッサ２５２に実行されることでＨｏｓｔ−ＩＯ処理部２０１、Ｄｒｉｖｅ−ＩＯ受付部２０２、仮想キュー管理部２０３、Ｄｒｉｖｅ−ＩＯ依頼部２０４、Ｄｒｉｖｅ−ＩＯ請負部２０５、実キュー管理部２０６、及びＤｒｉｖｅ−ＩＯ実行部２０７を実現するための一つ以上のコンピュータプログラムが格納される。Ｈｏｓｔ−ＩＯ処理部２０１は、ホスト１又は別ＣＴＬ６からのＨｏｓｔ−ＩＯを処理する、例えば、当該Ｈｏｓｔ−ＩＯに基づくＤｒｉｖｅ−ＩＯを発行する。Ｄｒｉｖｅ−ＩＯ受付部２０２は、発行されたＤｒｉｖｅ−ＩＯを受け付ける。仮想キュー管理部２０３は、後述の仮想キュー群２１１を管理する。Ｄｒｉｖｅ−ＩＯ依頼部２０４は、Ｄｒｉｖｅ−ＩＯを別ＣＴＬ６に転送する。Ｄｒｉｖｅ−ＩＯ請負部２０５は、別ＣＴＬ６のＤｒｉｖｅ−ＩＯ依頼部２０４により転送されたＤｒｉｖｅ−ＩＯを受け付ける。実キュー管理部２０６は、後述の実キュー群２１２を管理する。及びＤｒｉｖｅ−ＩＯ実行部２０７は、Ｄｒｉｖｅ−ＩＯ受付部２０２又はＤｒｉｖｅ−ＩＯ請負部２０５により受け付けられたＤｒｉｖｅ−ＩＯ（つまり接続ドライブに対するＤｒｉｖｅ−ＩＯ）を実行する（当該Ｄｒｉｖｅ−ＩＯをドライブに送信する）。
【００４３】
メモリ２５１には、分散ストレージシステム１００における全ドライブのうち当該ＣＴＬ６の各接続ドライブについて、当該接続ドライブに対応した実キュー群２１２（一つ以上の実キュー）が設けられる。これに加えて、メモリ２５１には、分散ストレージシステム１００における全ドライブの各々について、当該ドライブに対応した仮想キュー群２１１（一つ以上の仮想キュー）が設けられる。
【００４４】
各実キューは、ドライブに送信されるＤｒｉｖｅ−ＩＯが蓄積されるキューである。各仮想キューは、発行され受け付けられたＤｒｉｖｅ−ＩＯが蓄積されるキューである。いずれかのＣＴＬ６により発行され受け付けられたＤｒｉｖｅ−ＩＯは、当該Ｄｒｉｖｅ−ＩＯの発行先ドライブに対応した実キュー群２１２に蓄積される前に、当該発行先ドライブに対応した仮想キュー群２１１に蓄積される。
【００４５】
メモリ２５１は、構成テーブル２２１、オーナー権テーブル２２２、請負フラグテーブル２２３、仮想キュー管理テーブル２２４及び実キュー管理テーブル２２５といった複数のテーブルを含む管理情報を格納する。
【００４６】
図３〜図７を参照して、テーブル２２１〜２２５を説明する。
【００４７】
図３は、構成テーブル２２１の構成例を示す。
【００４８】
構成テーブル２２１は、ドライブ、ＶＯＬ及びＣＴＬの関係を示す。具体的には、例えば、構成テーブル２２１は、ドライブ毎にエントリを有する。各エントリは、ドライブ＃３０１、ドライブアドレス３０２、ＶＯＬアドレス３０３及びＣＴＬ＃３０４といった情報を保持する。一つのドライブを例に取る（図３の説明において「注目ドライブ」）。
【００４９】
ドライブ＃３０１は、注目ドライブの識別番号を示す。ドライブアドレス３０２は、注目ドライブが提供する記憶空間に属するアドレス（例えばＬＢＡ（Logical Block Address））を示す。ＶＯＬアドレス３０３が、注目ドライブに基づくＶＯＬの識別番号と当該ＶＯＬに属するアドレス（例えばＬＢＡ）との組合せを示し注目ドライブのアドレスに対応した情報である。ＣＴＬ＃が、注目ドライブが接続ドライブであるＣＴＬ６の識別番号を示す。
【００５０】
Ｈｏｓｔ−ＩＯに記述されているＶＯＬアドレスと、構成テーブル２２１とを基に、Ｈｏｓｔ−ＩＯ処理部２０１は、当該Ｈｏｓｔ−ＩＯに対応した一つ以上のＤｒｉｖｅ−ＩＯを発行（生成）できる。
【００５１】
図４は、オーナー権テーブル２２２の構成例を示す。
【００５２】
オーナー権テーブル２２２は、ホスト１に提供されるＶＯＬとＶＯＬのオーナーＣＴＬとの関係を示す。具体的には、例えば、オーナー権テーブル２２２は、ＶＯＬ毎にエントリを有する。各エントリは、ＶＯＬ＃４０１及びＣＴＬ＃４０２といった情報を保持する。一つのＶＯＬを例に取る（図４の説明において「注目ＶＯＬ」）。
【００５３】
ＶＯＬ＃４０１は、注目ＶＯＬの識別番号を示す。ＣＴＬ＃４０２は、注目ＶＯＬのオーナー権を有するＣＴＬ６の識別番号を示す。注目ＶＯＬのオーナー権を有するＣＴＬ６が、注目ＶＯＬを指定したＨｏｓｔ−ＩＯに基づくＤｒｉｖｅ−ＩＯを発行する。
【００５４】
図５は、請負フラグテーブル２２３の構成例を示す。
【００５５】
請負フラグテーブル２２３は、当該テーブル２２３を有するＣＴＬ６（図５の説明において「自ＣＴＬ６」）の接続ドライブに対するＤｒｉｖｅ−ＩＯが受け付けられたＣＴＬ６が自ＣＴＬ６か否かを示すテーブルである。具体的には、例えば、請負フラグテーブル２２３は、接続ドライブ毎にエントリを有する。各エントリは、接続ドライブ＃５０１及び請負フラグ＃５０２といった情報を保持する。一つの接続ドライブを例に取る（図５の説明において「注目接続ドライブ」）。
【００５６】
接続ドライブ＃５０１は、注目接続ドライブの識別番号を示す。請負フラグ＃５０２は、注目接続ドライブについて自ＣＴＬ６以外のＣＴＬ６からＤｒｉｖｅ−ＩＯを受け付けた（“ＯＮ”）か否か（“ＯＦＦ”）を示す。
【００５７】
図６は、仮想キュー管理テーブル２２４の構成例を示す。
【００５８】
仮想キュー管理テーブル２２４は、仮想キュー群２１１毎に仮想上限値と使用状況とを示す。具体的には、例えば、仮想キュー管理テーブル２２４は、分散ストレージシステム１００における全ドライブの各々についてエントリを有する。各エントリは、ドライブ＃６０１、仮想上限値６０２及びＩＯ数６０３といった情報を保持する。一つのドライブを例に取る（図６の説明において「注目ドライブ」）。
【００５９】
ドライブ＃６０１は、注目ドライブの識別番号を示す。仮想上限値６０２は、注目ドライブに対応した仮想上限値（当該ドライブに対応した仮想キュー群２１１に蓄積可能なＤｒｉｖｅ−ＩＯの数の上限）を示す。ＩＯ数６０３は、当該テーブル２２４を有するＣＴＬ６に存在するプロセッサコア毎のＩＯ数（当該コアに対応した仮想キューに蓄積されているＤｒｉｖｅ−ＩＯの数）を示す。注目ドライブについて、当該ＣＴＬ６が有する一つ以上のプロセッサコアの各々に対応した仮想キューに蓄積されているＤｒｉｖｅ−ＩＯの数の合計が、注目ドライブに対応した仮想キュー群２１１に蓄積されているＤｒｉｖｅ−ＩＯの数である。注目ドライブについて、当該合計は、仮想キュー管理部２０３により、注目ドライブに対応した仮想上限値以下に制限される。
【００６０】
注目ドライブに対応した仮想上限値６０２は、例えば、注目ドライブのハード仕様に従う上限値に基づく値（例えば、ハード仕様に従う上限値それ自体、又は、当該上限値から保守に関して定義された値を引いた値）でよい。
【００６１】
図７は、実キュー管理テーブル２２５の構成例を示す。
【００６２】
実キュー管理テーブル２２５は、実キュー群２１２毎に実上限値と使用状況とを示す。具体的には、例えば、実キュー管理テーブル２２５は、当該テーブル２２５の接続ドライブ毎にエントリを有する。各エントリは、接続ドライブ＃７０１、実上限値７０２及びＩＯ数７０３といった情報を保持する。一つの接続ドライブを例に取る（図７の説明において「注目接続ドライブ」）。
【００６３】
接続ドライブ＃７０１は、注目接続ドライブの識別番号を示す。実上限値７０２は、注目接続ドライブに対応した実上限値（当該接続ドライブに対応した実キュー群２１２に蓄積可能なＤｒｉｖｅ−ＩＯの数の上限）を示す。ＩＯ数７０３は、当該テーブル２２５を有するＣＴＬ６に存在するプロセッサコア毎のＩＯ数（当該コアに対応した実キューに蓄積されているＤｒｉｖｅ−ＩＯの数）を示す。注目接続ドライブについて、当該ＣＴＬ６が有する一つ以上のプロセッサコアの各々に対応した実キューに蓄積されているＤｒｉｖｅ−ＩＯの数の合計が、注目接続ドライブに対応した実キュー群２１２に蓄積されているＤｒｉｖｅ−ＩＯの数である。注目接続ドライブについて、当該合計は、実キュー管理部２０６により、注目接続ドライブに対応した実上限値以下に制限される。
【００６４】
注目ドライブに対応した実上限値７０２は、例えば、注目ドライブに対応した仮想上限値７０２を、注目ドライブが接続ドライブであるＣＴＬ６の数で割った値（例えば、小数点以下は切り捨て）でよい。実上限値７０２は、当該テーブル２２５を有するＣＴＬ６用の上限値である。
【００６５】
本実施形態において、発行されたＤｒｉｖｅ−ＩＯを受け付けたＣＴＬを「受付ＣＴＬ」と言う。ドライブにＤｒｉｖｅ−ＩＯを送信するＣＴＬを「実行ＣＴＬ」と言う。以下、受付ＣＴＬと実行ＣＴＬが同じ場合と異なる場合の各々について処理概要を説明する。
【００６６】
図８は、受付ＣＴＬと実行ＣＴＬが同じ場合についての処理流れの一例の概要を示す。なお、図８の例では、受付ＣＴＬと実行ＣＴＬもＣＴＬ６Ａ０である。また、図８の説明では、ＣＴＬ６Ａ０が有する要素の参照符号の末尾に適宜“Ａ０”が追加されている。
【００６７】
Ｓ８０１で、Ｈｏｓｔ−ＩＯ処理部２０１Ａ０は、ホスト１からＨｏｓｔ−ＩＯを受け付ける。オーナーＣＴＬ判断が行われる。具体的には、Ｈｏｓｔ−ＩＯ処理部２０１Ａ０は、オーナー権テーブル２２２Ａ０を参照し、当該Ｈｏｓｔ−ＩＯで指定されているＶＯＬ（図８の説明において「注目ＶＯＬ」）のオーナー権をＣＴＬ６Ａ０が有しているか否かを判断する。当該判断の結果が偽の場合、Ｈｏｓｔ−ＩＯ処理部２０１Ａ０は、当該Ｈｏｓｔ−ＩＯを、注目ＶＯＬのオーナー権を有するＣＴＬに転送する。当該判断の結果が真の場合、Ｈｏｓｔ−ＩＯ処理部２０１Ａ０は、Ｓ８０２を行う。
【００６８】
Ｓ８０２で、Ｈｏｓｔ−ＩＯ処理部２０１Ａ０は、当該Ｈｏｓｔ−ＩＯに基づくＤｒｉｖｅ−ＩＯを発行する。説明を簡単にするため、図８について以下の説明では一つのＤｒｉｖｅ−ＩＯに注目する。この一つのＤｒｉｖｅ−ＩＯを、図８の説明において「注目Ｄｒｉｖｅ−ＩＯ」と言い、注目Ｄｒｉｖｅ−ＩＯの発行先ドライブを「注目ドライブ」と言う。発行された注目Ｄｒｉｖｅ−ＩＯを、Ｄｒｉｖｅ−ＩＯ受付部２０２Ａ０が受け付ける。
【００６９】
Ｓ８０３で、Ｄｒｉｖｅ−ＩＯ受付部２０２Ａ０は、注目ドライブに対応した仮想キュー群２１１に空きがあるか否かを仮想キュー管理部２０３Ａ０に問い合わせる。仮想キュー管理部２０３Ａ０は、仮想キュー管理テーブル２２４Ａ０を参照し、注目ドライブに対応した仮想キュー群２１１に空きがあるか否かをＤｒｉｖｅ−ＩＯ受付部２０２Ａに回答する。注目ドライブに対応したＩＯ数６０３から得られるＤｒｉｖｅ−ＩＯ数合計が、注目ドライブに対応した仮想上限値６０２未満であれば、空きがあるということである。
【００７０】
空きがある場合、Ｓ８０４で、Ｄｒｉｖｅ−ＩＯ受付部２０２Ａ０は、仮想キュー管理部２０３Ａ０に、注目ドライブに対応した仮想キュー群２１１Ａ０からキュー資源を確保させ、確保されたキュー資源に注目Ｄｒｉｖｅ−ＩＯを蓄積させる。これにより、注目Ｄｒｉｖｅ−ＩＯの実行に関わるプロセッサコアに対応した仮想キューのＩＯ数が１増える（ＩＯ数６０３Ａ０のうち、当該コアに対応したＩＯ数が１増える）。
【００７１】
ここで、判断Ｘが実行される。具体的には、Ｄｒｉｖｅ−ＩＯ受付部２０２Ａ０は、構成テーブル２２１Ａ０を参照し、注目ドライブがＣＴＬ６Ａ０の接続ドライブか否かを判断する。ここでは当該判断の結果が真である。つまり、受付ＣＴＬも実行ＣＴＬもＣＴＬ６Ａ０である。故に、Ｓ８０５が実行される。
【００７２】
Ｓ８０５で、Ｄｒｉｖｅ−ＩＯ受付部２０２Ａ０は、注目ドライブに対応した実キュー群２１２に空きがあるか否かを実キュー管理部２０６Ａ０に問い合わせる。実キュー管理部２０６Ａ０は、実キュー管理テーブル２２５Ａ０を参照し、注目ドライブに対応した実キュー群２１２Ａ０に空きがあるか否かをＤｒｉｖｅ−ＩＯ受付部２０２Ａ０に回答する。注目ドライブに対応したＩＯ数７０３Ａ０から得られるＤｒｉｖｅ−ＩＯ数合計が、注目ドライブに対応した実上限値７０２Ａ０未満であれば、空きがあるということである。
【００７３】
空きがある場合、Ｓ８０６で、Ｄｒｉｖｅ−ＩＯ受付部２０２Ａ０は、実キュー管理部２０６Ａ０に、注目ドライブに対応した実キュー群２１２Ａ０からキュー資源を確保させ、確保されたキュー資源に例えば仮想キュー群２１１Ａ０から注目Ｄｒｉｖｅ−ＩＯを蓄積させる。これにより、注目Ｄｒｉｖｅ−ＩＯの実行に関わるプロセッサコアに対応した実キューのＩＯ数が１増える（ＩＯ数７０３Ａ０のうち、当該コアに対応したＩＯ数が１増える）。
【００７４】
Ｓ８０７で、Ｄｒｉｖｅ−ＩＯ受付部２０２Ａ０は、Ｄｒｉｖｅ−ＩＯ実行部２０７Ａ０に、注目ドライブに対応した実キュー群２１２Ａ０に蓄積された注目Ｄｒｉｖｅ−ＩＯを実行させる。これにより、Ｓ８０８で、Ｄｒｉｖｅ−ＩＯ実行部２０７Ａ０により、注目ドライブに対するＩ／Ｏが実行される。
【００７５】
Ｓ８０９で、Ｄｒｉｖｅ−ＩＯ受付部２０２Ａ０が、注目Ｄｒｉｖｅ−ＩＯの実行結果をＤｒｉｖｅ−ＩＯ実行部２０７Ａ０より受ける。
【００７６】
Ｓ８１０で、Ｄｒｉｖｅ−ＩＯ受付部２０２Ａ０が、注目Ｄｒｉｖｅ−ＩＯのキュー資源を実キュー群２１２Ａ０から解放することを実キュー管理部２０６Ａ０に実行させる。これにより、注目Ｄｒｉｖｅ−ＩＯの実行に関わるプロセッサコアに対応した実キューのＩＯ数が１減る（ＩＯ数７０３Ａ０のうち、当該コアに対応したＩＯ数が１減る）。
【００７７】
Ｓ８１１で、Ｄｒｉｖｅ−ＩＯ受付部２０２Ａ０が、注目Ｄｒｉｖｅ−ＩＯのキュー資源を仮想キュー群２１１Ａ０から解放することを仮想キュー管理部２０３Ａ０に実行させる。これにより、注目Ｄｒｉｖｅ−ＩＯの実行に関わるプロセッサコアに対応した仮想キューのＩＯ数が１減る（ＩＯ数６０３Ａ０のうち、当該コアに対応したＩＯ数が１減る）。
【００７８】
Ｓ８１２で、Ｄｒｉｖｅ−ＩＯ受付部２０２Ａ０が、注目Ｄｒｉｖｅ−ＩＯの実行結果をＨｏｓｔ−ＩＯ処理部２０１Ａ０に返す。
【００７９】
Ｓ８１３で、Ｈｏｓｔ−ＩＯ処理部２０１Ａ０が、Ｓ８０１で受け付けたＨｏｓｔ−ＩＯの応答を返す。
【００８０】
図９は、受付ＣＴＬと実行ＣＴＬが異なる場合についての処理流れの一例の概要を示す。なお、図９の例では、受付ＣＴＬがＣＴＬ６Ａ０であり実行ＣＴＬはＣＴＬ６Ｂ０である。また、図９の説明では、ＣＴＬ６Ａ０が有する要素の参照符号の末尾に適宜“Ａ０”が追加され、ＣＴＬ６Ｂ０が有する要素の参照符号の末尾に適宜“Ｂ０”が追加されている。
【００８１】
Ｓ９０１で、Ｈｏｓｔ−ＩＯ処理部２０１Ａ０は、ホスト１からＨｏｓｔ−ＩＯを受け付ける。オーナーＣＴＬ判断が行われる（詳細は説明済みのため省略する）。受け付けられたＨｏｓｔ−ＩＯで指定されているＶＯＬを、図９の説明において「注目ＶＯＬ」と言う。ここでは、注目ＶＯＬのオーナー権をＣＴＬ６Ａ０が有しているため、Ｈｏｓｔ−ＩＯ処理部２０１Ａ０は、Ｓ９０２を行う。
【００８２】
Ｓ９０２で、Ｈｏｓｔ−ＩＯ処理部２０１Ａ０は、当該Ｈｏｓｔ−ＩＯに基づくＤｒｉｖｅ−ＩＯを発行する。説明を簡単にするため、図９について以下の説明では一つのＤｒｉｖｅ−ＩＯに注目する。この一つのＤｒｉｖｅ−ＩＯを、図９の説明において「注目Ｄｒｉｖｅ−ＩＯ」と言い、注目Ｄｒｉｖｅ−ＩＯの発行先ドライブを「注目ドライブ」と言う。発行された注目Ｄｒｉｖｅ−ＩＯを、Ｄｒｉｖｅ−ＩＯ受付部２０２Ａ０が受け付ける。
【００８３】
Ｓ９０３、Ｓ９０４及び判断Ｙが行われる。Ｓ９０３、Ｓ９０４及び判断Ｙは、上述したＳ８０３、Ｓ８０４及び判断Ｘと同じである。このため、Ｓ９０５が実行される。
【００８４】
Ｓ９０５で、Ｄｒｉｖｅ−ＩＯ受付部２０２Ａ０は、注目ドライブが接続ドライブであるＣＴＬ６Ｂ０に注目Ｄｒｉｖｅ−ＩＯを転送することをＤｒｉｖｅ−ＩＯ依頼部２０４Ａ０に指示する。
【００８５】
Ｓ９０６で、Ｄｒｉｖｅ−ＩＯ依頼部２０４は、注目Ｄｒｉｖｅ−ＩＯをＣＴＬ６Ｂ０に転送する。転送された注目Ｄｒｉｖｅ−ＩＯを、ＣＴＬ６Ｂ０におけるＤｒｉｖｅ−ＩＯ請負部２０５Ｂ０が受け付ける。
【００８６】
Ｓ９０７で、Ｄｒｉｖｅ−ＩＯ請負部２０５Ｂ０が、注目ドライブに対応した実キュー群２１２に空きがあるか否かを実キュー管理部２０６Ｂ０に問い合わせる。実キュー管理部２０６Ｂ０は、実キュー管理テーブル２２５Ｂ０を参照し、注目ドライブに対応した実キュー群２１２Ｂ０に空きがあるか否かをＤｒｉｖｅ−ＩＯ請負部２０５Ｂ０に回答する。注目ドライブに対応したＩＯ数７０３Ｂ０から得られるＤｒｉｖｅ−ＩＯ数合計が、注目ドライブに対応した実上限値７０２Ｂ０未満であれば、空きがあるということである。
【００８７】
空きがある場合、Ｓ９０８で、Ｄｒｉｖｅ−ＩＯ請負部２０５Ｂ０が、請負フラグテーブル２２３Ｂ０を参照し、注目ドライブに対応した請負フラグ５０２Ｂ０を“ＯＮ”にする。Ｓ９０９で、Ｄｒｉｖｅ−ＩＯ請負部２０５Ｂ０は、実キュー管理部２０６Ｂ０に、注目ドライブに対応した実キュー群２１２Ａ０からキュー資源を確保させ、確保されたキュー資源に注目Ｄｒｉｖｅ−ＩＯを蓄積させる。これにより、注目Ｄｒｉｖｅ−ＩＯの実行に関わるプロセッサコアに対応した実キューのＩＯ数が１増える（ＩＯ数７０３Ｂ０のうち、当該コアに対応したＩＯ数が１増える）。
【００８８】
Ｓ９１０で、Ｄｒｉｖｅ−ＩＯ請負部２０５Ｂ０は、Ｄｒｉｖｅ−ＩＯ実行部２０７Ｂ０に、注目ドライブに対応した実キュー群２１２Ｂ０に蓄積された注目Ｄｒｉｖｅ−ＩＯを実行させる。これにより、Ｓ９１１で、Ｄｒｉｖｅ−ＩＯ実行部２０７Ｂ０により、注目ドライブに対するＩ／Ｏが実行される。
【００８９】
Ｓ９１２で、Ｄｒｉｖｅ−ＩＯ請負部２０５Ｂ０が、注目Ｄｒｉｖｅ−ＩＯの実行結果をＤｒｉｖｅ−ＩＯ実行部２０７Ｂ０より受ける。
【００９０】
Ｓ９１３で、Ｄｒｉｖｅ−ＩＯ請負部２０５Ｂ０が、注目Ｄｒｉｖｅ−ＩＯのキュー資源を実キュー群２１２Ｂ０から解放することを実キュー管理部２０６Ｂ０に実行させる。これにより、注目Ｄｒｉｖｅ−ＩＯの実行に関わるプロセッサコアに対応した実キューのＩＯ数が１減る（ＩＯ数７０３Ｂ０のうち、当該コアに対応したＩＯ数が１減る）。
【００９１】
Ｓ９１４で、Ｄｒｉｖｅ−ＩＯ請負部２０５Ｂ０が、注目Ｄｒｉｖｅ−ＩＯの実行結果をＤｒｉｖｅ−ＩＯ依頼部２０４Ａ０に返す。Ｓ９１５で、Ｄｒｉｖｅ−ＩＯ依頼部２０４Ａ０が、当該実行結果をＤｒｉｖｅ−ＩＯ受付部２０２Ａ０に返す。
【００９２】
Ｓ９１６で、Ｄｒｉｖｅ−ＩＯ受付部２０２Ａ０が、注目Ｄｒｉｖｅ−ＩＯのキュー資源を仮想キュー群２１１Ａ０から解放することを仮想キュー管理部２０３Ａ０に実行させる。これにより、注目Ｄｒｉｖｅ−ＩＯの実行に関わるプロセッサコアに対応した仮想キューのＩＯ数が１減る（ＩＯ数６０３Ａ０のうち、当該コアに対応したＩＯ数が１減る）。
【００９３】
Ｓ９１７で、Ｄｒｉｖｅ−ＩＯ受付部２０２Ａ０が、注目Ｄｒｉｖｅ−ＩＯの実行結果をＨｏｓｔ−ＩＯ処理部２０１Ａ０に返す。
【００９４】
Ｓ９１８で、Ｈｏｓｔ−ＩＯ処理部２０１Ａ０が、Ｓ９０１で受け付けたＨｏｓｔ−ＩＯの応答を返す。
【００９５】
図９の例によれば、実行ＣＴＬ６Ｂ０では、注目Ｄｒｉｖｅ−ＩＯが仮想キュー群２１１Ｂ０に蓄積されること無しに実キュー群２１２Ｂ０に蓄積されるが、それに代えて、注目Ｄｒｉｖｅ−ＩＯが仮想キュー群２１１Ｂ０に蓄積され、その後に、仮想キュー群２１１Ｂ０から実キュー群２１２Ｂ０に注目Ｄｒｉｖｅ−ＩＯが蓄積されてもよい。
【００９６】
図１０は、受付ＣＴＬと実行ＣＴＬが異なるが故にＤｒｉｖｅ−ＩＯのＣＴＬ間転送が生じた場合に行われる仮想上限値の制限とその解除の一例を示す。図１０では、一つのドライブに注目する。このドライブを、図１０の説明において「注目ドライブ」と言う。また、注目ドライブに対するＤｒｉｖｅ−ＩＯを、図１０の説明において「注目Ｄｒｉｖｅ−ＩＯ」と言う。
【００９７】
注目ドライブ１０００の仮想上限値５０２のデフォルト値は、いずれのＣＴＬ６においても、注目ドライブ１０００のハード仕様に従う上限値であるとする。言い換えれば、注目ドライブ１０００の仮想上限値５０２は、注目ドライブ１０００が接続ドライブである全てのＣＴＬ６における全ての実上限値６０２の合計であるとする。
【００９８】
受付ＣＴＬ６Ａ０に注目ドライブ１０００が物理的に接続されておらず、注目ドライブ１０００に物理的に接続されているＣＴＬがＣＴＬ６Ｂ０であるが故に、一点鎖線で示すように、受付ＣＴＬ６Ａ０から注目Ｄｒｉｖｅ−ＩＯが実行ＣＴＬ６Ｂに転送されたとする。
【００９９】
この場合、矢印１０１０で示すように、Ｄｒｉｖｅ−ＩＯ請負部２０５Ｂ０が、注目ドライブ１０００に対応した請負フラグ５０２Ｂ０を“ＯＮ”にする。仮想キュー管理部２０３Ｂ０が、請負フラグ５０２Ｂ０“ＯＮ”の注目ドライブ１０００に対応した仮想上限値６０２Ｂ０を下げる。例えば、仮想キュー管理部２０３Ｂ０は、仮想上限値６０２Ｂ０をデフォルト値から、ＣＴＬ６Ｂ０が有するプロセッサコアの数に下げる。ＣＴＬ６Ｂ０内の各プロセッサコアについて少なくとも一つの要求を蓄積することができるようにするためである。
【０１００】
各ＣＴＬ６において仮想キュー管理部２０３により調整処理が周期的に走る。「調整処理」とは、仮想上限値６０２を調整する処理、具体的には、例えば、仮想上限値６０２をデフォルト値に戻す（リセットする）処理である。例えばＣＬＴ６Ｂ０において調整処理が走ると、仮想キュー管理部２０３Ｂ０が、矢印１０２０で示すように、請負フラグ５０２Ｂ０“ＯＮ”の注目ドライブ１０００に対応した仮想上限値６０２Ｂ０をデフォルト値に戻し、且つ、当該請負フラグ５０２Ｂ０を“ＯＦＦ”にする。
【０１０１】
図１１は、請負フラグと周期的に行われる調整処理との関係の一例を示す。
【０１０２】
周期Ｔで調整処理が走る。或る期間Ｔ内で一旦“ＯＮ”にされた請負フラグ５０２は、次の期間Ｔの開始まで（次に調整処理が走るまで）、“ＯＮ”のままである。次の期間Ｔの開始において、請負フラグ５０２は“ＯＮ”から“ＯＦＦ”に戻される。
【０１０３】
図１２は、調整処理のフローの一例を示す。一つのＣＴＬ６での調整処理を例に取る（図１２の説明において「注目ＣＴＬ６」）。
【０１０４】
Ｓ１２０１で、仮想キュー管理部２０３は、調整処理は、注目ＣＴＬ６に物理的に接続されている全てのドライブボックス９のうち調整処理が未だされていないドライブボックス９（未処理ボックス９）があるか否かを判断する。ドライブボックス９とドライブの関係は、構成テーブル２２１に記述されていて、構成テーブル２２１を基に、Ｓ１２０１の判断が実行されてよい。ここでは、例えば、処理対象として設定されているボックス＃（ドライブボックス９の識別番号）が末尾のボックス＃に達していなければ、未処理ボックス９は少なくとも一つ存在する。処理対象として設定されているボックス＃のドライブボックス９が、対象の未処理ボックス９である。Ｓ１２０１の判断結果が偽の場合、調整処理が終了する。
【０１０５】
Ｓ１２０１の判断結果が真の場合、Ｓ１２０２で、仮想キュー管理部２０３は、現時点が周期の開始から終了までの期間内か否かを判断する。Ｓ１２０２の判断結果が偽の場合、調整処理が終了する。
【０１０６】
Ｓ１２０２の判断結果が真の場合、Ｓ１２０３で、仮想キュー管理部２０３は、対象の未処理ボックス９のうち調整処理が未だされていないドライブ（未処理ドライブ）があるか否かを判断する。ここでは、例えば、処理対象として設定されているドライブ＃が対象の未処理ボックス９について末尾のドライブ＃に達していなければ、未処理ドライブは少なくとも一つ存在する。処理対象として設定されているドライブ＃のドライブが、対象の未処理ドライブである。Ｓ１２０３の判断結果が偽の場合、Ｓ１２０９で、仮想キュー管理部２０３は、ボックス＃を１インクリメントする。
【０１０７】
Ｓ１２０３の判断結果が真の場合、Ｓ１２０４で、仮想キュー管理部２０３は、対象の未処理ドライブに対応した請負フラグ５０２が“ＯＮ”か否かを判断する。
【０１０８】
Ｓ１２０４の判断結果が真の場合、Ｓ１２０５で、仮想キュー管理部２０３は、対象の未処理ドライブに対応した仮想上限値６０２を制限する（具体的には下げる）。Ｓ１２０６で、仮想キュー管理部２０３は、対象の未処理ドライブに対応した請負フラグ５０２を“ＯＦＦ”に戻す。
【０１０９】
一方、Ｓ１２０４の判断結果が偽の場合、Ｓ１２０７で、仮想キュー管理部２０３は、対象の未処理ドライブに対応した仮想上限値６０２の制限を解除する（具体的にはデフォルト値に戻す）。
【０１１０】
Ｓ１２０６又はＳ１２０７の後、Ｓ１２０８で、仮想キュー管理部２０３は、処理対象として設定されているドライブ＃を１インクリメントする。その後、Ｓ１２０３が行われる。
【０１１１】
以上が、本実施形態の説明である。以上の説明を、例えば下記のように総括することができる。
【０１１２】
ホスト１に論理ボリュームを提供する分散ストレージシステム１００が、複数のドライブが関連付けられた複数のノード１０を有する。各ノード１０は、一つ以上のＣＴＬ６を有する。各ＣＴＬ６にとって、当該ＣＴＬ６に物理的に接続されているドライブである接続ドライブがある。各ＣＴＬ６は、ホスト１から送信されたＨｏｓｔ−ＩＯを当該ホスト１又は別のＣＴＬ６から受け付けた場合、当該受け付けたＨｏｓｔ−ＩＯに基づくＤｒｉｖｅ−ＩＯを発行するようになっている。各ＣＴＬ６は、当該ＣＴＬ６の接続ドライブ毎に実キュー群２１２を有することに加えて、分散ストレージシステム１００における各ドライブについて仮想キュー群２１１を有する。各実キューは、ドライブに送信されるＤｒｉｖｅ−ＩＯが蓄積されるキューである。各仮想キューは、受け付けられたＤｒｉｖｅ−ＩＯが蓄積されるキューである。いずれかのＣＴＬ６により受け付けられたＤｒｉｖｅ−ＩＯである対象Ｄｒｉｖｅ−ＩＯは、当該対象Ｄｒｉｖｅ−ＩＯの発行先ドライブに対応した実キュー群２１２に蓄積される前に、発行先ドライブに対応した仮想キュー群２１１に蓄積される。結果として、分散ストレージシステム１００のＩ／Ｏ性能の向上が期待される。当該実キュー群２１２に対応した後述の実上限値が小さいとしてもまず発行先ドライブに対応した仮想キュー群２１１に蓄積がされるからであり、故に、上述した第１及び第２の問題のいずれの問題の解決も期待されるからである。
【０１１３】
各ＣＴＬ６には、各ドライブについて、当該ドライブに対応した仮想キュー群２１１に蓄積可能なＤｒｉｖｅ−ＩＯの数の上限である仮想上限値６０２と、当該ＣＴＬ６の各接続ドライブについて、当該接続ドライブに対応した実キュー群２１２に蓄積可能なＤｒｉｖｅ−ＩＯの数の上限である実上限値７０２とが設定されている。仮想キュー群２１１と実キュー群２１２とでＤｒｉｖｅ−ＩＯの数の上限値が独立している。このため、ドライブに対応した実上限値７０２が小さくても当該ドライブに対応した仮想キュー群２１１にＤｒｉｖｅ−ＩＯを蓄積することが期待できる。
【０１１４】
各ＣＴＬ６において、各ドライブに関し、当該ドライブに対応した仮想上限値６０２は、当該ドライブが接続ドライブであるＣＴＬ６に設定される実上限値７０２と同じ又はそれよりも大きい値である。このため、ドライブに対応した実上限値７０２が小さくても当該ドライブに対応した仮想キュー群２１１にＤｒｉｖｅ−ＩＯを蓄積することが期待できる。
【０１１５】
各ＣＴＬ６において、各ドライブに関し、当該ドライブに対応した仮想上限値６０２は、当該ドライブのハード仕様に従う上限値に基づく値であり、当該ドライブを接続ドライブとしたＣＴＬ６に設定される実上限値７０２は、当該ドライブのハード仕様に従う上限値に基づく値を、当該ドライブが接続ドライブであるＣＴＬ６の数で割った値である。このように、各ＣＴＬ６に、当該ＣＴＬ６に適した実上限値７０２と、分散ストレージシステム１００全体において適切か仮想上限値６０２の設定が可能である。
【０１１６】
複数のノード１０における複数のＣＴＬ６の少なくとも一つには、当該ＣＴＬ６に物理的に接続されていないドライブである非接続ドライブがある。上記対象Ｄｒｉｖｅ−ＩＯが受け付けられた受付ＣＴＬ６と、発行先ドライブが接続ドライブである実行ＣＴＬ６とが異なっている場合、対象Ｄｒｉｖｅ−ＩＯは、受付ＣＴＬ６における複数の仮想キュー群２１１のうち発行先ドライブに対応した仮想キュー群２１１から受付ＣＴＬ６により取得され、受付ＣＴＬ６から実行ＣＴＬ６に転送され、実行ＣＴＬ６における複数の実キュー群２１２のうち発行先ドライブに対応した実キュー群２１２に、実行ＣＴＬ６により蓄積される。なお、発行先ドライブに対応した実キュー群２１２が実行ＣＴＬ６において満杯の場合、実行ＣＴＬ６が受付ＣＴＬ６に所定の応答（例えば、リトライを要求した応答）を返し、受付ＣＴＬ６が、当該所定の応答を受けた場合に対象Ｄｒｉｖｅ−ＩＯを実行ＣＴＬ６に再度転送してよい。
【０１１７】
実行ＣＴＬ６は、対象Ｄｒｉｖｅ−ＩＯを受付ＣＴＬ６から受け付けた場合、実行ＣＴＬ６における複数の仮想上限値のうち、発行先ドライブに対応した仮想上限値を下げる。これにより、実行ＣＴＬ６において仮想キュー群２１１から実キュー群２１２にＤｒｉｖｅ−ＩＯを蓄積できくなる可能性を低減できる。
【０１１８】
各ＣＴＬ６は、複数のプロセッサコアを有する。各ＣＴＬ６において、当該ＣＴＬ６におけるプロセッサコア毎に仮想キュー及び実キューの各々が備えられる。実行ＣＴＬ６において発行先ドライブに対応した仮想上限値６０２のデフォルト値は、発行先ドライブのハード仕様に従う上限値に基づく値である。受付ＣＴＬ６と実行ＣＴＬ６とが異なっている場合、実行ＣＴＬ６において発行先ドライブに対応した仮想上限値６０２は、実行ＣＴＬ６が有するプロセッサコア数と同じ値に下げられる。
【０１１９】
実行ＣＴＬ６は、周期的に、当該実行ＣＴＬ６においてデフォルト値と異なる値になっている仮想上限値があれば当該仮想上限値をデフォルト値に戻す。
【０１２０】
複数のノード１０の各々が、二つ以上のＣＴＬ６を有する。例えば、複数のノード１０は、複数のノード群を有する。複数のノード群の各々は、冗長化されたノード１０である。各ノード１０において、二つ以上のＣＴＬ６は、冗長化されたＣＴＬ６である。
【０１２１】
各ＣＴＬ６は、当該ＣＴＬ６に設定されている複数の仮想上限値の各々を動的に調整する。例えば、各ＣＴＬ６は、当該ＣＴＬ６に設定されている複数の仮想上限値６０２の各々を、当該仮想上限値６０２に対応したドライブに対するＤｒｉｖｅ−ＩＯの実行状況に応じて調整する。
【０１２２】
各ＣＴＬ６は、当該ＣＴＬ６に設定されている複数の仮想上限値６０２の各々を周期的に調整する。例えば、各ＣＴＬ６は、周期的に、当該ＣＴＬ６においてデフォルト値と異なる値になっている仮想上限値があれば当該仮想上限値をデフォルト値に戻す。
【０１２３】
以上、一実施形態を説明したが、これは本発明の説明のための例示であって、本発明の範囲をこの実施形態にのみ限定する趣旨ではない。本発明は、他の種々の形態でも実行することが可能である。
【符号の説明】
【０１２４】
１００：分散ストレージシステム
【図１】
2020135155.tif 000003
【図２】
2020135155.tif 000004
【図３】
2020135155.tif 000005
【図４】
2020135155.tif 000006
【図５】
2020135155.tif 000007
【図６】
2020135155.tif 000008
【図７】
2020135155.tif 000009
【図８】
2020135155.tif 000010
【図９】
2020135155.tif 000011
【図１０】
2020135155.tif 000012
【図１１】
2020135155.tif 000013
【図１２】
2020135155.tif 000014