以下、実施形態について、図面を参照しながら詳細に説明する。具体的には、まず、図1を参照して第1実施形態によるストレージコントローラ選択方法の概要を説明する。次に、図2〜5を参照して、システム構成について説明する。その後、図6〜9を参照して、ストレージコントローラの内部処理時間の例をいくつか説明する。さらに、図10〜15を参照して、第1実施形態で行われる処理と、各種データについて説明する。その後、図16〜19を参照して第2実施形態について説明する。最後に、その他の変形例についても説明する。
さて、図1は、ストレージコントローラ選択方法のフローチャートである。図1の方法は、第1の数の論理ユニットと第2の数のストレージコントローラを含むストレージシステムにおいて、新規論理ボリュームを作成する際に、新規論理ボリュームを管理するストレージコントローラを選択するための方法である。第1の数は2以上であり、第2の数も2以上である。第1の数と第2の数は、等しくてもよいし、異なっていてもよい。
第1の数の論理ユニットの各々は、1つ以上の物理的記憶装置の集まりである。換言すれば、1つの論理ユニットは、1つ以上の物理的記憶装置により実現される。各論理ユニットは、1つのLUN(Logical Unit Number)により識別されてもよい。
物理的記憶装置は、具体的にはランダムアクセス式の記憶装置である。物理的記憶装置は、例えばHDD(Hard Disk Drive)でもよいし、SSD(Solid-State Drive)でもよい。以下では説明の簡単化のため、物理的記憶装置がHDDであるものとする。
図1の方法は、例えば、作成要求受信部と時間記憶部と選択部を有するストレージコントローラ選択システムにおいて実行される。作成要求受信部と選択部は、具体的には、プログラムを実行するコンピュータにより実現されてもよい。
ストレージコントローラ選択システムは、ストレージコントローラの1つとハードウェアを共有していてもよい。具体的には、例えば、作成要求受信部と選択部は、第2の数のストレージコントローラのうちの1つに含まれていてもよい。例えば、後述の図5の例では、作成要求受信部308と選択部309がストレージコントローラ120aに含まれており、時間記憶部の一例としての共有ディスク170が、ストレージコントローラ120aとネットワーク130を介して接続される。
このように、作成要求受信部と選択部がストレージコントローラに含まれる場合は、当該ストレージコントローラが、図1の方法を実行する。より詳しくは、ある1つのストレージコントローラ内のコンピュータ(つまり当該ストレージコントローラ内のプロセッサ)が、図1の方法を実行してもよい。
具体的には、ステップS1で作成要求受信部が、新規論理ボリュームの作成を求める作成要求を受信する。作成要求は、例えば、端末の入力装置を介したユーザからの入力に応じて、端末から作成要求受信部へと送信されてもよい。
第1実施形態における各論理ボリュームは、第1の数の論理ユニットのうちの2つ以上に断片化された(fragmented)ボリュームである。換言すれば、各論理ボリュームは、2つ以上の論理ユニットに分散している。また、上記第2の数のストレージコントローラの各々は、1つ以上の論理ボリュームを管理する。
上記のとおりステップS1で作成要求が受信されると、次に、ステップS2では、選択部が、新規論理ボリュームを管理するためのストレージコントローラを選択する。つまり、選択部は、「新規論理ボリュームに対する入出力要求を、どのストレージコントローラが仲介する(interface)のか」を決定する。なお、以下では「入出力要求」(input-output request)を「I/O要求」と略す。
具体的には、選択部は、時間記憶部に記憶された時間情報に基づいて、第2の数のストレージコントローラのうちで内部処理時間が相対的に短いストレージコントローラを選択する。例えば、選択部は、I/O要求1件あたりの内部処理時間が最短のストレージコントローラを選択することが好ましい。しかし、選択部は、例えば、内部処理時間が2番目に短いストレージコントローラを選択してもよい。
また、選択部は、時間情報と適宜の閾値の双方に基づいてストレージコントローラを選択してもよい。例えば、適宜の閾値X1が決められている場合、選択部は、内部処理時間が短い方からX1番目以内の任意のストレージコントローラを選択してもよい。同様に、適宜の閾値X2が決められている場合、選択部は、内部処理時間が短い方からX2%以内の任意のストレージコントローラを選択してもよい。また、適宜の閾値X3が決められている場合、選択部は、内部処理時間がX3以下の任意のストレージコントローラを選択してもよい。
内部処理時間の詳細については、図6〜9とともに後述するが、概要を説明すれば以下のとおりである。
あるストレージコントローラが、当該ストレージコントローラの管理する1つ以上の論理ボリュームのうちの1つの論理ボリュームに対するI/O要求を受信する時点を、「要求受信時点」ということにする。当該ストレージコントローラは、受信した当該I/O要求に応じて、当該1つの論理ボリュームが断片化されている先の2つ以上の論理ユニットのうちの少なくとも1つの論理ユニットにアクセスする。
例えば、4つの論理ユニットに断片化されている論理ボリュームに対するI/O要求を受信すると、当該ストレージコントローラは、4つの論理ユニットのうちの1つにだけアクセスする場合もあり得る。I/O要求の内容によっては、当該ストレージコントローラは、4つの論理ユニットのうちの2つにアクセスする場合もあり得るし、3つにアクセスする場合もあり得るし、4つにアクセスする場合もあり得る。
いずれにせよ、当該ストレージコントローラは、論理ボリュームが断片化されている先の2つ以上の論理ユニットのうちの少なくとも1つの論理ユニットにアクセスする。そして、当該ストレージコントローラは、当該少なくとも1つの論理ユニットへのアクセスの結果にしたがって、I/O要求に対する応答を送信する。こうして当該ストレージコントローラが応答を送信する時点を、「応答送信時点」ということにする。
内部処理時間は、要求受信時点から応答送信時点までの時間のうち、当該ストレージコントローラの内部での処理にかかる時間である。換言すれば、内部処理時間は、当該ストレージコントローラの内部での処理に起因する遅延時間である。
より詳しくは、内部処理時間は、要求受信時点から応答送信時点までの時間から、上記少なくとも1つの論理ユニットへのアクセスの結果の受信を待つ時間を、除外した時間であってもよい。なぜなら、待ち時間はストレージコントローラの性能とは無関係だからである。
他方、内部処理時間は、I/O要求がストレージコントローラ内でキューイングされている(queued)時間を含んでいてもよい。なぜなら、I/O要求がキューイングされている時間は、(ストレージコントローラの性能以外の要因の影響も受けるものの)ストレージコントローラの性能(例えば、ストレージコントローラ内のプロセッサのクロック周波数など)に影響されるからである。
時間記憶部は、具体的には、第2の数のストレージコントローラの各々について、内部処理時間を示す時間情報を記憶する。よって、ステップS2で選択部は、時間記憶部に記憶された時間情報に基づいて、内部処理時間が相対的に短いストレージコントローラを選択することができる。
時間情報は、1つのI/O要求に対応する内部処理時間そのものを示す情報であってもよい。しかし、時間情報は、過去のある期間内に生じた複数のI/O要求それぞれに対応する内部処理時間から得られる統計量(statistic)であることが好ましい。統計量の一例は、算術平均であり、統計量の他の例は、I/O要求の受信時刻に応じた重みによる重み付け平均である。
例えば、各ストレージコントローラは、当該ストレージコントローラが受信する複数のI/O要求の各々について、当該I/O要求に応じてかかる内部処理時間を計測してもよい。そして、各ストレージコントローラは、当該ストレージコントローラに関して時間記憶部に記憶されている時間情報を、計測した内部処理時間に基づいて更新してもよい。
この場合、時間記憶部は、第2の数のストレージコントローラとネットワークを介して接続されていてもよい。また、この場合、統計量としての時間情報を、I/O要求の発生のたびに更新することが可能である。つまり、この場合、内部処理時間の実測値の変動に時間情報を追従させることが可能である。したがって、実測値の変動を反映した時間情報に基づいて、ステップS2では、より適切なストレージコントローラが選択される。
さて、次のステップS3で選択部は、選択したストレージコントローラに、新規論理ボリューム(つまり、第1の数の論理ユニットのうちの2つ以上に断片化した新たなボリューム)を作成するよう命令する。すると、図1の処理は終了する。
なお、詳細は後述するが、ストレージコントローラに関する冗長構成が採用されてもよい。つまり、ステップS2で選択されるストレージコントローラは、具体的にはアクティブ・ストレージコントローラであってもよく、選択部は、さらに、スタンバイ・ストレージコントローラを選択してもよい。
スタンバイ・ストレージコントローラは、ステップS2で選択されたアクティブ・ストレージコントローラが将来故障した場合に、アクティブ・ストレージコントローラの故障に応じて、アクティブ・ストレージコントローラ代わって、論理ボリュームを管理する。選択部は、1台以上の適宜の台数のスタンバイ・ストレージコントローラを選択してもよい。選択部は、スタンバイ・ストレージコントローラも時間情報に基づいて選択してもよいし、ランダムにスタンバイ・ストレージコントローラを選択してもよい。
以上説明した図1のストレージコントローラ選択方法によれば、好ましい入出力性能が得られるように、適切なストレージコントローラが選択される。その理由を以下に説明する。
上記のとおり各論理ボリュームは、2つ以上の論理ユニットに断片化されている。そして、各論理ユニットは、1つ以上の物理的記憶装置の集まりである。したがって、ストレージシステムは複数の物理的記憶装置を含む。しかし、それらの複数の物理的記憶装置のハードウェア性能は同じとは限らない。また、ストレージコントローラ同士でも、ハードウェア性能が同じとは限らない。
例えば、物理的記憶装置のハードウェア性能は、以下のような項目により表される。
・シークタイム(例えば、平均シークタイム、最小シークタイム、最大シークタイムなど)
・ディスクの回転速度
・データ転送速度
・キャッシュメモリの容量
また、ストレージコントローラのハードウェア性能は、例えば、以下のような項目により表される。
・ストレージコントローラに含まれる、CPU(Central Processing Unit)等のプロセッサの数
・各プロセッサのクロック周波数
・各プロセッサに含まれるコアの数
・各プロセッサ内のキャッシュメモリの容量
・ストレージコントローラに含まれる、DRAM(Dynamic Random Access Memory)等のメモリの容量
・ストレージコントローラ内のDRAM等のメモリのアクセス速度
ここで、仮に、ある論理ボリュームが断片化される先の論理ユニットが、いずれも、ハードウェア性能の低い物理的記憶装置により実現されているものとする。この場合、当該論理ボリュームに対するI/O要求に関するI/O性能は低い。逆に、ある論理ボリュームの断片化される先の論理ユニットが、いずれも、ハードウェア性能の高い物理的記憶装置により実現されている場合、当該論理ボリュームに対するI/O要求に関するI/O性能は高い。
なお、あるI/O要求に関するI/O性能は、具体的には、例えばレイテンシにより測られる性能であってもよい。レイテンシが短いほど、I/O性能は高い。
さて、上記のように、物理的記憶装置のハードウェア性能の差は、I/O性能の差を招く可能性がある。しかし、この可能性は、論理ボリュームと論理ユニットを適切に対応づけることによって、ある程度軽減することが可能である。
なぜなら、上記のとおり個々の論理ボリュームは2つ以上の論理ユニットに断片化されるからである。したがって、「1つの論理ボリュームを、何個の、どの論理ユニットに断片化するか」を適切に決めることにより、物理的記憶装置のハードウェア性能の差をある程度吸収することが可能となる。その結果、論理ボリューム間でI/O性能をある程度平準化することが可能となる。
ところが、以上のようにして物理的記憶装置のハードウェア性能の差を吸収するだけでは、I/O性能が十分に平準化されるとは限らない。なぜなら、第1に、論理ボリューム間でI/O要求の量に差があり得るからである。そして、第2に、上記のとおり、ストレージコントローラ間にはハードウェア性能の差があり得るからである。
上記のとおり各ストレージコントローラは、1つ以上の論理ボリュームを管理する。しかし、各論理ボリュームに対するI/O要求の量は、異なり得る。I/O要求の量は、例えば、単位時間あたりのI/O要求の数、I/O要求に応じて転送されるデータの単位時間あたりの量、などによって測られてもよい。いずれにしろ、論理ボリュームごとにI/O要求の量が異なり得る。複数の論理ボリュームそれぞれの用途によっては、論理ボリュームごとにI/O要求の量が大幅に異なる場合もあり得る。
ある論理ボリュームに対するI/O要求が非常に多ければ、当該論理ボリュームを管理するストレージコントローラの負荷も高まり、当該論理ボリュームが断片化された先の論理ユニットを実現する物理的記憶装置の負荷も高まる。そして、そのような負荷の上昇が原因で、当該論理ボリュームに対するI/O要求に関するI/O性能は悪化する。他方、ある論理ボリュームに対するI/O要求が非常に少なければ、当該論理ボリュームに対するI/O要求に関するI/O性能は、負荷による悪影響をあまり受けない。
別の観点から述べれば、I/O要求の多い論理ボリュームを管理するストレージコントローラの負荷は高い。逆に、I/O要求の少ない論理ボリュームしか管理しないストレージコントローラの負荷は低い。つまり、ストレージコントローラの負荷は、ストレージコントローラが管理する(換言すれば、担当する)論理ボリュームの数だけに依存するのではなく、各論理ボリュームに対するI/O要求の量にも依存する。
しかも、ストレージコントローラの負荷は、単にI/O要求の量の影響を受けるだけではない。I/O要求の量自体が同じであっても、ハードウェア性能の低いストレージコントローラにとっての負荷は、ハードウェア性能が高いストレージコントローラにとっての負荷よりも、相対的に高い。
そして、負荷の高いストレージコントローラによって処理されるI/O要求に関するI/O性能は、負荷の低いストレージコントローラによって処理されるI/O要求に関するI/O性能よりも低い。例えば、ストレージコントローラが高負荷であるほど、レイテンシは長くなりがちである。
したがって、仮に、I/O要求の量が論理ボリューム間で平準化され得るとしても、ストレージコントローラ間のハードウェア性能の差に起因するI/O性能の偏り(imbalance)は、依然として残り得る。
例えば、仮に、次のような場合を想定する。
・I/O要求の量が、論理ボリューム間で平準化されている。
・各ストレージコントローラが、それぞれ同じ個数の論理ボリュームを管理する。
このような場合であっても、ハードウェア性能の低いストレージコントローラの負荷は、ハードウェア性能の高いストレージコントローラの負荷よりも高い。したがって、ハードウェア性能の低いストレージコントローラが管理する論理ボリュームに対するI/O要求に関するI/O性能は、ハードウェア性能の高いストレージコントローラが管理する論理ボリュームに対するI/O要求に関するI/O性能よりも低い。
つまり、ある論理ボリュームを管理するストレージコントローラのハードウェア性能が低い場合、当該論理ボリュームに対するI/O要求に関しては、I/O性能が低い。なぜなら、ストレージコントローラのハードウェア性能の低さがボトルネックになるからである。逆に、ある論理ボリュームを管理するストレージコントローラのハードウェア性能が高ければ、当該論理ボリュームに対するI/O要求に関しては、I/O性能が高い。
以上から理解されるように、I/O性能の平準化のためには、ストレージコントローラ間のハードウェア性能の差を考慮することが望ましい。そして、ストレージコントローラのハードウェア性能は、具体的には、ストレージコントローラの内部処理時間に反映される。
したがって、図1のように内部処理時間が相対的に短いストレージコントローラを選ぶ方法によれば、ハードウェア性能に応じた負荷が相対的に低いストレージコントローラが選ばれる。その結果、新規論理ボリュームの追加に起因するI/O性能の偏りは、小さく抑えられる。より詳しく説明すると、以下のとおりである。
既に1つ以上の論理ボリュームを管理しているストレージコントローラが、さらに新規論理ボリュームを管理するために選ばれると、当該ストレージコントローラの負荷は増える。よって、新規論理ボリュームの追加に起因するI/O性能の偏りを小さく抑えるためには、全ストレージコントローラの中で相対的に低負荷のストレージコントローラを、新規論理ボリュームを管理するストレージコントローラとして選択することが望ましい。
ここで、ストレージコントローラのハードウェア性能に応じた負荷が低いほど、内部処理時間が短い。よって、ステップS2のように内部処理時間が相対的に短いストレージコントローラを選択することは、相対的に低負荷のストレージコントローラ(つまり、偏りの少ない好適なI/O性能を得るのに適切なストレージコントローラ)を選択することを意味する。
よって、図1のストレージコントローラ選択方法によれば、ストレージコントローラのハードウェア性能の差を考慮することで、I/O性能が一層平準化される。I/O性能の平準化は、複数の論理ユニットと複数のストレージコントローラを含むストレージシステムにとって好ましい特徴である。
続いて、図2〜5を参照して、第1実施形態のシステム構成について説明する。図2は、ストレージシステムでの新規論理ボリュームの追加について説明する図である。
図2の仮想ストレージシステム100は、1つ以上のストレージと複数のストレージコントローラを含む。各ストレージは、1つ以上の論理ユニットを含む。具体的には、図2には、仮想ストレージシステム100が3つのストレージ110a〜110cと3つのストレージコントローラ120a〜120cを含む場合が例示されている。
ストレージ110a〜110cとストレージコントローラ120a〜120cは、ネットワーク130に接続されている。したがって、仮想ストレージシステム100中の任意のストレージと、仮想ストレージシステム100中の任意のストレージコントローラは、ネットワーク130を介して通信することが可能である。ネットワーク130は、例えば、イーサネット(登録商標)ベースのLAN(Local Area Network)でもよいし、ファイバチャネルベースのネットワークでもよい。
図2の例では、ストレージ110aが3つの論理ユニット111a、112a、および113aを提供する。紙幅の都合上、図2では、「論理ユニット(logical unit)」が「LU」と略されている。より具体的には、ストレージ110aは、以下のコンポーネントを含む。
・論理ユニット111a〜113aを実現するための、何台かの物理的記憶装置(例えば何台かのHDD)
・それら何台かの物理的記憶装置とネットワーク130との間の通信のための、通信インタフェイス(例えば、ネットワーク130がLANの場合は、「PHYチップ」および「MAC(Media Access Control)チップ」と呼ばれる回路を含む通信回路)
・筐体(エンクロージャ)
ストレージ110aに含まれる各HDDは、RAID(Redundant Array of Independent Disks)構成のものでもよいし、非RAID構成の単純なHDDであってもよい。HDDの代わりにSSDが物理的記憶装置として利用されてもよいし、1つのストレージの中にHDDとSSDの双方が含まれていてもよい。
また、図2の例では、ストレージ110bが3つの論理ユニット111b、112b、および113bを提供する。ストレージ110bも、何台かの物理的記憶装置と、通信インタフェイスと、筐体を含む。
また、図2の例では、ストレージ110cが3つの論理ユニット111c、112c、および113cを提供する。ストレージ110cも、何台かの物理的記憶装置と、通信インタフェイスと、筐体を含む。
なお、図2の例では、ストレージ110a〜110cがそれぞれ提供する論理ユニットの数が等しい。しかし、各ストレージが提供する論理ユニットの数は、互いに異なっていてもよい。
ストレージコントローラ120a〜120cは、ネットワーク130だけでなく、ネットワーク140にも接続される。ネットワーク140は、イーサネット(登録商標)ベースのLAN(Local Area Network)でもよいし、ファイバチャネルベースのネットワークでもよい。
そして、ネットワーク140には、1台以上のコンピュータが接続される。図2には、具体的には、コンピュータの例として、サーバ150aが例示されているが、ワークステーションやPC(Personal Computer)などのコンピュータがネットワーク140に接続されてもよい。
サーバ150aの用途は任意である。サーバ150aは、例えば、企業内またはデータセンタで使われる業務サーバ(business server)であってもよい。
図2に示すように、サーバ150aにはマルチパスドライバ151aが実装される。マルチパスドライバ151aは、ストレージコントローラを介してストレージ内の記憶領域にアクセスするためのデバイスドライバである。サーバ150aのOS(Operating System)およびマルチパスドライバ151aは、ストレージ内の論理ユニットを直接認識するのではなく、ストレージコントローラにより管理される論理ボリュームを、ブロックデバイスとして認識する。
図2では、理解の助けとするために、便宜上、各ストレージコントローラが管理する1つ以上の論理ボリュームを、当該ストレージコントローラの中に図示してある。しかし、上記のとおり、各論理ボリュームの実体は、2つ以上の論理ユニットに断片化された記憶領域の集まりである。なお、紙幅の都合上、図2では、「論理ボリューム(logical volume)」が「LV」と略されている。
図2の例では、ストレージコントローラ120aが2つの論理ボリューム121aと122aを管理し、ストレージコントローラ120bが2つの論理ボリューム121bと122bを管理する。また、ストレージコントローラ120cは1つの論理ボリューム121cを管理する。
さらに、図2に破線で描かれているように、新たに論理ボリューム122cが作成されるときには、論理ボリューム122cを管理するためのストレージコントローラとして、ストレージコントローラ120cが選ばれてもよい。つまり、論理ボリューム122cを作成するための作成要求に応じて、図1のステップS2でストレージコントローラ120cが選ばれてもよく、ストレージコントローラ120cが、ステップS3の命令に応じて、論理ボリューム122cを作成してもよい。
なお、ある論理ボリュームを管理するストレージコントローラとは、換言すれば、当該論理ボリュームを担当するストレージコントローラのことである。ある論理ボリュームを管理するストレージコントローラは、当該論理ボリュームに対するI/O要求(換言すればアクセス要求)の受信に応じて、当該論理ボリュームが断片化された先の2つ以上の論理ユニットのうちの少なくとも1つにアクセスする。そして、当該ストレージコントローラは、アクセス結果に基づく応答を返す。
さて、図2において、各論理ボリュームからストレージへの矢印は、「論理ボリュームが断片化される先の論理ユニットが、どのストレージに含まれるか」ということを示す。換言すれば、論理ボリュームからストレージへの矢印は、「当該論理ボリュームに対するI/O要求をストレージコントローラが受信したときに、ストレージコントローラがどのストレージにI/O要求を送信するのか」ということを示す。具体的には、以下のとおりである。
論理ボリューム121aからストレージ110aと110bへの矢印は、論理ボリューム121aが、ストレージ110a内の1つ以上の論理ユニットと、ストレージ110b内の1つ以上の論理ユニットに断片化されていることを示す。よって、ストレージコントローラ120aは、論理ボリューム121aに対するI/O要求をサーバ150aのマルチパスドライバ151aから受信すると、ストレージ110aと110bの一方または双方にI/O要求を送信する。また、論理ボリューム122aからストレージ110aと110cへの矢印は、論理ボリューム122aが、ストレージ110a内の1つ以上の論理ユニットと、ストレージ110c内の1つ以上の論理ユニットに断片化されていることを示す。
論理ボリューム121bからストレージ110aと110bへの矢印は、論理ボリューム121bが、ストレージ110a内の1つ以上の論理ユニットと、ストレージ110b内の1つ以上の論理ユニットに断片化されていることを示す。また、論理ボリューム122bからストレージ110bと110cへの矢印は、論理ボリューム122bが、ストレージ110b内の1つ以上の論理ユニットと、ストレージ110c内の1つ以上の論理ユニットに断片化されていることを示す。
論理ボリューム121cからストレージ110aと110bへの矢印は、論理ボリューム121cが、ストレージ110a内の1つ以上の論理ユニットと、ストレージ110b内の1つ以上の論理ユニットに断片化されていることを示す。また、論理ボリューム122cからストレージ110bと110cへの矢印は、論理ボリューム122cが、ストレージ110b内の1つ以上の論理ユニットと、ストレージ110c内の1つ以上の論理ユニットに断片化されていることを示す。
場合によっては、ある1つの論理ボリュームが、ある1つのストレージ内の2つ以上の論理ユニットにだけ断片化されていてもよい。いずれにせよ、各論理ボリュームは、2つ以上の論理ユニットに断片化される。断片化により、耐障害性とスループットが向上すると期待される。
ところで、仮想ストレージシステム100は、スケールアウト型の(scale-out)ストレージシステムである。つまり、ユーザが使用したい記憶容量の増加に合わせて、ストレージとストレージコントローラを、適宜、仮想ストレージシステム100に追加することにより、仮想ストレージシステム100を拡張することが可能である。仮想ストレージシステム100において、以下に示す数は、任意に定められていてよい。
・仮想ストレージシステム100内のストレージの数
・各ストレージ内の論理ユニットの数
・仮想ストレージシステム100内の論理ユニットの総数
・仮想ストレージシステム100内のストレージコントローラの数
・各ストレージコントローラが管理する論理ボリュームの数
・仮想ストレージシステム100内の論理ボリュームの総数
仮想ストレージシステム100はスケールアウト型なので、ストレージの数、論理ユニットの総数、ストレージコントローラの数、および論理ボリュームの総数は、可変である。図2には、論理ボリューム122cの追加によって論理ボリュームの総数が増える例が示されている。
ところで、図1に関して少し説明したとおり、ストレージコントローラに関する冗長構成が採用されてもよい。具体的には、第1実施形態では、ストレージコントローラの故障に応じたフェイルオーバを可能とするために、各論理ボリュームについて、「アクティブパス」だけでなく「スタンバイパス」も決められる。
ある論理ボリュームがサーバ150aからアクセス可能だとする。この場合、当該論理ボリュームについてのアクティブパスは、サーバ150aから、当該論理ボリュームを管理するストレージコントローラを経由して、当該論理ボリュームが断片化された先の各論理ユニットに至るパスである。当該論理ボリュームを管理するストレージコントローラは、換言すれば、アクティブ・ストレージコントローラである。他方、当該論理ボリュームについてのスタンバイパスは、サーバ150aからスタンバイ・ストレージコントローラを経由して、当該論理ボリュームが断片化された先の各論理ユニットに至るパスである。
アクティブ・ストレージコントローラの故障に備えて、スタンバイ・ストレージコントローラが1台以上予め選ばれる。そして、アクティブ・ストレージコントローラが故障すると、スタンバイ・ストレージコントローラのうちの1台が、新たにアクティブ・ストレージコントローラとなり、以後、当該論理ボリュームを担当する。つまり、今までのアクティブ・ストレージコントローラの故障に応じて、アクティブパスが切り換わり、アクティブパスの切り換えにより、フェイルオーバが実現される。
図3は、論理ボリュームの断片化とアクティブパスとスタンバイパスについて、より具体的に説明する図である。図3には、図2と同様の、ストレージ110a〜110cと、ストレージコントローラ120a〜120cと、ネットワーク130〜140と、サーバ150aが示されている。ただし、図2に例示した6つの論理ボリュームのうち、論理ボリューム121aのみが図3には示されており、残りの5つの論理ボリュームは、図3では省略されている。
その代わり、図3では、ストレージコントローラ120aが管理する論理ボリューム121aの詳細が例示されている。具体的には、論理ボリューム121aは、図3に示すように、4つの記憶領域A〜Dを含む。そして、記憶領域Aの実体は論理ユニット111aにあり、記憶領域Bの実体は論理ユニット112aにあり、記憶領域Cの実体は論理ユニット111bにあり、記憶領域Dの実体は論理ユニット112bにある。すなわち、論理ボリューム121aは、4つの論理ユニット111a、112a、111b、112bに断片化している。
例えば、サーバ150aは、「/dev/sda」などの絶対パスで識別されるデバイスファイルに対応するブロックデバイスとして、論理ボリューム121aを認識する。しかし、サーバ150aは、LUNによってそれぞれ識別される論理ユニット111a、112a、111b、112b自体は認識しない。論理ボリューム121aがどの論理ユニットに断片化されているのかということは、サーバ150aに対して隠蔽される。
さて、論理ボリューム121aに関するアクティブパスは、以下のとおりである。
・サーバ150aから、論理ボリューム121aを管理するストレージコントローラ120aを経由して、論理ユニット111aに至るパス
・サーバ150aから、論理ボリューム121aを管理するストレージコントローラ120aを経由して、論理ユニット112aに至るパス
・サーバ150aから、論理ボリューム121aを管理するストレージコントローラ120aを経由して、論理ユニット111bに至るパス
・サーバ150aから、論理ボリューム121aを管理するストレージコントローラ120aを経由して、論理ユニット112bに至るパス
図示の便宜上、図3では、各パスを、サーバ150aから論理ボリューム121aへの矢印と、論理ボリューム121aから、論理ボリューム121aの断片化された先の論理ユニットを含むストレージへの矢印により、示している。
図3に示すように、論理ボリューム121aを担当するアクティブ・ストレージコントローラは、ストレージコントローラ120aである。しかし、ストレージコントローラ120aがいつか故障する可能性もあり得る。そこで、ストレージコントローラ120aの故障に備えて、論理ボリューム121aに関するスタンバイ・ストレージコントローラが選ばれる。
図3の例では、ストレージコントローラ120bと120cが、論理ボリューム121aに関するスタンバイ・ストレージコントローラとして予め選ばれている。スタンバイ・ストレージコントローラが2台以上選ばれる場合、スタンバイ・ストレージコントローラ間に優先度が決められていてもよい。そして、アクティブ・ストレージコントローラが故障したときには、優先度の最も高いスタンバイ・ストレージコントローラが新たなアクティブ・ストレージコントローラになってもよい。
なお、図3では、ストレージコントローラ120bの箱の中に、破線で論理ボリューム121aが示されている。破線で示したこの論理ボリューム121aは、「仮にストレージコントローラ120aが故障し、故障に応じてストレージコントローラ120bがアクティブになると、ストレージコントローラ120bが論理ボリューム121aを管理する」ということを示す。換言すれば、論理ボリューム121aに関するスタンバイパスのうちの1組は、以下のとおりである。
・サーバ150aからストレージコントローラ120bを経由して論理ユニット111aに至るパス
・サーバ150aからストレージコントローラ120bを経由して論理ユニット112aに至るパス
・サーバ150aからストレージコントローラ120bを経由して論理ユニット111bに至るパス
・サーバ150aからストレージコントローラ120bを経由して論理ユニット112bに至るパス
同様に、図3には、ストレージコントローラ120cの箱の中にも、破線で論理ボリューム121aが示されている。破線で示したこの論理ボリューム121aは、「仮にストレージコントローラ120aが故障し、故障に応じてストレージコントローラ120cがアクティブになると、ストレージコントローラ120cが論理ボリューム121aを管理する」ということを示す。換言すれば、論理ボリューム121aに関するスタンバイパスのうちの1組は、以下のとおりである。
・サーバ150aからストレージコントローラ120cを経由して論理ユニット111aに至るパス
・サーバ150aからストレージコントローラ120cを経由して論理ユニット112aに至るパス
・サーバ150aからストレージコントローラ120cを経由して論理ユニット111bに至るパス
・サーバ150aからストレージコントローラ120cを経由して論理ユニット112bに至るパス
このように、仮想ストレージシステム100では、各論理ボリュームに関して、予め、アクティブパスのほかにスタンバイパスも決められる。サーバ150aのマルチパスドライバ151aは、アクティブパスとスタンバイパスを予め認識している。そして、マルチパスドライバ151aは、論理ボリュームに対するI/O要求を、当該論理ボリュームに関するアクティブパス上のストレージコントローラに送信する。
なお、フェイルオーバが起きると、今までのスタンバイパスが新たにアクティブパスとなる。マルチパスドライバ151aは、I/O要求の送信時のアクティブパスに応じて、アクティブパス上のストレージコントローラにI/O要求を送信する。
例えば、ストレージコントローラ120aが正常に動作している間は、マルチパスドライバ151aは、論理ボリューム121aに対するI/O要求を、ストレージコントローラ120aに送信する。ストレージコントローラ120aが故障してストレージコントローラ120bが新たなアクティブ・ストレージコントローラとなると、マルチパスドライバ151aは、論理ボリューム121aに対するI/O要求を、ストレージコントローラ120bに送信する。
例えば、マルチパスドライバ151aは、論理ボリューム121aに対するI/O要求をストレージコントローラ120aに送信すると、ストレージコントローラ120aからの応答の受信を待つ。I/O要求の送信後に所定の時間が経過しても、ストレージコントローラ120aから応答が受信されない場合、マルチパスドライバ151aは、「現在のアクティブパス上のストレージコントローラ120aが故障した」と判断してもよい。さらに、マルチパスドライバ151aは、例えば、「論理ボリューム121aに関するアクティブ・ストレージコントローラが、ストレージコントローラ120aからストレージコントローラ120bに切り換わった」と判断してもよい。そして、マルチパスドライバ151aは、ストレージコントローラ120bにI/O要求を送信してもよい。フェイルオーバは、例えば以上のようにして実現される。
なお、図3では省略されているが、仮想ストレージシステム100は、各ストレージコントローラからアクセス可能な共有記憶装置(例えば図5の共有ディスク170)を含む。そして、「論理ボリューム121aの記憶領域A〜Dが、それぞれどの論理ユニットに対応するのか」を示す対応関係情報が、論理ボリューム121aの作成時に共有記憶装置に記憶される。
よって、フェイルオーバが生じると、新たにアクティブとなったストレージコントローラ120bは、共有記憶装置上の対応関係情報を参照することで、「論理ボリューム121aがどの論理ユニットに断片化されているのか」を認識することができる。この認識にしたがい、ストレージコントローラ120bは、以後、論理ボリューム121aを管理することができる。つまり、この認識に基づいて、ストレージコントローラ120bは、論理ボリューム121aに対するI/O要求の受信に応じて、ストレージ110aと110bの一方または双方に適宜I/O要求を送信することができる。
ところで、図3に例示したような論理ボリュームの断片化により、耐障害性が向上すると期待され、スループットも向上すると期待される。そして、断片化にはさらなる効果もある。つまり、断片化には、「物理的記憶装置のハードウェア性能の差をある程度吸収することにより、I/O性能をある程度平準化することができる」という上述の効果もある。この効果は、仮想ストレージシステム100のようなスケールアウト型のシステムにおいて、特に有意義である。
なぜなら、スケールアウト型のストレージシステムにおいては、ストレージのハードウェア性能が不均一になりがちだからである。ストレージのハードウェア性能は年々進化するので、後からシステムに追加されるストレージのハードウェア性能は、以前からシステムに含まれるストレージのハードウェア性能より高い場合が多い。よって、ハードウェア性能が不均一な複数のストレージを含むシステム内でI/O性能を平準化するためには、図3に例示したように、各論理ボリュームが2つ以上の論理ユニットに断片化されることが望ましい。
しかし、上述のとおり、物理的記憶装置のハードウェア性能の差を吸収するだけでは、I/O性能が十分に平準化されるとは限らない。その1つ目の理由は、上述のとおり、各論理ボリュームに対するI/O要求の量が異なり得るからである。
例えば、図2の例では、論理ボリューム122cが追加される前の状態は以下のとおりである。
・ストレージコントローラ120aは、2つの論理ボリューム121aと122aを担当する。つまり、ストレージコントローラ120aは、論理ボリューム121aに関するアクティブパス上にあり、論理ボリューム122aに関するアクティブパス上にもある。
・ストレージコントローラ120bは、2つの論理ボリューム121bと122bを担当する。つまり、ストレージコントローラ120bは、論理ボリューム121bに関するアクティブパス上にあり、論理ボリューム122bに関するアクティブパス上にもある。
・ストレージコントローラ120cは、1つの論理ボリューム121cを担当する。つまり、ストレージコントローラ120cは、論理ボリューム121cに関するアクティブパス上にある。
もし、どの論理ボリュームに対するI/O要求の量もほぼ等しいのであれば、単純に「各ストレージコントローラが現在いくつの論理ボリュームを担当しているか」に応じて、新たな論理ボリューム122cを管理するストレージコントローラを決めればよい。しかし、多くの場合、論理ボリューム間でI/O要求の量は不均一である。よって、ストレージコントローラ間での負荷分散と、負荷分散によるI/O性能の平準化のためには、単に各ストレージコントローラが現在担当する論理ボリュームの数に注目する方法では不十分である。
また、仮に論理ボリューム間でI/O要求の量がほぼ等しいとしても、ストレージコントローラ間にハードウェア性能の差がある場合は、ストレージコントローラのハードウェア性能の差に起因するI/O性能の偏りがある。特に、仮想ストレージシステム100のようなスケールアウト型のストレージシステムにおいては、ストレージコントローラ間でハードウェア性能が不均一になりがちである。なぜなら、ストレージコントローラのハードウェア性能は年々進化するので、後からシステムに追加されるストレージコントローラのハードウェア性能は、以前からシステムに含まれるストレージコントローラのハードウェア性能より高い場合が多いからである。
つまり、ある一定量のI/O要求に起因する負荷は、ストレージコントローラのハードウェア性能に応じて異なり得る。よって、図1のとおり、ストレージコントローラのハードウェア性能を反映する値(具体的には内部処理時間を示す値)に基づき、相対的に低負荷のストレージコントローラを、新規論理ボリューム用のアクティブ・ストレージコントローラとして選ぶことが望ましい。図1の選択方法によれば、ストレージコントローラ間にハードウェア性能の差に起因するI/O性能の偏りを小さくすることができ、I/O性能の一層の平準化が達成される。
さて、図4は、ストレージとストレージコントローラのハードウェア構成図である。図2と3に示すストレージ110a〜110cのそれぞれは、図4のストレージ110のように構成されていてもよい。また、図2と3に示すストレージコントローラ120a〜120cのそれぞれは、図4のストレージコントローラ120のように構成されていてもよい。
ストレージ110は、2台の物理HDD201と202を含む。しかし、ストレージ110に含まれる物理HDDの台数は任意である。また、ストレージ110は、HDDの代わりに(またはHDDとともに)SSDを含んでもよい。図4では省略されているが、物理HDD201および202と、ネットワーク130との間の通信のための通信インタフェイスも、ストレージ110には含まれる。そして、物理HDD201および202と、通信インタフェイスは、筐体に収められる。
ストレージコントローラ120は、CPU211と、RAM(Random Access Memory)212と、不揮発性記憶装置213と、通信インタフェイス214と、通信インタフェイス215を含む。ストレージコントローラ120内のこれらの構成要素同士は、バス216で接続されている。なお、紙面の都合上、図4では「インタフェイス」が「I/F」と略されている。
CPU211は、シングルコアまたはマルチコアのプロセッサである。ストレージコントローラ120は、2台以上のCPU211を含んでいてもよい。
CPU211は、不揮発性記憶装置213にインストールされたプログラムをRAM212にロードし、RAM212をワーキングエリアとしても用いながら、プログラムを実行する。なお、実施形態によっては、汎用プロセッサであるCPU211の代わりに(またはCPU211とともに)、ASIC(Application-Specific Integrated Circuit)などのハードウェア回路が利用されてもよい。
不揮発性記憶装置213は、例えばフラッシュメモリでもよいし、ストレージコントローラ120内の内蔵HDDであってもよいし、内蔵SSDであってもよい。
通信インタフェイス214は、ストレージコントローラ120がネットワーク140を介して通信を行うための回路である。例えば、ネットワーク140がイーサネット(登録商標)ベースのLANである場合、通信インタフェイス214は、PHYチップとMACチップを含む通信回路であってもよい。ネットワーク140がファイバチャネルベースのネットワークである場合、通信インタフェイス214は、ファイバチャネル用のホストバスアダプタであってもよい。
また、通信インタフェイス215は、ストレージコントローラ120がネットワーク130を介して通信を行うための回路である。例えば、ネットワーク130がイーサネット(登録商標)ベースのLANである場合、通信インタフェイス215は、PHYチップとMACチップを含む通信回路であってもよい。ネットワーク130がファイバチャネルベースのネットワークである場合、通信インタフェイス215は、ファイバチャネル用のホストバスアダプタであってもよい。
さて、図5は、システム構成図である。図5には、図2および3と同様に、ストレージ110aと110bが示されている。しかし、紙幅の都合上、図5では、ストレージ110cは省略されており、ストレージ110aと110bの詳細も省略されている。
また、図5には、図2および3と同様に、ストレージコントローラ120aと120bが示されている。しかし、紙幅の都合上、図5では、ストレージコントローラ120cは省略されている。なお、図2および3では、ストレージコントローラと論理ボリュームの対応関係についての理解の助けとするために、便宜上、ストレージコントローラの箱の中に論理ボリュームを図示したが、図5では、論理ボリュームの図示は省略されている。その代わり、図5では、ストレージコントローラ120aと120bの内部の機能ブロックが図示されている。
さらに、図5には、図2および3と同様のネットワーク130、ネットワーク140、およびサーバ150aが示されている。なお、図2および3では省略されているが、図5に示すとおり、ネットワーク140には、さらに別のサーバ150bが接続されていてもよい。また、仮想ストレージシステム100中の任意のストレージコントローラに対して命令を送信するための端末160も、ネットワーク140に接続される。
そして、仮想ストレージシステム100内のどのストレージコントローラからもアクセス可能な共有記憶装置の一例として、図5には、ネットワーク130に接続された共有ディスク170が示されている。共有ディスク170は、具体的には、1台の物理的HDDであってもよい。
さて、図5に示すように、ストレージコントローラ120aは、I/O要求受信部301aと、I/Oキュー302aと、I/O実行部303aと、制御部304aと、記憶部305aを含む。図5には、記憶部305aに記憶される時間記録テーブル306aも図示されている。
I/O要求受信部301aは、サーバ150a(より詳しくはマルチパスドライバ151a)またはサーバ150bから、ネットワーク140を介して、ストレージコントローラ120aが管理するいずれかの論理ボリュームに対するI/O要求を受信する。そして、I/O要求受信部301aは、受信したI/O要求をI/Oキュー302aに入れる(enqueue)。
I/O実行部303aは、I/Oキュー302aから先頭のI/O要求を取り出し(dequeue)、取り出したI/O要求に応じてI/O処理を実行する。例えば、I/O実行部303aは、論理ボリュームに対するI/O要求のパラメタから、どの論理ユニットのどのアドレスにアクセスするのかを決定し、決定に応じて、適宜のストレージに対するI/O要求を生成する。後述の図8や9の例のように、I/O実行部303aは、サーバ150aから受信する1つのI/O要求に応じて、ストレージに対するI/O要求を2つ以上生成する場合もあり得る。
I/O実行部303aは、生成した各I/O要求を、ネットワーク130を介して適宜のストレージに送信し、ストレージから応答を受信する。そして、I/O実行部303aは、受信した各応答に基づいて、I/Oキュー302aから取り出した元のI/O要求(つまりサーバ150aまたは150bからのI/O要求)に対する応答を生成する。こうして生成された応答は、I/O要求受信部301aにより、ネットワーク140を介してサーバ150aまたは150bに送信される。
例えば、サーバ150aからのI/O要求が具体的にはライト要求である場合、サーバ150aには、データの書き込みが成功したか否かを示す応答が返されてもよい。逆に、サーバ150aからのI/O要求がリード要求である場合、ストレージから読み出されたデータを含む応答が、サーバ150aに返される。
制御部304aは、I/O要求受信部301aとI/O実行部303aによる、I/O要求の受信から応答の送信までの処理の流れを制御しつつ、ストレージコントローラ120aの内部処理時間を計測する。そして、制御部304aは、計測した内部処理時間を時間記録テーブル306aに記録する。さらに、制御部304aは、時間記録テーブル306aに基づいて、定期的に集計処理を行う。
時間記録テーブル306aの詳細は、図10とともに後述する。また、I/O要求受信部301a、I/O実行部303a、および制御部304aが行う処理の詳細は、図11〜12とともに後述する。
I/O要求受信部301aは、通信インタフェイス214とCPU211により実現されてもよい。I/Oキュー302aは、RAM212により実現されることが望ましいが、不揮発性記憶装置213により実現されてもよい。I/O実行部303aは、CPU211と通信インタフェイス215により実現されてもよい。制御部304aも、CPU211と通信インタフェイス215により実現されてもよい。記憶部305aは、RAM212と不揮発性記憶装置213の一方または双方により実現されてもよい。
さて、以上のごときストレージコントローラ120aと同様に、ストレージコントローラ120bも、I/O要求受信部301bと、I/Oキュー302bと、I/O実行部303bと、制御部304bと、記憶部305bを含む。記憶部305bは、時間記録テーブル306bを記憶する。図5では省略されているストレージコントローラ120cも、ストレージコントローラ120bと同様のコンポーネントを有する。
なお、第1実施形態では、仮想ストレージシステム100内のどのストレージコントローラのI/Oキューも、同じ容量である。これは、「I/Oキューの容量の差に応じてキューイング時間がストレージコントローラ間でばらつくことで、I/O性能がストレージコントローラ間でばらつく」という事態を防ぐためである。
また、第1実施形態では、仮想ストレージシステム100中の複数のストレージコントローラのうちの1つが、図1に概要を示した処理を行うための管理部307を含む。図5の例では、ストレージコントローラ120aが管理部307を含む。管理部307は作成要求受信部308と選択部309を含む。
作成要求受信部308は、図1のステップS1の処理を実行する。具体的には、作成要求受信部308は、端末160からネットワーク140を介して、新規論理ボリュームを作成するための作成要求を受信する。また、選択部309は、図1のステップS2〜S3の処理を実行する。つまり、選択部309は、仮想ストレージシステム100内の複数のストレージコントローラの中から1つを選択し、選択したストレージコントローラに新規論理ボリュームの作成を命令する。選択部309がステップS2の選択の際に参照する時間情報は、第1実施形態では、具体的には、後述の2次集計テーブル312のデータである。
管理部307の動作の詳細と、管理部307が利用するデータの具体例は、図13〜15とともに後述する。また、作成要求受信部308は、通信インタフェイス214とCPU211により実現されてもよく、選択部309は、CPU211と通信インタフェイス215により実現されてもよい。
そして、図5に示すように、共有ディスク170には、例えば、1次集計テーブル群311、2次集計テーブル312、ストレージコントローラ管理テーブル313、論理ボリューム管理テーブル314、およびサーバ管理テーブル315が記憶される。これらのテーブルの具体例は、図10、14、および15とともに後述する。
また、図5では省略されているが、共有ディスク170には、各論理ボリュームがどの論理ユニットに断片化されているかを示す対応関係情報がさらに記憶されているものとする。対応関係情報は、図3に関して説明したとおり、フェイルオーバの際に、新たにアクティブになったストレージコントローラにより参照される。
続いて、図6〜9のシーケンス図を参照して、ストレージコントローラの内部処理時間についてさらに詳しく説明する。
図6のシーケンス図は、以下のような場合の例を示す。
・ストレージコントローラ120aが管理する、ある論理ボリュームに対するI/O要求を、サーバ150aが送信する。
・当該I/O要求によりアクセスされる領域は、具体的には、ストレージ110aのいずれか1つの論理ユニットに含まれる。
・当該論理ユニットに対するストレージコントローラ120aからのアクセスは、1回だけである。
具体的には、ステップS11に示すように、時刻T10にサーバ150aがストレージコントローラ120aにネットワーク140を介してI/O要求を送信する。すると、ストレージコントローラ120aは、時刻T11にI/O要求を受信する。
なお、ステップS11で送信されるI/O要求は、具体的には、ストレージコントローラ120aにより管理される、ある論理ボリュームに対するI/O要求である。I/O要求は、リード要求であってもよいし、ライト要求であってもよい。
その後、ステップS12に示すように、ストレージコントローラ120aは、時刻T12に、ネットワーク130を介してI/O要求をストレージ110aに送信する。すると、ストレージ110aは、時刻T13にI/O要求を受信する。
なお、ステップS11とS12で送信されるI/O要求は、どちらも、例えば、iSCSI(Internet Small Computer System Interface)コマンドであってもよい。実施形態によっては、iSCSI以外のネットワーク・ストレージ・プロトコル(例えばファイバチャネル・プロトコル)が利用されてもよい。
ストレージ110aは、受信したI/O要求に応じて、物理的記憶装置(例えばHDD)にアクセスする。そして、ステップS13に示すように、時刻T14に、ストレージ110aは、ネットワーク130を介して応答をストレージコントローラ120aに返す。
例えば、ストレージ110aが受信したI/O要求がリード要求の場合、応答は、読み取られたデータを含む。また、ストレージ110aが受信したI/O要求がライト要求の場合、応答は、ライト要求が成功したか否かを示すステータス情報を含む。
ストレージ110aから返された応答は、時刻T15にストレージコントローラ120aに受信される。その後、ステップS14に示すように、ストレージコントローラ120aは、ネットワーク140を介して応答をサーバ150aに返す。すると、サーバ150aは、時刻T17に応答を受信する。
サーバ150aにとってのI/O性能は、例えば、レイテンシ(すなわち、時刻T10から時刻T17までの時間)により表される。しかし、レイテンシは、ネットワーク130と140それぞれの帯域幅、ストレージコントローラ120aのハードウェア性能、ストレージ110aのハードウェア性能など、様々な要因の影響を受ける。
一方、図1に関して説明したとおり、第1実施形態では、新規論理ボリュームの追加の際に、各ストレージコントローラの内部処理時間に基づく選択が行われる。図6の例におけるストレージコントローラ120aの内部処理時間Dは、式(1)のとおりであり、この内部処理時間Dは、ストレージコントローラ120aのハードウェア性能を反映している。
D=D11+D12=(T12-T11)+(T16-T15) (1)
例えば、内部処理時間D11は、ステップS11でサーバ150aから送られたI/O要求がI/Oキュー302a内でキューイングされている時間と、ステップS12で送信するためのI/O要求をI/O実行部303aが生成する時間を含む。また、内部処理時間D12は、ステップS13で受信された応答から、サーバ150aに返すための応答をI/O実行部303aが生成する時間を含む。
ところで、図6では、説明の簡単化のため、I/O要求または応答の受信開始から受信完了までの時間の長さは無視されており、同様に、I/O要求または応答の送信開始から送信完了までの時間の長さは無視されている。しかし、実際には、I/O要求または応答の受信開始から受信完了までには何らかの時間がかかり、I/O要求または応答の送信開始から送信完了までにも何らかの時間がかかる。図7は、図6の動作シーケンスの詳細を示す。
図7に示すように、ステップS11でのI/O要求の送受信は、詳しくは以下のとおりである。
・サーバ150aは、時刻T10aにI/O要求を送信しはじめ、時刻T10bにI/O要求の送信を完了する。
・ストレージコントローラ120aは、時刻T11aにI/O要求を受信しはじめ、時刻T12bにI/O要求の受信を完了する。
また、ステップS12でのI/O要求の送受信は、詳しくは以下のとおりである。
・ストレージコントローラ120aは、時刻T12aにI/O要求を送信しはじめ、時刻T12bにI/O要求の送信を完了する。
・ストレージ110aは、時刻T13aにI/O要求を受信しはじめ、時刻T13bにI/O要求の受信を完了する。
そして、ステップS13での応答の送受信は、詳しくは以下のとおりである。
・ストレージ110aは、時刻T14aに応答を送信しはじめ、時刻T14bに応答の送信を完了する。
・ストレージコントローラ120aは、時刻T15aに応答を受信しはじめ、時刻T15bに応答の受信を完了する。
また、ステップS14での応答の送受信は、詳しくは以下のとおりである。
・ストレージコントローラ120aは、時刻T16aに応答を送信しはじめ、時刻T16bに応答の送信を完了する。
・サーバ150aは、時刻T17aに応答を受信しはじめ、時刻T17bに応答の受信を完了する。
さて、第1実施形態では、内部処理にかかる時間D11として、具体的には、時刻T11bから時刻T12aまでの時間が計測される。つまり、図6における時刻T11は、より具体的には図7の時刻T11bであり、図6における時刻T12は、より具体的には図7の時刻T12aである。
また、第1実施形態では、内部処理にかかる時間D12として、具体的には、時刻T15bから時刻T16aまでの時間が計測される。つまり、図6における時刻T15は、より具体的には図7の時刻T15bであり、図6における時刻T16は、より具体的には図7の時刻T16aである。
すなわち、図6では、送信開始時刻(例えば時刻T12a)が送信時刻(例えばT12)として示されており、受信完了時刻(例えば時刻T11b)が受信時刻(例えばT11)として示されている。以下、図8、9、16、および17においても、図6と同様に、送信時刻は送信開始時刻を示し、受信時刻は受信完了時刻を示すものとする。
さて、図8は、図6〜7とは別の例を示すシーケンス図である。具体的には、図8のシーケンス図は、以下のような場合の例を示す。
・ストレージコントローラ120aが管理する、ある論理ボリュームに対するI/O要求を、サーバ150aが送信する。
・当該I/O要求によりアクセスされる領域は、具体的には、ストレージ110a内のいずれか1つの論理ユニットに含まれるか、または、ストレージ110a内の2つ以上の論理ユニットにまたがる。
・上記の1つの論理ユニット、または上記の2つ以上の論理ユニットに対する、ストレージコントローラ120aからのアクセスは、3回に分けて行われる。
例えば、図2の論理ボリューム122aは、ストレージ110aの3つの論理ユニット111a〜113aとストレージ110c中の1つ以上の論理ユニットに断片化していてもよい。また、論理ボリューム122aに対するあるI/O要求がアクセスを要求する領域は、たまたま、3つの論理ユニット111a〜113aにまたがる場合があり得る。
例えばそのような場合には、ストレージコントローラ120aは、サーバ150aからのI/O要求の受信に応じて、1回目、2回目、3回目のアクセスで、それぞれ、論理ユニット111a、112a、113aにアクセスしてもよい。それ以外の場合であっても、何らかの理由により、サーバ150aから送信された1つのI/O要求に応じて、ストレージコントローラ120aが複数回ストレージ110aにアクセスする場合があり得る。
以下、図8を参照して、ストレージ110aへの複数回のアクセスをともなうI/O処理の際の、ストレージコントローラ120aの内部処理時間の具体例を説明する。
ステップS21に示すように、時刻T20にサーバ150aがストレージコントローラ120aにI/O要求を送信する、すると、ストレージコントローラ120aは、時刻T21にI/O要求を受信する。
その後、ステップS22に示すように、ストレージコントローラ120aは、時刻T22に1つ目のI/O要求をストレージ110aに送信する。すると、ストレージ110aは、時刻T23に1つ目のI/O要求を受信する。
ストレージ110aは、受信した1つ目のI/O要求に応じて、物理的記憶装置にアクセスする。そして、ステップS23に示すように、時刻T24に、ストレージ110aは、1つ目の応答をストレージコントローラ120aに返す。ストレージ110aから返された1つ目の応答は、時刻T25にストレージコントローラ120aに受信される。
その後、ステップS24に示すように、ストレージコントローラ120aは、時刻T26に2つ目のI/O要求をストレージ110aに送信する。すると、ストレージ110aは、時刻T27に2つ目のI/O要求を受信する。
ストレージ110aは、受信した2つ目のI/O要求に応じて、物理的記憶装置にアクセスする。そして、ステップS25に示すように、時刻T28に、ストレージ110aは、2つ目の応答をストレージコントローラ120aに返す。ストレージ110aから返された2つ目の応答は、時刻T29にストレージコントローラ120aに受信される。
その後、ステップS26に示すように、ストレージコントローラ120aは、時刻T30に3つ目のI/O要求をストレージ110aに送信する。すると、ストレージ110aは、時刻T31に3つ目のI/O要求を受信する。
ストレージ110aは、受信した3つ目のI/O要求に応じて、物理的記憶装置にアクセスする。そして、ステップS27に示すように、時刻T32に、ストレージ110aは、3つ目の応答をストレージコントローラ120aに返す。ストレージ110aから返された3つ目の応答は、時刻T33にストレージコントローラ120aに受信される。
最後に、ステップS28に示すように、ストレージコントローラ120aは、時刻T34において、ステップS21のI/O要求に対する応答をサーバ150aに返す。すると、サーバ150aは、時刻T35に応答を受信する。
以上のごとき図8の例において、ストレージコントローラ120aの内部処理時間Dは、具体的には、式(2)に示すとおり、時間D21〜D24の和である。
D=D21+D22+D23+D24=(T22-T21)+(T26-T25)+(T30-T29)+(T34-T33) (2)
例えば、内部処理時間D21は、ステップS21でサーバ150aから送られたI/O要求がI/Oキュー302a内でキューイングされている時間と、ステップS22で送信するためのI/O要求をI/O実行部303aが生成する時間を含む。また、内部処理時間D22は、ステップS24で送信するためのI/O要求をI/O実行部303aが生成する時間を含み、内部処理時間D23は、ステップS26で送信するためのI/O要求をI/O実行部303aが生成する時間を含む。
そして、内部処理時間D24は、ステップS23、S25およびS27で受信された3つの応答から、サーバ150aに返すための1つの応答をI/O実行部303aが生成する時間を含む。場合によっては、I/O実行部303aは、時刻T25から時刻T26までの期間の一部において、サーバ150aに応答を返すための準備をしてもよい。同様に、I/O実行部303aは、時刻T29から時刻T30までの期間の一部において、サーバ150aに応答を返すための準備をしてもよい。そして、I/O実行部303aは、時刻T33から時刻T34までの期間で、サーバ150aに返すための応答の生成処理を完了してもよい。
ところで、サーバ150aが送信した1つのI/O要求に応じて、ストレージコントローラが複数のストレージにアクセスする場合もあり得る。図9は、そのような場合の一例を示すシーケンス図である。具体的には、図9は、以下のような場合の例を示す。
・ストレージコントローラ120aが管理する、ある論理ボリュームに対するI/O要求を、サーバ150aが送信する。
・当該I/O要求によりアクセスされる領域は、具体的には、ストレージ110aのいずれかの論理ユニットと、ストレージ110bのいずれかの論理ユニットにまたがる。
・よって、ストレージコントローラ120aは、ストレージ110aと110bの双方にアクセスする。
例えば、図3に示すように、論理ボリューム121aの領域A〜Dは、それぞれ、論理ユニット111a、112a、111b、および112bにある。よって、サーバ150aが、領域BとCにまたがるアクセスをともなうようなI/O要求を発行すると、ストレージコントローラ120aは、領域Bを含む論理ユニット112aと、領域Cを含む論理ユニット111bにアクセスする。つまり、ストレージコントローラ120aは、ストレージ110aと110bの双方にアクセスする。
このように、サーバ150aから送信された1つのI/O要求に応じて、ストレージコントローラ120aが複数のストレージにアクセスする場合があり得る。以下、図9を参照して、複数のストレージへのアクセスをともなうI/O処理の際の、ストレージコントローラ120aの内部処理時間の具体例を説明する。
ステップS41に示すように、時刻T40にサーバ150aがストレージコントローラ120aにI/O要求を送信する。すると、ストレージコントローラ120aは、時刻T41にI/O要求を受信する。
その後、ステップS42に示すように、ストレージコントローラ120aは、時刻T42に1つ目のI/O要求をストレージ110aに送信する。すると、ストレージ110aは、時刻T43にI/O要求を受信する。
ストレージ110aは、受信したI/O要求に応じて、物理的記憶装置にアクセスする。そして、ステップS43に示すように、時刻T44に、ストレージ110aは、応答をストレージコントローラ120aに返す。ストレージ110aから返された応答は、時刻T45にストレージコントローラ120aに受信される。
その後、ステップS44に示すように、ストレージコントローラ120aは、時刻T46に2つ目のI/O要求をストレージ110bに送信する。すると、ストレージ110bは、時刻T47にI/O要求を受信する。
ストレージ110bは、受信したI/O要求に応じて、物理的記憶装置にアクセスする。そして、ステップS45に示すように、時刻T48に、ストレージ110bは、応答をストレージコントローラ120aに返す。ストレージ110bから返された応答は、時刻T49にストレージコントローラ120aに受信される。
最後に、ステップS46に示すように、ストレージコントローラ120aは、時刻T50において、ステップS41のI/O要求に対する応答をサーバ150aに返す。すると、サーバ150aは、時刻T51に応答を受信する。
以上のごとき図9の例において、ストレージコントローラ120aの内部処理時間は、具体的には、式(3)に示すとおり、時間D41〜D43の和である。
D=D41+D42+D43=(T42-T41)+(T46-T45)+(T50-T49) (3)
例えば、内部処理時間D41は、ステップS41でサーバ150aから送られたI/O要求がI/Oキュー302a内でキューイングされている時間と、ステップS42で送信するためのI/O要求をI/O実行部303aが生成する時間を含む。また、内部処理時間D42は、ステップS44で送信するためのI/O要求をI/O実行部303aが生成する時間を含む。
そして、内部処理時間D43は、ステップS43とS45で受信された2つの応答から、サーバ150aに返すための1つの応答をI/O実行部303aが生成する時間を含む。場合によっては、I/O実行部303aは、時刻T45から時刻T46までの期間の一部において、サーバ150aに応答を返すための準備をしてもよい。
以上、図6〜9を参照して説明したように、ストレージコントローラ120aの内部処理時間は、ストレージコントローラ120aがI/O要求を受信してからサーバ150aに応答を送信するまでの時間のうちの一部である。内部処理時間は、I/O要求がストレージコントローラ120a内でキューイングされている時間や、ストレージコントローラ120aがストレージ110a宛のI/O要求を生成するのにかかる時間を含み得る。しかし、内部処理時間は、待ち時間(例えば図6の時刻T12から時刻T15までの時間)を含まない。なぜなら、待ち時間は、ネットワーク帯域幅やストレージのハードウェア性能に依存する時間であって、ストレージコントローラ自体のハードウェア性能とは無関係だからである。
続いて、図10〜15を参照して、第1実施形態で行われる処理と、各種データについてより具体的に説明する。
図10は、各種データを例示する図である。具体的には、図10には、図5の時間記録テーブル306aと1次集計テーブル群311と2次集計テーブル312が例示されている。
時間記録テーブル306aは、図5のとおり、ストレージコントローラ120aの記憶部305aに記憶される。時間記録テーブル306aの各エントリは、「I/O要求番号」と「内部処理時間」という2つのフィールドを含む。
I/O要求番号は、I/O要求を識別するための識別情報の具体例である。内部処理時間は、I/O要求番号により識別されるI/O要求の処理にかかった時間のうち、ストレージコントローラ120aの内部処理にかかった時間を示す。図10には、例えば、「1番のI/O要求の内部処理に5217マイクロ秒かかった」ということが示されている。
詳しくは図12とともに後述するが、時間記録テーブル306aは第1の所定時間(例えば1分間)ごとにクリアされる。したがって、時間記録テーブル306aの個々のエントリは、現在から第1の所定時間以内の過去に含まれるいずれかの時点においてストレージコントローラ120aが処理を完了したI/O要求についての内部処理時間を示す。
なお、第1の所定時間の長さは、実施形態に応じて任意に決められていてよい。例えば、時間記録テーブル306aを保持する記憶部305aが具体的にはRAM212である場合、第1の所定時間の長さは、RAM212の容量に応じて決められることが好ましい。
1次集計テーブル群311は、図5のとおり共有ディスク170に記憶され、具体的には、仮想ストレージシステム100内の各ストレージコントローラに対応する1次集計テーブルを含む。例えば、1次集計テーブル311aはストレージコントローラ120aに対応し、1次集計テーブル311bはストレージコントローラ120bに対応する。図10では、1次集計テーブル311aについてのみ、詳細が示されている。
1次集計テーブル311aの各エントリは、「日付」、「時刻」、「平均内部処理時間」、および「I/Oの数」という4つのフィールドを含む。1次集計テーブル311aは、時間記録テーブル306aのデータを集計した結果を記憶するためのテーブルである。1次集計テーブル311aの各エントリは、長さが第1の所定時間であるような1つの期間に対応する。つまり、1次集計テーブル311aの各エントリは、第1の所定時間ごとに1回行われる1回の集計に対応する。
例えば、図10の例は、第1の所定時間が1分間の例である。そのため、1次集計テーブル311aには、1分間ごとに別々のエントリが記録される。
例えば、図10の1次集計テーブル311aの1番目のエントリは、「2011年2月3日」という日付と、「10時00分」という時刻が記録されている。これは、1番目のエントリが、2011年2月3日の10時00分00秒に終わる長さ1分間の期間に対応することを示す。そして、1番目のエントリには、「3412マイクロ秒」という平均内部処理時間と、「56回」というI/Oの数が記録されている。したがって、1番目のエントリは、以下のことを示す。
・2011年2月3日の9時59分00秒より後、かつ10時00分00秒までの1分間の期間中のいずれかの時点において、ストレージコントローラ120aが処理を完了したI/O要求は、56件あった。
・ストレージコントローラ120aにおける内部処理時間の、それら56件のI/O要求に関する平均は、3412マイクロ秒である。
同様に、2番目のエントリは、以下のことを示す。
・2011年2月3日の10時00分00秒より後、かつ10時01分00秒までの1分間の中のいずれかの時点において、ストレージコントローラ120aが処理を完了したI/O要求は、123件あった。
・ストレージコントローラ120aにおける内部処理時間の、それら123件のI/O要求に関する平均は、6176マイクロ秒である。
3番目と4番目のエントリが示す意味も、同様に図10から明らかである。なお、詳しくは図12とともに後述するとおり、1次集計テーブル311a内の各エントリは、第2の所定時間(例えば1週間)の間のみ有効である。
例えば、1次集計テーブル311aの各エントリは、追加されてから第2の所定時間が経過すると削除されてもよい。あるいは、1次集計テーブル311aがリングバッファにより実現されてもよく、その場合、1次集計テーブル311aの各エントリは、第2の所定時間が経過するたびに、全フィールドが書き換えられる。
2次集計テーブル312は、図5のとおり、共有ディスク170に記憶される。2次集計テーブル312の各エントリは、「ストレージコントローラ番号」と「平均内部処理時間」という2つのフィールドを含む。
ストレージコントローラ番号は、ストレージコントローラを識別するための識別情報の具体例である。つまり、2次集計テーブル312の各エントリは各ストレージコントローラに対応する。
平均内部処理時間は、ストレージコントローラ番号により識別されるストレージコントローラにおいて、1件のI/O要求あたりに平均してかかる内部処理時間を示す。より具体的には、2次集計テーブル312における平均内部処理時間は、第2の所定時間(例えば1週間)における内部処理時間の算術平均を示す。図10には、例えば、「1番のストレージコントローラにおいて、1件のI/O要求あたり、平均で8176マイクロ秒かかった」ということが示されている。
例えば、ストレージコントローラ120aの番号が1であるとする。この場合、2次集計テーブル312の1番目のエントリは、ストレージコントローラ120aに対応する。つまり、この場合、2次集計テーブル312の1番目のエントリは、「ストレージコントローラ120aに対応する1次集計テーブル311aのデータを集計した結果が8176マイクロ秒である」ということを示す。
なお、1つのストレージコントローラに対応する1つの1次集計テーブルから、2次集計テーブル312において当該ストレージコントローラに対応するエントリにおける平均内部処理時間を算出するために、第1実施形態では、具体的には、式(4)が使われる。
式(4)中の記号の意味は以下のとおりである。式(4)によれば、1枚の1次集計テーブルを用いて、第2の所定時間における内部処理時間の算術平均を算出することができる。
・「c」は、ストレージコントローラ番号である。
・「num(c,i)」は、c番のストレージコントローラに対応する1次集計テーブルのi番目のエントリにおけるI/Oの数である。
・「N」は1つの1次集計テーブル中のエントリの総数である。なお、Nは、cに依存しない定数である。
・「avr1(c,i)」は、c番のストレージコントローラに対応する1次集計テーブルのi番目のエントリにおける平均内部処理時間である。
・「avr2(c)」は、2次集計テーブル312においてc番のストレージコントローラに対応するエントリにおける平均内部処理時間である。
さて、続いて、図11〜12を参照して、図10に例示したようなデータがどのようにして得られるかを具体的に説明する。
図11は、第1実施形態のストレージコントローラがI/O要求の受信に応じて行う処理のフローチャートである。仮想ストレージシステム100内の各ストレージコントローラは、いずれかのサーバからI/O要求を受信すると図11の処理を開始する。
以下では説明の便宜上、ストレージコントローラ120aがサーバ150a(より詳しくはサーバ150aのマルチパスドライバ151a)からI/O要求を受信した場合を例にして、図11の処理について説明する。ストレージコントローラ120aは、I/O要求ごとに別々のスレッドでそれぞれ図11の処理を実行してもよい。
まず、I/O要求受信部301aが、ネットワーク140を介してサーバ150aのマルチパスドライバ151aから、ストレージコントローラ120aの管理するいずれかの論理ボリュームに対するI/O要求を受信する。I/O要求の受信が完了すると、図11の処理が開始され、ステップS101で制御部304aが内部処理時間の測定を開始する。
内部処理時間の測定には、例えば、CPU211に内蔵されるハードウェアタイマが利用されてもよい。しかし、図11の例では、制御部304aは、具体的には、測定開始時刻を示す変数Tと内部処理時間を示す変数Dを使って、内部処理時間を測定する。つまり、ステップS101で制御部304aは、変数Tに現在時刻を代入し、変数Dを0に初期化する。なお、図11において「Now()」は現在時刻を示すものとする。例えば、図6〜7の例では、ステップS101で、時刻T11(すなわち時刻T11b)が変数Tに代入される。
次に、ステップS102でI/O要求受信部301aは、受信したI/O要求をI/Oキュー302aに入れる。その後、ステップS103に示すとおり、I/O実行部303aは、ステップS102でI/Oキュー302aに入れられたI/O要求がI/Oキュー302aの先頭に来るまで待つ。
そして、ステップS102でI/Oキュー302aに入れられたI/O要求がI/Oキュー302aの先頭に来ると、ステップS104でI/O実行部303aが、I/Oキュー302aの先頭からI/O要求を取り出す。
次に、ステップS105でI/O実行部303aは、適宜の内部処理を行う。例えば、I/O実行部303aは、ステップS105で、どのストレージに対してI/O要求を送信するかを決めたり、ストレージに対するI/O要求を生成したりする。
そして、ステップS105での内部処理の結果として、いずれかのストレージに対してI/O実行部303aがI/O要求を送信するための準備が完了すると、次に、ステップS106で制御部304aが変数Dを更新する。つまり、内部処理時間の測定は、ステップS106で一旦中断する。
具体的には、制御部304aは、変数Tの示す測定開始時刻を現在時刻から引き、減算の結果を、変数Dの示す時間に足す。そして、制御部304aは、加算の結果を、新たに変数Dに代入する。図11には、ステップS106での変数Dの更新が次の式(5)のように示されている(なお、式(5)の等号は代入を示す)。
D=D+(Now()-T) (5)
例えば、図6〜7の例では、式(5)における現在時刻Now()は時刻T12(すなわち時刻T12a)である。よって、図6〜7の例では、ステップS106で更新された変数Dの値は、具体的にはD11(=T12−T11=T12a−T11b)である。
次に、ステップS107でI/O実行部303aは、ステップS105の内部処理により生成したI/O要求を、ネットワーク130を介してストレージに送信する。その後、ステップS108に示すように、I/O実行部303aは、ストレージからの応答の受信を待つ。
そして、ストレージからの応答の受信が完了すると、ステップS109で制御部304aが内部処理時間の測定を再開する。具体的には、制御部304aは、変数Tに現在時刻を代入する。例えば、図6〜7の例では、ステップS109で、時刻T15(すなわち時刻T15b)が変数Tに代入される。
ところで、図8〜9を参照して説明したとおり、サーバ150aからの1つのI/O要求に対応して、ストレージコントローラ120aが2つ以上のI/O要求を送信する場合があり得る。そこで、ステップS110で制御部304aは、I/O実行部303aへの問い合わせを介して、「いずれかのストレージに送信するI/O要求がさらにあるのか否か」を判断する。
ストレージに送信するI/O要求がもうなければ、図11の処理はステップS111に移行する。逆に、いずれかのストレージに送信するI/O要求がさらにあれば、図11の処理はステップS105に戻る。なお、ステップS110からステップS105に処理が戻る場合には、ステップS105の内部処理は、ストレージコントローラ120aからサーバ150aに対する応答を準備するための処理を含んでいてもよい。
例えば、図6〜7の例では、ステップS110の1回目の実行のときに、処理がステップS110からステップS111へと移行する。それに対して、図8の例では、処理がステップS110からステップS105へと戻る。より詳しくは、図8の例では、ステップS105〜S110が3回繰り返される。また、図9の例では、ステップS105〜S110が2回繰り返される。
例えば、図8の例では、以下のようにして制御部304aが変数Tと変数Dの更新を繰り返す。
・時刻T21において、ステップS101により、T=T21かつD=0である。
・時刻T22において、ステップS106により、D=D21(=0+(T22−T21))である。
・時刻T25において、ステップS109により、T=T25である。
・時刻T26において、ステップS106により、D=D21+D22(=D21+(T26−T25))である。
・時刻T29において、ステップS109により、T=T29である。
・時刻T30において、ステップS106により、D=D21+D22+D23(=D21+D22+(T30−T29))である。
・時刻T33において、ステップS109により、T=T33である。
また、図9の例では、以下のようにして制御部304aが変数Tと変数Dの更新を繰り返す。
・時刻T41において、ステップS101により、T=T41かつD=0である。
・時刻T42において、ステップS106により、D=D41(=0+(T42−T41))である。
・時刻T45において、ステップS109により、T=T45である。
・時刻T46において、ステップS106により、D=D41+D42(=D41+(T46−T45))である。
・時刻T49において、ステップS109により、T=T49である。
さて、I/O実行部303aが1つ以上のI/O要求をすべてそれぞれ適宜のストレージに送信し終わり、最後に送信したI/O要求に対する応答も受信し終わると、上記のとおりステップS111が実行される。ステップS111でI/O実行部303aは、サーバ150aに応答を返すための内部処理を実行する。例えば、I/O実行部303aは、上記のようにして1台以上のストレージから得た各応答から、サーバ150aに返すための応答を生成し、生成した応答をI/O要求受信部301aに出力してもよい。
そして、ステップS111での内部処理の結果として、サーバ150aに応答を返すための準備が完了すると、次に、ステップS112で制御部304aが変数Dを更新する。つまり、内部処理時間の測定は、ステップS112で終了する。具体的には、制御部304aは、ステップS106と同様にして変数Dを更新する。
例えば、図6〜7の例では、時刻T16(つまり時刻T16a)にステップS112が実行されるので、ステップS112で変数Dの値が、D11から(D11+D12)に更新される。また、図8の例では、時刻T34にステップS112が実行されるので、ステップS112で変数Dの値が、(D21+D22+D23)から(D21+D22+D23+D24)に更新される。そして、図9の例では、時刻T50にステップS112が実行されるので、ステップS112で変数Dの値が、(D41+D42)から(D41+D42+D43)に更新される。
次に、ステップS113でI/O要求受信部301aは、ネットワーク140を介してサーバ150aに応答を返す。
最後に、ステップS114で制御部304aは、変数Dの値を時間記録テーブル306aに書き込む。より具体的には、制御部304aは、以下の2つの値を含む新たなエントリを時間記録テーブル306aに追加する。
・図11の処理のトリガとなったサーバ150aからのI/O要求に含まれるI/O要求番号
・変数Dの値
さて、図11についての以上の説明から明らかなように、ストレージコントローラ120aがいずれかのサーバからのI/O要求を1つ処理するたびに、時間記録テーブル306aには1つのエントリが追加される。そして、追加されたエントリには、当該1つのI/O要求の処理にかかった時間のうちの内部処理時間が記録される。
こうして得られた時間記録テーブル306aのデータを2段階に分けて集計することにより、図1のステップS2で使われる時間情報(すなわち、2次集計テーブル312における平均内部処理時間)が得られる。以下、図12を参照して、平均内部処理時間の算出と記録について具体的に説明する。
図12は、ストレージコントローラが定期的に行う処理のフローチャートである。仮想ストレージシステム100内の各ストレージコントローラは、定期的に図12の処理を実行する。より具体的には、図10に関して説明した第1の所定時間ごとに、各ストレージコントローラ内の制御部が、図12の処理を実行する。以下では説明の便宜上、第1の所定時間が1分間であるものとし、第2の所定時間が1週間であるものとする。そして、ストレージコントローラ120aの制御部304aが図12の処理を実行する場合を例にして、図12について説明する。
ステップS201で制御部304aは、ストレージコントローラ120a内の時間記録テーブル306aを参照し、直近1分間の、I/O要求1件あたりのストレージコントローラ120aの平均内部処理時間を算出する。第1実施形態では、時間記録テーブル306aには、直近1分間に含まれるいずれかの時点において、ストレージコントローラ120aが処理を完了したI/O要求についての内部処理時間のみが記録されている。よって、ステップS201で制御部304aは、具体的には、時間記録テーブル306aの全エントリの内部処理時間の総和を、時間記録テーブル306aのエントリの数で割ることにより、平均内部処理時間を算出する。
次に、ステップS202で制御部304aは、共有ディスク170上の1次集計テーブル群311のうち、ストレージコントローラ120aに対応する1次集計テーブル311aを更新する。具体的には、制御部304aは、1次集計テーブル311a内の、現在時刻に対応するエントリに、ステップS201で算出した平均内部処理時間と、直近1分間にストレージコントローラ120aが処理したI/O要求の数を書き込む。
例えば、制御部304aは、日付と時刻のフィールドの値が現在の1週間前の日時を示すエントリを1次集計テーブル311aから削除し、代わりに新たなエントリを追加してもよい。この場合、上記の「現在時刻に対応するエントリ」は、追加される新たなエントリである。
あるいは、1次集計テーブル311aがリングバッファにより実現されてもよい。この場合、上記の「現在時刻に対応するエントリ」は、日付と時刻のフィールドの値が現在の1週間前の日時を示すエントリである。例えば、現在時刻が2011年2月10日10時00分00秒である場合、現在時刻に対応するエントリは、図10の1番目に示されているエントリである。
いずれにせよ、制御部304aは、現在時刻に対応するエントリにおいて、各フィールドに以下のように値を設定する。
・制御部304aは、日付のフィールドに今日の日付を書き込む。
・制御部304aは、時刻のフィールドに現在の時刻を書き込む。
・制御部304aは、平均内部処理時間のフィールドに、ステップS201で算出した平均内部処理時間を書き込む。
・制御部304aは、I/Oの数のフィールドに、時間記録テーブル306aのエントリの総数(すなわち、直近1分間にストレージコントローラ120aが処理したI/O要求の数)を書き込む。
さらに、ステップS203で制御部304aは、以上のようにして更新した共有ディスク170上の1次集計テーブル311aを参照し、直近1週間の、I/O要求1件あたりのストレージコントローラ120aの平均内部処理時間を算出する。具体的には、制御部304aは、図10に関して説明した式(4)にしたがって、平均内部処理時間を算出する。
そして、ステップS204で制御部304aは、共有ディスク170上の2次集計テーブル312内の、ストレージコントローラ120aに対応するエントリに、ステップS203で算出した平均内部処理時間を書き込む。
また、ステップS205で制御部304aは、ストレージコントローラ120a内の時間記録テーブル306aをクリアする。すなわち、制御部304aは、時間記録テーブル306aの全エントリを削除する。そして、図12の処理は終了する。
続いて、以上の図12の処理による効果について説明する。
時間記録テーブル306aは、制御部304aにより頻繁にアクセスされる。つまり、時間記録テーブル306aは、ストレージコントローラ120aがI/O要求の処理を完了するたびにアクセスされ、さらに、第1の所定時間ごとにもアクセスされる。制御部304aから頻繁にアクセスされる時間記録テーブル306aは、ストレージコントローラ120aのRAM212上に記憶されることが望ましい。
なお、時間記録テーブル306aは、ストレージコントローラ120aの不揮発性記憶装置213に記憶されていてもよい。しかし、いずれにしろ、時間記録テーブル306aは、ストレージコントローラ120aの外部の記憶装置(例えば共有ディスク170など)ではなく、ストレージコントローラ120aの内部にローカルに記憶されることが望ましい。
一方で、ストレージコントローラ120aのRAM212は、例えばサーバ150aのRAMと比べて小容量である場合が多い。また、ストレージコントローラ120aの不揮発性記憶装置213も、例えば物理HDD201や共有ディスク170などと比べて小容量である場合が多い。よって、ストレージコントローラ120aが時間記録テーブル306aのために消費する記憶容量は、小さいことが望ましい。
ここで、図12の処理によれば、ストレージコントローラ120aが時間記録テーブル306aのために消費する記憶容量は、比較的短い第1の所定時間(例えば1分間)に応じた容量であるから、比較的小さい。すなわち、図12の処理によれば、「時間記録テーブル306aの記憶容量が比較的小さくて済む」という有利な効果が得られる。同様に、図12の処理によれば、「ストレージコントローラ120bが時間記録テーブル306bのために消費する記憶容量も、比較的小さい」という有利な効果が得られる。
一方、個々の1次集計テーブルがアクセスされる頻度は、個々の時間記録テーブルがアクセスされる頻度に比べてかなり低い。同様に、2次集計テーブル312がアクセスされる頻度も、個々の時間記録テーブルがアクセスされる頻度に比べてかなり低い。よって、1次集計テーブル群311と2次集計テーブル312は、図5に示すように、ストレージコントローラの外部の共有ディスク170にあっても構わない。
また、共有ディスク170は、例えばストレージコントローラ120aのRAM212と比べてかなり容量が大きい。したがって、共有ディスク170には、比較的大きな記憶容量を消費するデータが記憶されていても問題ない。具体的には、共有ディスク170に記憶される1次集計テーブル群311の容量は大きくても問題ない。
ここで、第1と第2の所定時間の長さは、実施形態に応じて決められていてよいが、第2の所定時間の方が第1の所定時間よりも長い。例えば、上記の例では、第2の所定時間は1週間であり、第1の所定時間は1分間であるから、第2の所定時間は第1の所定時間と比べて十分に長い。
そして、図10と12の説明から分かるとおり、個々の1次集計テーブルの記憶容量は、第2の所定時間の第1の所定時間に対する比に応じた容量である。よって、第2の所定時間が第1の所定時間と比べて十分に長い場合、個々の1次集計テーブルの記憶容量は比較的大きい。また、1次集計テーブル群311の記憶容量は、ストレージコントローラの総数に応じて大きくなる。
しかし、たとえ1次集計テーブル群311が比較的大きな記憶容量を消費するとしても、問題はない。なぜなら、上記のとおり共有ディスク170の容量は比較的大きいからである。そして、第2の所定時間が十分に長いことには、有意義な効果がある。
なぜなら、ある程度長い第2の所定時間での平均内部処理時間を図1のステップS2における時間情報として使うことで、時間情報の信頼性が高まり、ステップS2の選択の適切さも向上するからである。例えば、1分間といった短期間における平均内部処理時間は、偶発的な要因に左右されやすい。しかし、例えば、1週間といった比較的長い期間における平均内部処理時間は、偶発的な要因の影響が少ないので、信頼性が高い。そのため、第2の所定時間での平均内部処理時間を図1のステップS2における時間情報として使う第1実施形態では、適切なストレージコントローラが選択される見込みが高い。
つまり、図12のように2段階の集計を行うこと(具体的には、第1の所定時間での平均内部処理時間を求める集計と、第2の所定時間での平均内部処理時間を求める集計を行うこと)には、以下のような効果がある。
・信頼性の高い(つまり偶発的な要因に左右されにくい)時間情報として2次集計テーブル312のデータが得られる。そのため、信頼性の高い時間情報に基づいて、図1のステップS2では適切なストレージコントローラが選択される。
・各ストレージコントローラ内の記憶容量が比較的小さくても、信頼性の高い時間情報が得られる。
・2次集計テーブル312に記録される平均内部処理時間は、比較的短い第1の所定時間ごとに再計算され、更新される。そのため、ステップS2で使われる時間情報は、信頼性が高いだけでなく、状況の変化への追従性も良い。つまり、例えば「12日前から5日前までの1週間の平均内部処理時間」のような古い情報ではなく、直近の1週間の平均内部処理時間が利用可能なので、状況の変化への追従性が良い。
また、第1実施形態では、各ストレージコントローラの平均内部処理時間を得るために、テスト用のI/O要求を各ストレージコントローラに処理させる必要がない。よって、テストデータを用いて装置の性能を計測するシステムと比べると、第1実施形態には、「テスト用のI/O要求に起因する余計な負荷をかけなくても、ストレージコントローラの性能を示す値として平均内部処理時間が得られる」という利点がある。
また、第1実施形態では、時間情報は、限られた数のテスト用のI/O要求それぞれについての内部処理時間からではなく、比較的長い第2の所定時間(例えば1週間)にわたって処理される大量のI/O要求それぞれについての内部処理時間から、得られる。したがって、テストデータを用いて装置の性能を計測するシステムと比べると、第1実施形態には、「得られる時間情報が、偶発的な要因の影響を受けにくく、信頼性が高い」という利点もある。
続いて、新規論理ボリュームの追加の具体例について、図13〜15を参照して詳しく説明する。図1に概要を示したとおり、新規論理ボリュームの追加の際には、時間情報(具体的には以上の図11〜12の処理により得られる2次集計テーブル312)に基づいて、新規論理ボリューム用のアクティブ・ストレージコントローラが選択される。
図13は、新規論理ボリュームの追加を示すシーケンス図である。また、図14〜15は、図13の動作シーケンス中で使われる各種データの例を示す図である。なお、紙幅の都合上、図13では「ストレージコントローラ(storage controller)」が「SC」と略されている。
ステップS301で端末160は、新規論理ボリュームを作成するための命令の入力をユーザから受け取る。当該命令は、新規論理ボリュームを識別するための識別情報である論理ボリュームID(identification)を含む。説明の便宜上、ステップS301では「VOL_5」という論理ボリュームIDが指定されるものとする。
端末160は、ユーザからの入力にしたがって、ネットワーク140を介して管理部307に、新規論理ボリュームの作成要求を送信する。作成要求には、上記の「VOL_5」という論理ボリュームIDが含まれる。また、作成要求には、論理ボリュームの容量など、その他のパラメタも含まれる。
すると、管理部307(より詳しくは、管理部307内の作成要求受信部308)は、作成要求を受信する。ステップS301における作成要求の受信は、図1のステップS1に対応する。
次に、ステップS302で管理部307(より詳しくは、管理部307内の選択部309)は、新規論理ボリュームを担当する1つのアクティブ・ストレージコントローラと、新規論理ボリューム用の1つ以上のスタンバイ・ストレージコントローラを選択する。ステップS302におけるアクティブ・ストレージコントローラの選択は、図1のステップS2に対応する。
具体的には、選択部309は、ネットワーク130を介して共有ディスク170上の2次集計テーブル312を参照する。そして、選択部309は、仮想ストレージシステム100に含まれる複数のストレージコントローラの中で、平均内部処理時間が相対的に短い1つのストレージコントローラを、アクティブ・ストレージコントローラとして選択する。選択部309は、平均内部処理時間が最短のストレージコントローラを、アクティブ・ストレージコントローラとして選択することが望ましい。
このように、第1実施形態では、2次集計テーブル312に記憶された平均内部処理時間が、図1のステップS2における時間情報として使われる。つまり、第1実施形態における時間情報は、過去のある期間内(すなわち第2の所定時間の長さの期間内)に生じた複数のI/O要求それぞれに対応する内部処理時間から得られる統計量(具体的には算術平均)である。
説明の便宜上、ステップS302では「仮想ストレージシステム100内のストレージコントローラのうち、ストレージコントローラ120bの平均内部処理時間が最短である」と判明したものとする。よって、選択部309は、新規論理ボリュームを管理するアクティブ・ストレージコントローラとして、ステップS302でストレージコントローラ120bを選択する。
ところで、ステップS302におけるスタンバイ・ストレージコントローラの選択は、ランダムな選択であってもよいし、2次集計テーブル312に記憶された平均内部処理時間に基づく選択であってもよい。また、選択部309が選択するスタンバイ・ストレージコントローラの台数は任意である。
例えば、選択部309は、2次集計テーブル312を参照して、平均内部処理時間が2番目と3番目に短いストレージコントローラを、新規論理ボリューム用の2台のスタンバイ・ストレージコントローラとして選択してもよい。選択部309は、アクティブ・ストレージコントローラ以外のストレージコントローラの中から、ランダムに2台のスタンバイ・ストレージコントローラを選択してもよい。もちろん、スタンバイ・ストレージコントローラの台数は、1台でもよいし3台以上でもよい。
以下では説明の便宜上、次のように仮定する。
・ストレージコントローラ120aには、「1」というストレージコントローラ番号が割り当てられている。
・ストレージコントローラ120bには、「2」というストレージコントローラ番号が割り当てられている。
・ストレージコントローラ120cには、「3」というストレージコントローラ番号が割り当てられている。
・紙幅の都合上、図2と3には3つの、図5には2つのストレージコントローラのみが図示されているが、仮想ストレージシステム100には、少なくとも4つのストレージコントローラが含まれる。
・ある不図示のストレージコントローラには、「4」というストレージコントローラ番号が割り当てられている。
・選択部309は、上記のとおりステップS302で、ストレージコントローラ120bをアクティブ・ストレージコントローラとして選択した。
・選択部309は、ストレージコントローラ120aと120cを、ステップS302でスタンバイ・ストレージコントローラとして選択した。
さて、選択部309は、上記のようにストレージコントローラ120bをアクティブ・ストレージコントローラとして選ぶと、ステップS303において、ストレージコントローラ120bに新規論理ボリュームの作成を命令する。具体的には、選択部309は、新規論理ボリューム用の「VOL_5」という論理ボリュームIDや、論理ボリュームの容量などのパラメタを含む命令を、ネットワーク130を介してストレージコントローラ120bに送信する。
また、ステップS304で選択部309は、スタンバイ・ストレージコントローラとして選択したストレージコントローラ120aに対して通知を送信する。当該通知は、「VOL_5」という論理ボリュームIDで識別される新規論理ボリュームのスタンバイ・ストレージコントローラとして、ストレージコントローラ120aが選ばれたことを示す。なお、選択部309自体がストレージコントローラ120a内にあるので、ステップS304での通知は、具体的にはストレージコントローラ120a内での、選択部309と制御部304aの間のプロセス間通信などにより実現されてもよい。
また、ステップS305で選択部309は、スタンバイ・ストレージコントローラとして選択したストレージコントローラ120cに対して、ネットワーク130を介して通知を送信する。当該通知は、「VOL_5」という論理ボリュームIDで識別される新規論理ボリュームのスタンバイ・ストレージコントローラとして、ストレージコントローラ120cが選ばれたことを示す。
なお、ステップS303〜S305の実行順序は任意に入れ替えられても構わない。また、ステップS303の命令は、ストレージコントローラ120bの制御部304bにより受信される。そして、ステップS304の通知は、ストレージコントローラ120aの制御部304aにより受信され、ステップS305の通知は、ストレージコントローラ120cの不図示の制御部により受信される。
さて、ステップS303の命令を受信したストレージコントローラ120bにおいて、制御部304bは、命令にしたがって、新規論理ボリュームを構築する。具体的には、制御部304bは、まず、適宜のポリシにしたがって、「新規論理ボリュームを、何個の、どの論理ユニットに断片化するのか」を決定する。そして、制御部304bは、当該決定に応じて、1つ以上のストレージとネットワーク130を介して通信し、新規論理ボリュームと2つ以上の論理ユニットとを対応づける対応関係情報を共有ディスク170に書き込む。
説明の便宜上、例えば、制御部304bが、新規論理ボリュームを、次の4個の論理ユニットに断片化することに決めたとする。
・ストレージ110b内の論理ユニット112bと113b
・ストレージ110c内の論理ユニット111cと112c
この場合、ステップS306で制御部304bは、ストレージ110bと通信し、新規論理ボリューム用の記憶領域を論理ユニット112bと113b上にそれぞれ確保(allocate)するよう、ストレージ110bに要求する。記憶領域の確保に成功すると、ストレージ110bから制御部304bへ、成功を示す通知が返される。
同様に、ステップS307で制御部304bは、ストレージ110cと通信し、新規論理ボリューム用の記憶領域を論理ユニット111cと112c上にそれぞれ確保するよう、ストレージ110cに要求する。記憶領域の確保に成功すると、ストレージ110cから制御部304bへ、成功を示す通知が返される。
ステップS306とステップS307の実行順は逆でもよい。いずれにせよ、ステップS306〜S307の結果として、新規論理ボリュームが構築される。
また、上記のとおり、制御部304bは、新規論理ボリュームと論理ユニットとを対応づける対応関係情報を、共有ディスク170に書き込む。例えば、新規論理ボリュームが上記のように論理ユニット112b、113b、111c、および112cに断片化される場合、制御部304bは、これら4つの論理ユニットを新規論理ボリュームと対応づける対応関係情報を、共有ディスク170に書き込む。
そして、以上のようにして新規論理ボリュームの作成が完了すると、次に、ステップS308で制御部304bは、新規論理ボリュームの作成完了を管理部307に通知する。
なお、図13の例では、管理部307を含むストレージコントローラ120aとは別のストレージコントローラ120bが、アクティブ・ストレージコントローラとして選ばれる。そのため、管理部307と制御部304bの間の通信は、ネットワーク130を介して行われる。しかし、選択部309がストレージコントローラ120aをアクティブ・ストレージコントローラとして選んだ場合には、管理部307と制御部304aの間の通信は、ストレージコントローラ120a内の通信(例えばプロセス間通信)であってもよい。
管理部307は、ステップS308の完了通知を受信すると、次に、ステップS309で、新規論理ボリュームの追加に応じた適宜の処理を行う。例えば、第1実施形態では、管理部307は、共有ディスク170上のストレージコントローラ管理テーブル313と論理ボリューム管理テーブル314を更新する。
図14には、ストレージコントローラ管理テーブル313と論理ボリューム管理テーブル314が例示されている。ストレージコントローラ管理テーブル313の各エントリは、1台のストレージコントローラに対応し、以下の4つのフィールドを含む。
・ストレージコントローラを識別するための「ストレージコントローラ番号」フィールド
・ストレージコントローラ番号により識別されるストレージコントローラが正常か否かを示す「ストレージコントローラの状態」フィールド
・ストレージコントローラ番号により識別されるストレージコントローラに割り当てられているIP(Internet Protocol)アドレスを示す「IPアドレス」フィールド
・ストレージコントローラ番号により識別されるストレージコントローラがアクティブ・ストレージコントローラとして担当する論理ボリュームを示す「論理ボリュームID」フィールド
例えば、図14に例示したストレージコントローラ管理テーブル313は、以下のことを示す。
・「1」というストレージコントローラ番号が割り当てられたストレージコントローラ120aは、正常である。ストレージコントローラ120aには「10.20.40.50」というIPアドレスが割り当てられている。また、ストレージコントローラ120aは、現在、「VOL_1」という論理ボリュームIDで識別される論理ボリュームと、「VOL_4」という論理ボリュームIDで識別される論理ボリュームを担当している。
・「2」というストレージコントローラ番号が割り当てられたストレージコントローラ120bも、正常である。ストレージコントローラ120bには「10.20.40.51」というIPアドレスが割り当てられている。また、ストレージコントローラ120bは、現在、「VOL_2」という論理ボリュームIDで識別される論理ボリュームと、「VOL_5」という論理ボリュームIDで識別される論理ボリュームを担当している。
・「3」というストレージコントローラ番号が割り当てられたストレージコントローラ120cも、正常である。ストレージコントローラ120cには「10.20.40.52」というIPアドレスが割り当てられている。また、ストレージコントローラ120cは、現在、「VOL_3」という論理ボリュームIDで識別される論理ボリュームを担当している。
・「4」というストレージコントローラ番号が割り当てられた不図示のストレージコントローラにはエラーが発生しており、当該ストレージコントローラは正常ではない。そのため、当該ストレージコントローラが現在アクティブ・ストレージコントローラとして担当している論理ボリュームはない。なお、当該ストレージコントローラには「10.20.40.53」というIPアドレスが割り当てられている。
仮想ストレージシステム100に新たなストレージコントローラが追加されるたびに、管理部307は、ストレージコントローラ管理テーブル313に1つエントリを追加する。
また、ストレージコントローラの状態が正常から異常に変化したことが検出されると、「ストレージコントローラの状態」フィールドが書き換えられる。例えば、ある論理ボリュームに関するフェイルオーバにともなって、新たにアクティブ・ストレージコントローラとなったストレージコントローラが、管理部307にフェイルオーバの発生を通知してもよい。管理部307は、新たなアクティブ・ストレージコントローラからの通知に基づいて、エラーの発生したストレージコントローラについての「ストレージコントローラの状態」フィールドの値を更新してもよい。
また、図13のステップS309では、ストレージコントローラ管理テーブル313が具体的には次のように更新される。管理部307は、ステップS302で選んだアクティブ・ストレージコントローラのエントリにおいて、「論理ボリュームID」フィールドに、ステップS301で指定された新規論理ボリュームの論理ボリュームIDを追加する。
例えば、図13の例では、新規論理ボリュームの論理ボリュームIDは「VOL_5」であり、ステップS302では、「2」というストレージコントローラ番号を持つストレージコントローラ120bがアクティブ・ストレージコントローラとして選ばれる。よって、管理部307は、ステップS309で、ストレージコントローラ管理テーブル313においてストレージコントローラ番号が「2」のエントリの「論理ボリュームID」フィールドに、「VOL_5」という論理ボリュームIDを追加する。図14には、こうして更新されたストレージコントローラ管理テーブル313が例示されている。
また、ステップS309では上記のとおり論理ボリューム管理テーブル314も更新される。図14に例示した論理ボリューム管理テーブル314において、各エントリは、1つの論理ボリュームに対応し、以下の5つのフィールドを含む。
・論理ボリュームに割り当てられたIQN(iSCSI Qualified Name)を示す「論理ボリュームIQN」フィールド
・論理ボリュームIQNの割り当てられた論理ボリュームを識別するための「論理ボリュームID」フィールド
・論理ボリュームIDにより識別される論理ボリュームが通常の状態にあるか否かを示す「論理ボリュームの状態」フィールド
・論理ボリュームIDにより識別される論理ボリュームを管理するアクティブ・ストレージコントローラを識別する番号を示す「アクティブ・ストレージコントローラ番号」フィールド
・論理ボリュームIDにより識別される論理ボリューム用のスタンバイ・ストレージコントローラとして選ばれた1台以上のストレージコントローラの各々を識別する番号のリストを示す「スタンバイ・ストレージコントローラ番号」フィールド
なお、第1実施形態では、iSCSIプロトコルが使われるため、各論理ボリュームにはIQNが割り当てられる。一方で、ユーザの利便性のため、第1実施形態では、論理ボリュームIDも使われる。しかし、IQNと論理ボリュームIDはどちらも識別情報であるから、実施形態によっては、論理ボリュームIDが省略されてもよい。また、iSCSI以外のプロトコル(例えばファイバチャネル・プロトコル)が使われる場合は、プロトコルに応じた識別情報がIQNの代わりに使われる。
管理部307は、新規論理ボリュームの追加のたびに、論理ボリューム管理テーブル314に1つエントリを追加する。例えば、図13の例では、「VOL_5」という論理ボリュームIDを持つ論理ボリュームが追加される。よって、この論理ボリュームの追加に応じて、ステップS309で管理部307は、論理ボリューム管理テーブル314に、図14において5番目に示したエントリを追加する。
5番目のエントリによれば、新規論理ボリュームのIQNは「IQN−TGT55555」であり、新規論理ボリュームの論理ボリュームIDは「VOL_5」であり、新規論理ボリュームの状態は正常である。
また、上記のとおり、ステップS302で管理部307内の選択部309は、ストレージコントローラ120bをアクティブ・ストレージコントローラとして選択する。よって、管理部307は、「アクティブ・ストレージコントローラ番号」フィールドに、ストレージコントローラ120bの番号である「2」を書き込む。
そして、上記のとおり、ステップS302で選択部309は、ストレージコントローラ120aと120cをスタンバイ・ストレージコントローラとして選択する。よって、管理部307は、「スタンバイ・ストレージコントローラ番号」フィールドに、ストレージコントローラ120aと120cの番号である「1」と「3」を書き込む。
図14には、以上のようにしてステップS309で設定された5番目のエントリが例示されている。また、1番目、3番目、および4番目のエントリの意味は、図14から明らかであろう。
なお、2番目のエントリでは「論理ボリュームの状態」フィールドに「DELETING」という値が記憶されている。これは、「VOL_2」という論理ボリュームIDで識別される論理ボリュームに関してフェイルオーバが進行中であり、当該論理ボリュームが通常の状態にはないことを示す。
ストレージコントローラのフェイルオーバのための具体的手法は、例えば公知の手法であってもよいが、フェイルオーバ処理の進行にともなって、第1実施形態では、2番目のエントリが例えば以下のようにして管理部307により書き換えられてもよい。管理部307は、新たなアクティブ・ストレージコントローラと通信することにより、フェイルオーバ処理の進捗を認識してもよい。
「4」という番号で識別される今までのアクティブ・ストレージコントローラの故障にともない、「スタンバイ・ストレージコントローラ番号」フィールドに書かれた「1」という番号で識別されるストレージコントローラ120aへのフェイルオーバが生じる。例えば、第1実施形態では、フェイルオーバ処理の進行にともなって、「DELETING」という値は「CREATING」という値に書き換えられる。「DELETING」という値は、「4」という番号で識別される今までのアクティブ・ストレージコントローラと、「VOL_2」という論理ボリュームIDで識別される論理ボリュームとの対応づけが無効化されることを示す。「CREATING」という値は、ストレージコントローラ120aがスタンバイ状態からアクティブ状態へと遷移中であることを示す。
また、フェイルオーバ処理の進行にともなって、「アクティブ・ストレージコントローラ番号」フィールドは、「4」から「1」へと書き換えられ、「スタンバイ・ストレージコントローラ番号」フィールドからは「1」という番号が削除される。さらに、新たにもう1つのスタンバイ・ストレージコントローラが選択され、選択されたストレージコントローラの番号が「スタンバイ・ストレージコントローラ番号」フィールドに追加される。
なお、以上、図14を参照して説明したような、ステップS309におけるストレージコントローラ管理テーブル313と論理ボリューム管理テーブル314の更新の処理は、実施形態に応じて適宜変形されてよい。ストレージコントローラ管理テーブル313と論理ボリューム管理テーブル314の構造も、実施形態に応じて適宜変形されてよい。
いずれにせよ、以上説明したステップS301〜S309の実行結果として、新規論理ボリュームが作成される。すると、ステップS310で管理部307(より具体的には管理部307内の作成要求受信部308)は、ネットワーク140を介して端末160に、新規論理ボリュームの作成完了を通知する。ステップS310の通知は、ステップS301の作成要求に対する応答である。
さて、その後のステップS311〜S317は、サーバから論理ボリュームへのアクセスを可能にするための手順の例を示す。具体的には、まずステップS311で、端末160が、作成された新規論理ボリュームのサーバへの割り当てを指示する命令の入力をユーザから受け取る。当該命令は、新規論理ボリュームの論理ボリュームIDと、サーバを識別する識別情報を含む。以下では説明の便宜上、次のように仮定する。
・ネットワーク140には、図2〜3には不図示のサーバ150cがさらに接続されている。
・サーバ150cを識別する識別情報としてのサーバIDは、「SRV_3」である。
・ステップS301〜S310の結果として作成された新規論理ボリュームを、サーバ150cに割り当てるための命令の入力を、端末160がステップS311でユーザから受け取る。
端末160は、ユーザからの入力に応じて、管理部307に対して、「VOL_5」という論理ボリュームIDで識別される新規論理ボリュームを「SRV_3」というサーバIDで識別されるサーバ150cに割り当てるよう、要求する。この要求は、ステップS311の矢印により示すように、ネットワーク140を介して送信される。
すると、ステップS312で管理部307は、受信した要求に応じて、共有ディスク170上のサーバ管理テーブル315を更新する。例えば、第1実施形態では、図15に例示するようなサーバ管理テーブル315が使われる。
図15に示すように、サーバ管理テーブル315の各エントリは、ネットワーク140を介して仮想ストレージシステム100と接続された個々のサーバに対応する。サーバ管理テーブル315の各エントリは、以下の3つのフィールドを含む。
・サーバを識別するための「サーバID」フィールド
・サーバIDにより識別されるサーバに割り当てられたIQNを示す「サーバIQN」フィールド
・サーバIDにより識別されるサーバに割り当てられた(つまり、サーバIDにより識別されるサーバからアクセス可能な)各論理ボリュームのIDのリストを示す「論理ボリュームID」フィールド
論理ボリューム管理テーブル314と同様に、サーバ管理テーブル315でも、ユーザの利便性のため、IQNのほかにさらにIDが利用される。また、iSCSI以外のプロトコル(例えばファイバチャネル・プロトコル)が使われる場合は、プロトコルに応じた識別情報がIQNの代わりに使われる。
例えば、図15の例では、サーバ管理テーブル315の1番目のエントリに示すとおり、「SRV_1」というサーバIDにより識別されるサーバには、「IQN1111111」というIQNが割り当てられている。そして、当該サーバには、「VOL_1」と「VOL_2」というIDでそれぞれ識別される2つの論理ボリュームが割り当てられている。
また、図15の例では、サーバ管理テーブル315の2番目のエントリに示すとおり、「SRV_2」というサーバIDにより識別されるサーバには、「IQN2222222」というIQNが割り当てられている。そして、当該サーバには、「VOL_3」と「VOL_4」というIDでそれぞれ識別される2つの論理ボリュームが割り当てられている。
さらに、図15の例では、サーバ管理テーブル315の3番目のエントリに示すとおり、「SRV_3」というサーバIDにより識別されるサーバには、「IQN3333333」というIQNが割り当てられている。図13のステップS312で管理部307は、ステップS311の要求に応じて、3番目のエントリの「論理ボリュームID」フィールドに、「VOL_5」というIDを追加する。
続いて、ステップS313では、サーバ150c(より具体的には、サーバ150c内の不図示のマルチパスドライバ)が、ユーザからの入力に応じて、仮想ストレージシステム100内のいずれかのストレージコントローラに対して、検索要求を送信する。当該検索要求は、サーバ150cからアクセス可能な(すなわちサーバ150cに割り当てられている)論理ボリュームを検索するための要求である。換言すれば、当該検索要求は、iSCSIイニシエータとしてのサーバ150cから使用可能な、iSCSIターゲットとしての論理ボリュームを検索するための要求である。
検索要求は、どのストレージコントローラに送信されてもよい。以下では説明の便宜上、サーバ150cが、何らかのポリシにしたがい、ストレージコントローラ120aを検索要求の送信先に選んだものとする。例えば、サーバ150cは、ラウンドロビン式に検索要求の送信先を選んでもよいし、ランダムに検索要求の送信先を選んでもよいし、予め決められた特定のストレージコントローラを検索要求の送信先として選んでもよい。
具体的には、ステップS313でサーバ150cは、選んだストレージコントローラ120aのIPアドレスを宛先として指定して、ネットワーク140を介して検索要求を送信する。すると、ストレージコントローラ120aのI/O要求受信部301aが検索要求を受信する。
そして、ステップS314でI/O要求受信部301aは、ネットワーク130を介して共有ディスク170を参照し、図15に示すようなボリューム情報316を生成する。
ボリューム情報316は、検索要求の送信元のサーバに割り当てられている(つまり、検索要求の送信元のサーバからアクセス可能な)各論理ボリュームについて、以下のことを示す情報である。
・当該論理ボリュームを識別する論理ボリュームID
・当該論理ボリュームに割り当てられている論理ボリュームIQN
・検索要求の送信元のサーバから当該論理ボリュームへのアクセスに使用可能な各パスについての情報
ここで、上記リストの3番目に示した「各パスについての情報」とは、より具体的には、以下のような情報である。
・各パス上のストレージコントローラのIPアドレス
・各パスがアクティブ状態かスタンバイ状態かを示す情報(つまり、当該パス上のストレージコントローラが、アクティブ・ストレージコントローラなのかスタンバイ・ストレージコントローラなのかを示す情報)
具体的には、I/O要求受信部301aは、検索要求を受信すると、サーバ管理テーブル315を参照する。検索要求には、検索要求の送信元のサーバ150cの「SRV_3」というサーバIDが含まれている。よって、I/O要求受信部301aは、「SRV_3」というサーバIDを含むエントリを探し、見つけたエントリの「論理ボリュームID」フィールドを参照する。
図15の例によれば、「論理ボリュームID」フィールドには、「VOL_5」という1つのIDのみが含まれるが、場合によっては、「論理ボリュームID」フィールドには2つ以上のIDが含まれることがある。I/O要求受信部301aは、サーバ管理テーブル315の「論理ボリュームID」フィールドに含まれる各IDについて、論理ボリュームIQNと、当該IDで識別される論理ボリュームへのアクセスに使用可能な各パスについての情報を取得する。
例えば、上記のようにサーバ管理テーブル315の「論理ボリュームID」フィールドで「VOL_5」というIDが見つかると、I/O要求受信部301aは、論理ボリューム管理テーブル314を参照する。そして、I/O要求受信部301aは、「VOL_5」というIDを持つエントリを論理ボリューム管理テーブル314において検索する。
I/O要求受信部301aは、見つかったエントリから、論理ボリュームIQNと、アクティブ・ストレージコントローラ番号と、スタンバイ・ストレージコントローラ番号を読み取る。図14の論理ボリューム管理テーブル314によれば、論理ボリュームIQNとして「IQN−TGT55555」が得られる。また、アクティブ・ストレージコントローラ番号として「2」が得られ、スタンバイ・ストレージコントローラ番号として、「1」と「3」が得られる。
さらに、I/O要求受信部301aは、上記のようにして得られた「2」という番号を含むエントリを、ストレージコントローラ管理テーブル313において探す。そして、I/O要求受信部301aは、見つかったエントリから、IPアドレスを読み出す。同様に、I/O要求受信部301aは、「1」と「3」という番号にそれぞれ対応するIPアドレスも、ストレージコントローラ管理テーブル313から読み出す。
以上のような処理の結果として、I/O要求受信部301aは、次のように認識し、認識した結果から図15のボリューム情報316を生成する。
・検索要求の送信元のサーバ150aには、「VOL_5」というIDで識別される論理ボリュームが割り当てられており、当該論理ボリュームのIQNは「IQN−TGT55555」である。
・当該論理ボリュームへアクセスするためのパスのうちの1つは、「10.20.40.50」というIPアドレスのストレージコントローラ(つまりストレージコントローラ120a)を介したパスであり、当該パスはスタンバイ状態である。すなわち、ストレージコントローラ120aは、スタンバイ・ストレージコントローラである。
・当該論理ボリュームへアクセスするためのパスのうちの別の1つは、「10.20.40.51」というIPアドレスのストレージコントローラ(つまりストレージコントローラ120b)を介したパスであり、当該パスはアクティブ状態である。すなわち、ストレージコントローラ120bは、アクティブ・ストレージコントローラである。
・当該論理ボリュームへアクセスするためのパスのうちのさらに別の1つは、「10.20.40.52」というIPアドレスのストレージコントローラ(つまりストレージコントローラ120c)を介したパスであり、当該パスはスタンバイ状態である。すなわち、ストレージコントローラ120cは、スタンバイ・ストレージコントローラである。
I/O要求受信部301aは、生成したボリューム情報316を、ネットワーク140を介してサーバ150cに送信する。すると、サーバ150c(より具体的には、サーバ150c内の不図示のマルチパスドライバ)がボリューム情報316を受信する。サーバ150cは、受信したボリューム情報316をディスプレイなどの出力装置に出力してもよい。
すると、ステップS315〜S317で、ユーザは、ボリューム情報316に基づいて、各パスについて、ログイン処理のためのコマンド(例えば「iscsiadm」コマンド)をサーバ150cに入力する。サーバ150cは、入力されたコマンドにしたがい、各パス上のストレージコントローラに対してログイン処理を実行する。
具体的には、ステップS315では、少なくとも以下の2つのパラメタが引数として指定されたコマンドが、ユーザによりサーバ150cに入力される。
・「IQN−TGT55555」という論理ボリュームIQN
・アクティブ・ストレージコントローラであるストレージコントローラ120bのIPアドレス(つまり「10.20.49.51」というIPアドレス)
よって、ステップS315では、サーバ150cは、ストレージコントローラ120bに対してログイン処理を行う。
同様に、ステップS316では、少なくとも以下の2つのパラメタが引数として指定されたコマンドが、ユーザによりサーバ150cに入力される。
・「IQN−TGT55555」という論理ボリュームIQN
・スタンバイ・ストレージコントローラであるストレージコントローラ120aのIPアドレス(つまり「10.20.49.50」というIPアドレス)
よって、ステップS316では、サーバ150cは、ストレージコントローラ120aに対してログイン処理を行う。
同様に、ステップS317では、少なくとも以下の2つのパラメタが引数として指定されたコマンドが、ユーザによりサーバ150cに入力される。
・「IQN−TGT55555」という論理ボリュームIQN
・スタンバイ・ストレージコントローラであるストレージコントローラ120cのIPアドレス(つまり「10.20.49.52」というIPアドレス)
よって、ステップS317では、サーバ150cは、ストレージコントローラ120cに対してログイン処理を行う。なお、ステップS315〜S317の実行順序は任意に入れ替えられてよい。ステップS315〜S317の実行結果として、サーバ150cのマルチパスドライバから、「VOL_5」というIDで識別される論理ボリュームへのアクセスが可能となる。
したがって、その後は、「VOL_5」というIDで識別される論理ボリュームに対するI/O要求がサーバ150c上で発生すると、サーバ150cのマルチパスドライバを介して、当該論理ボリュームへのアクセスが実行される。I/O要求は、ユーザがサーバ150cの入力装置を介して与える入力に応じて生じることもあるし、サーバ150cによるアプリケーション・プログラムの実行に応じて自動的に生じることもある。いずれにせよ、サーバ150c上のアプリケーション層で生じたI/O要求は、サーバ150cのマルチパスドライバへと受け渡される。
そして、サーバ150cのマルチパスドライバから、アクティブ・ストレージコントローラであるストレージコントローラ120bに対して、ネットワーク140を介してI/O要求が送信される。すると、ストレージコントローラ120bは、I/O要求に応じて、「VOL_5」というIDで識別される論理ボリュームが断片化されている先の論理ユニットのうちの1つまたは複数にアクセスする。そして、ストレージコントローラ120bは、論理ユニットへのアクセス結果に基づいて、サーバ150cに応答を返す。I/O要求を受信した際のストレージコントローラ120bの動作は、図11のフローチャートに示したとおりである。
例えば、ステップS318では、サーバ150cのマルチパスドライバが、「VOL_5」というIDで識別される論理ボリュームに対するI/O要求を、ストレージコントローラ120bに送信する。I/O要求は、ストレージコントローラ120bのI/O要求受信部301bにより受信され、I/Oキュー302bにキューイングされる。
説明の便宜上、このI/O要求によりアクセスが要求される記憶領域は、ストレージ110b内の論理ユニットにあるものとする。すると、ステップS319に示すように、ストレージコントローラ120bのI/O実行部303bは、ストレージ110bに対してI/O要求を送信する。そして、ストレージ110bは、ストレージ110b内の適宜の物理的記憶装置(つまり、アクセスが要求される記憶領域を物理的に含む記憶装置)にアクセスする。
その後、ステップS320に示すように、ストレージ110bは、ストレージコントローラ120bに応答を返す。すると、ストレージコントローラ120bのI/O実行部303bは、ストレージ110bからの応答に基づいて、サーバ150cに対する応答を生成する。そして、ステップS321に示すように、ストレージコントローラ120bのI/O要求受信部301bからサーバ150cに対して応答が返される。
以上説明した第1実施形態によれば、新規論理ボリュームを追加する際に、ストレージコントローラ間のハードウェア性能の差が考慮されて、適宜のストレージコントローラが選択される。したがって、第1実施形態によれば、ストレージコントローラ間のハードウェア性能の差に応じた負荷分散が可能であり、I/O性能がより一層平準化される。
続いて、図16〜19を参照して、第2実施形態について説明する。第1実施形態と第2実施形態では、サーバからの1つのI/O要求に応じてストレージコントローラが2つ以上のI/O要求を1つまたは複数のストレージに送信する場合の、ストレージコントローラの動作シーケンスが異なる。他の点は、第1実施形態と第2実施形態で共通である。以下、第1実施形態との違いを中心に、第2実施形態について説明する。
図16〜17は、内部処理時間について説明するシーケンス図である。具体的には、図16〜17は、どちらも、以下のような場合の例を示す。
・ストレージコントローラ120aが管理する、ある論理ボリュームに対するI/O要求を、サーバ150aが送信する。
・当該I/O要求によりアクセスされる領域は、具体的には、ストレージ110a内のいずれかの論理ユニットと、ストレージ110b内のいずれかの論理ユニットにまたがる。
・よって、ストレージコントローラ120aは、ストレージ110aと110bの双方にアクセスする。
図16の例では、まず、ステップS61に示すように、時刻T60にサーバ150aがストレージコントローラ120aにI/O要求を送信する。すると、ストレージコントローラ120aは、時刻T61にI/O要求を受信する。
その後、ステップS62に示すように、ストレージコントローラ120aは、時刻T62に1つ目のI/O要求をストレージ110aに送信する。すると、ストレージ110aは、時刻T63にI/O要求を受信する。
ところで、第1実施形態の図9の例では、ストレージコントローラ120aは、ステップS43でのストレージ110aからの応答の受信を待ってから、ストレージ110bにステップS44でI/O要求を送信する。しかし、第2実施形態では、ストレージコントローラ120aは、ストレージ110aからの応答の受信を待たない。具体的には、ステップS63に示すように、ストレージコントローラ120aは、時刻T64に2つ目のI/O要求をストレージ110bに送信する。すると、ストレージ110bは、時刻T65にI/O要求を受信する。
一方、ストレージ110aは、上記のように時刻T63にI/O要求を受信すると、受信したI/O要求に応じて、物理的記憶装置にアクセスする。その結果、ステップS64に示すように、時刻T66に、ストレージ110aは、応答をストレージコントローラ120aに返す。ストレージ110aから返された応答は、時刻T67にストレージコントローラ120aに受信される。
図16の例では、ストレージコントローラ120aは、受信した応答に応じて適宜の内部処理を行う。内部処理は時刻T68に終了する。
一方、ストレージ110bは、上記のように時刻T65にI/O要求を受信すると、受信したI/O要求に応じて、物理的記憶装置にアクセスする。その結果、ステップS65に示すように、時刻T69に、ストレージ110bは、応答をストレージコントローラ120aに返す。ストレージ110bから返された応答は、時刻T70にストレージコントローラ120aに受信される。
最後に、ステップS66に示すように、ストレージコントローラ120aは、時刻T71において、ステップS61のI/O要求に対する応答をサーバ150aに返す。すると、サーバ150aは、時刻T72に応答を受信する。
以上のごとき図16の例において、ストレージコントローラ120aの内部処理時間Dは、具体的には、式(6)に示すとおり、時間D61、D62、D63、およびD65の和である。
D=D61+D62+D63+D65=(T62-T61)+(T64-T62)+(T68-T67)+(T71-T70) (6)
なお、内部処理時間Dには、時刻T68から時刻T70までの待ち時間D64は含まれない。なぜなら、待ち時間D64はストレージコントローラ120aのハードウェア性能に依存しないからである。他方、時間D61、D62、D63、およびD65は、ストレージコントローラ120aのハードウェア性能に依存する。そのため、図16の例における内部処理時間Dは式(6)のように定義される。
例えば、内部処理時間D61は、ステップS61でサーバ150aから送られたI/O要求がI/Oキュー302a内でキューイングされている時間と、ステップS62で送信するためのI/O要求をI/O実行部303aが生成する時間を含む。また、内部処理時間D62は、ステップS63で送信するためのI/O要求をI/O実行部303aが生成する時間を含む。そして、内部処理時間D63は、ステップS64で受信された応答をI/O実行部303aが処理する時間を含む。また、内部処理時間D65は、ステップS64とS65で受信された2つの応答から、サーバ150aに返すための1つの応答をI/O実行部303aが生成する時間を含む。
なお、場合によっては、ストレージコントローラ120aは、時刻T68で内部処理を完了する前に、ストレージ110bからの応答を受信することもあり得る。その場合は、待ち時間D64はゼロである。また、その場合、ストレージ110bからの応答は、時刻T68までストレージコントローラ120aの受信バッファに保持されて、ストレージ110aからの応答に関する内部処理が時刻T68に完了した後に、処理されてもよい。あるいは、ストレージ110bからの応答に関する内部処理は、ストレージ110aからの応答に関する内部処理と並行して実行されてもよい。
しかし、いずれにせよ、時刻T64から時刻T67までの待ち時間は内部処理時間Dに含まれない。また、上記のとおり、待ち時間D64が生じた場合であっても、待ち時間D64は内部処理時間Dには含まれない。
ところで、図16の例では、ストレージコントローラ120aが先にI/O要求を送信したストレージ110aが、ストレージ110bよりも先に応答を返す。しかし、場合によっては、ストレージ110aからの応答よりも、ストレージ110bからの応答の方が、先にストレージコントローラ120aに受信され得る。図17はそのような場合の例を示す。
図17の例では、まず、ステップS81に示すように、時刻T80にサーバ150aがストレージコントローラ120aにI/O要求を送信する。すると、ストレージコントローラ120aは、時刻T81にI/O要求を受信する。
その後、ステップS82に示すように、ストレージコントローラ120aは、時刻T82に1つ目のI/O要求をストレージ110aに送信する。すると、ストレージ110aは、時刻T83にI/O要求を受信する。
また、ステップS83に示すように、ストレージコントローラ120aは、時刻T84に2つ目のI/O要求をストレージ110bに送信する。すると、ストレージ110bは、時刻T85にI/O要求を受信する。
一方、ストレージ110aは、上記のように時刻T83にI/O要求を受信すると、受信したI/O要求に応じて、物理的記憶装置にアクセスする。同様に、ストレージ110bは、時刻T85にI/O要求を受信すると、受信したI/O要求に応じて、物理的記憶装置にアクセスする。
図17の例では、ストレージ110bの方がストレージ110aよりも短時間で物理的記憶装置へのアクセスを終える。そのため、ステップS84に示すように、時刻T86にはストレージ110bが応答をストレージコントローラ120aに返す。
ストレージ110bから返された応答は、時刻T87にストレージコントローラ120aに受信される。そして、ストレージコントローラ120aは、受信した応答に応じて適宜の内部処理を行う。内部処理は時刻T88に終了する。
一方、上記のように物理的記憶装置にアクセスしたストレージ110aは、ステップS85に示すように、アクセス結果に応じた応答を、時刻T89になってやっとストレージコントローラ120aに返す。ストレージ110aから返された応答は、時刻T90にストレージコントローラ120aに受信される。
最後に、ステップS86に示すように、ストレージコントローラ120aは、時刻T91において、ステップS81のI/O要求に対する応答をサーバ150aに返す。すると、サーバ150aは、時刻T92に応答を受信する。
以上のごとき図17の例において、ストレージコントローラ120aの内部処理時間Dは、具体的には、式(7)に示すとおり、時間D81、D82、D83、およびD85の和である。
D=D81+D82+D83+D85=(T82-T81)+(T84-T82)+(T88-T87)+(T91-T90) (7)
なお、内部処理時間Dには、時刻T88から時刻T90までの待ち時間D84は含まれない。なぜなら、待ち時間D84はストレージコントローラ120aのハードウェア性能に依存しないからである。他方、時間D81、D82、D83、およびD85は、ストレージコントローラ120aのハードウェア性能に依存する。そのため、図17の例における内部処理時間Dは式(7)のように定義される。
例えば、内部処理時間D81は、ステップS81でサーバ150aから送られたI/O要求がI/Oキュー302a内でキューイングされている時間と、ステップS82で送信するためのI/O要求をI/O実行部303aが生成する時間を含む。また、内部処理時間D82は、ステップS83で送信するためのI/O要求をI/O実行部303aが生成する時間を含む。そして、内部処理時間D83は、ステップS84で受信された応答をI/O実行部303aが処理する時間を含む。また、内部処理時間D85は、ステップS84とS85で受信された2つの応答から、サーバ150aに返すための1つの応答をI/O実行部303aが生成する時間を含む。
なお、場合によっては、ストレージコントローラ120aは、時刻T88で内部処理を完了する前に、ストレージ110aからの応答を受信することもあり得る。その場合は、待ち時間D84はゼロである。また、その場合、ストレージ110aからの応答は、時刻T88までストレージコントローラ120aの受信バッファに保持されて、ストレージ110bからの応答に関する内部処理が時刻T88に完了した後に、処理されてもよい。あるいは、ストレージ110aからの応答に関する内部処理は、ストレージ110bからの応答に関する内部処理と並行して実行されてもよい。
しかし、いずれにせよ、時刻T84から時刻T87までの待ち時間は内部処理時間Dに含まれない。また、上記のとおり、待ち時間D84が生じた場合であっても、待ち時間D84は内部処理時間Dには含まれない。
続いて、図18〜19を参照して、第2実施形態における内部処理時間の計測と時間記録テーブルの更新について、具体的に説明する。図18〜19は、第2実施形態のストレージコントローラがI/O要求の受信に応じて行う処理のフローチャートである。
図18〜19の処理は図11の処理と似ているので、以下では違いを中心に説明する。また、説明の便宜上、ストレージコントローラ120aがサーバ150aからI/O要求を受信した場合を例にして、図18〜19の処理について説明する。
ステップS401〜S405は、図11のステップS101〜S105と同様である。しかし、第2実施形態では、ステップS405の内部処理が完了したときには、図11のステップS106のように内部処理時間の測定が中断されることはない。
具体的には、ステップS405での内部処理の完了後、ステップS406でI/O実行部303aは、ステップS405の内部処理により生成したI/O要求を、ネットワーク130を介してストレージに送信する。ステップS406の送信は図11のステップS107の送信と同様である。
しかし、第2実施形態では、ストレージコントローラ120aは、ステップS405で送信されるI/O要求に対する応答の受信を待たない。具体的には、制御部304aは、ステップS406の次に、ステップS407において、「いずれかのストレージに送信するI/O要求がさらにあるのか否か」を判断する。ステップS407の判断は、図11のステップS110の判断と同様である。
ストレージに送信するI/O要求がもうなければ、図18〜19の処理はステップS408に移行する。逆に、いずれかのストレージに送信するI/O要求がさらにあれば、図18〜19の処理はステップS405に戻る。
例えば、図6〜7の例は第2実施形態にも当てはまり、この図6〜7の例では、ステップS407の1回目の実行のときに、処理がステップS407からステップS408へと移行する。それに対して、図16の例と図17の例では、いずれも、処理がステップS407からステップS405へと戻る。
例えば、図16の例では、時刻T62でステップS406が実行され、その後、処理がステップS407からステップS405に戻る。そして、時刻T64で再度ステップS406が実行され、さらに処理がステップS407からステップS408に移行する。
同様に、図17の例では、時刻T82でステップS406が実行され、その後、処理がステップS407からステップS405に戻る。そして、時刻T84で再度ステップS406が実行され、さらに処理がステップS407からステップS408に移行する。
さて、ステップS408では、内部処理時間の測定が一旦中断される。具体的には、制御部304aは、図11のステップS106と同様にして変数Dを更新する。
例えば、図16の例では、時刻T61でのステップS401により変数Tと変数Dが初期化される。したがって、ステップS408で更新された変数Dの値は、(T64−T61)=(D61+D62)である。同様に、図17の例では、ステップS408で更新された変数Dの値は、(T84−T81)=(D81+D82)である。
そして、ステップS409に示すように、I/O実行部303aは、いずれかのストレージからの応答の受信を待つ。いずれかのストレージから応答が受信されると(あるいは、いずれかのストレージから既に受信された応答が受信バッファに存在すると)、ステップS410で制御部304aは、内部処理時間の測定を再開する。つまり、図11のステップS109と同様に、制御部304aは、変数Tに現在時刻を代入する。
そして、ステップS411でI/O実行部303aは、適宜の内部処理を実行する。例えば、I/O実行部303aは、ストレージからの応答に基づいて、サーバ150aに対する応答を準備してもよい。
ステップS411での内部処理の完了後、ステップS412で制御部304aは、「ステップS405〜S407の1回以上の繰り返しにより送信した、1個以上のI/O要求のすべてに対して、応答が受信済みであるか否か」を判断する。そして、未受信の応答が残っていれば、処理はステップS408に戻る。逆に、全応答が受信済みであれば、処理はステップS413に移行する。ステップS413〜S416は、図11のステップS111〜S114と同様である。
例えば、図16の例では、時刻T64でI/O要求の送信が完了すると、ステップS408で内部処理時間の計測が一旦中断される。このとき、変数Dの値は、上記のとおり(D61+D62)である。
そして、時刻T67でのストレージ110aからの応答の受信を機に、図18〜19の処理がステップS409からステップS410へと移行し、ステップS410で内部処理時間の計測が再開される。その後、ステップS411の内部処理が時刻T68に完了する。
ここで、ストレージ110bからの応答が未受信なので、図18〜19の処理はステップS412からステップS408に戻り、ステップS408で内部処理時間の計測が一旦中断される。このとき、変数Dの値は、(D61+D62+D63)である。
その後、時刻T70でのストレージ110bからの応答の受信を機に、図18〜19の処理はステップS409からステップS410へと移行し、ステップS410で内部処理時間の計測が再開される。その後、図18〜19の処理は、ステップS411からステップS412へ、さらに、ステップS412からステップS413へと進む。そして、時刻T71にステップS413の内部処理が完了する。
したがって、ステップS414で(つまり、内部処理時間の計測が終了した時点で)、変数Dの値は、(D61+D62+D63+D65)へと更新される。こうして得られた内部処理時間(すなわち、式(6)の内部処理時間D)が、ステップS416で時間記録テーブル306aに書き込まれる。
また、図17の例では、時刻T84でI/O要求の送信が完了すると、ステップS408で内部処理時間の計測が一旦中断される。このとき、変数Dの値は、上記のとおり(D81+D82)である。
そして、時刻T87でのストレージ110bからの応答の受信を機に、図18〜19の処理がステップS409からステップS410へと移行し、ステップS410で内部処理時間の計測が再開される。その後、ステップS411の内部処理が時刻T88に完了する。
ここで、ストレージ110aからの応答が未受信なので、図18〜19の処理はステップS412からステップS408に戻り、ステップS408で内部処理時間の計測が一旦中断される。このとき、変数Dの値は、(D81+D82+D83)である。
その後、時刻T90でのストレージ110aからの応答の受信を機に、図18〜19の処理はステップS409からステップS410へと移行し、ステップS410で内部処理時間の計測が再開される。その後、図18〜19の処理は、ステップS411からステップS412へ、さらに、ステップS412からステップS413へと進む。そして、時刻T91にステップS413の内部処理が完了する。
したがって、ステップS414で(つまり、内部処理時間の計測が終了した時点で)、変数Dの値は、(D81+D82+D83+D85)へと更新される。こうして得られた内部処理時間(すなわち、式(7)の内部処理時間D)が、ステップS416で時間記録テーブル306aに書き込まれる。
時間記録テーブル306aのデータに基づく2段階の集計処理は、第2実施形態においても、図12にしたがって実行される。したがって、第2実施形態でも第1実施形態と同様の種々の効果が得られる。
なお、本発明は上記の第1〜第2実施形態に限られるものではない。上記の説明においてもいくつかの変形について説明したが、上記実施形態は、さらに例えば下記の観点から変形することもでき、上記および下記の変形は、相互に矛盾しない限り、任意に組み合わせることが可能である。
図10、14、および15には、テーブル形式で各種データを示した。しかし、実施形態に応じて、テーブル以外のデータ形式が使われてもよい。また、iSCSIプロトコルが使われる場合について主に説明したが、他のプロトコルが利用されてもよく、利用されるプロトコルに応じて適宜のデータが使われる。
また、第1〜第2実施形態では、ストレージコントローラにおける、あるメッセージの受信完了から、別のメッセージの送信開始までの時間が、内部処理時間として計測される。例えば、図7の例では、時刻T11bから時刻T12aまでの時間や、時刻T15bから時刻T16aまでの時間が、内部処理時間として計測される。しかし、「ストレージコントローラが、メッセージの送受信と並行して内部処理を行うか否か」など、ストレージコントローラの処理特性によっては、内部処理時間の定義が図7における定義とは異なっていてもよい。
また、図11、18、および19には、ストレージコントローラによる内部処理時間の計測の具体例として、変数Tと変数Dを使った計測が例示されている。しかし、実施形態に応じて、例えば「ストレージコントローラ120内のCPU211に含まれるハードウェアタイマを利用する」などの、他の方法によって、内部処理時間が計測されてもよい。例えば、ストレージコントローラ120aの制御部304aは、タイマに対して、計測開始、計測中断、計測終了などの命令を与えることにより、内部処理時間を計測してもよい。
実施形態によっては、図10の2次集計テーブル312内の平均内部処理時間以外の時間情報が、図1のステップS2で使われてもよい。例えば、ある特定の時間帯(例えば「月曜日の13時から15時」など)に負荷が集中すると予測されるサービス用に、新規論理ボリュームを作成したい場合があり得る。そのような場合には、直近の1週間全体での平均内部処理時間の代わりに、直近の1週間のうち当該特定の時間帯での平均内部処理時間が算出されてもよく、そのようにして算出された値が、ステップS2で時間情報として使われてもよい。
なお、上記の「直近の1週間のうち当該特定の時間帯での平均内部処理時間」における「1週間」という期間の長さは、単なる例示に過ぎず、期間の長さは任意である。例えば、直近の1ヶ月間のうちの当該特定の時間帯での平均内部処理時間が、時間情報として算出されて使われてもよい。
実施形態によっては、図12のステップS204が省略されてもよい。その代わり、選択部309が、図1のステップS2のように新規論理ボリューム用のアクティブ・ストレージコントローラを選ぶ際に、1次集計テーブル群311内の各1次集計テーブルから、式(4)にしたがって平均内部処理時間を算出してもよい。そして、選択部309は、各ストレージコントローラについて算出した平均内部処理時間を、2次集計テーブル312に書き込んでもよい。すると、選択部309は、こうして更新した2次集計テーブル312に基づいて、ステップS2の選択を実行することができる。
つまり、各ストレージコントローラは、ステップS204のように当該ストレージコントローラ自体に関する時間情報(例えば直近の1週間でのI/O要求1件あたりの平均内部処理時間)を更新してもよい。あるいは、各ストレージコントローラは、単に、時間情報の算出用の別の情報を、選択部309からアクセス可能な記憶装置(共有ディスク170)に記憶するだけでもよい。
図10には、「時間情報の算出用の別の情報」の具体例として、1次集計テーブル群311が例示されている。より詳しくは、各ストレージコントローラが時間情報の算出用に共有ディスク170に書き出す情報とは、当該ストレージコントローラに対応する1次集計テーブル中の各平均内部処理時間であってもよい。
例えば、図10のように、直近の1週間以内での長さ1分間の各期間における、I/O要求1件あたりの平均内部処理時間が、時間情報の算出用に、ストレージコントローラにより共有ディスク170に書き出されてもよい。そして、1次集計テーブル群311から2次集計テーブル312への集計自体は、選択部309が実行してもよい。
つまり、選択部309は、予め各ストレージコントローラにより算出された時間情報を読み出すことにより、時間情報を取得してもよいし、自ら時間情報を算出することにより時間情報を取得してもよい。
また、以上のように、各ストレージコントローラの制御部ではなく選択部309が2次集計テーブル312の更新を行う場合は、2次集計テーブル312は、共有ディスク170以外の記憶装置に記憶されていてもよい。例えば、2次集計テーブル312は、管理部307を含むストレージコントローラのRAM212に記憶されていてもよい。つまり、時間情報を記憶する時間記憶部は、RAM212により実現されてもよい。
ところで、I/O要求受信部301a、I/O実行部303a、および制御部304aを実現するためには、図4のCPU211のような汎用的なプロセッサ、ASICなどの専用のハードウェア回路、両者の組み合わせのうち、いずれが使われてもよい。同様に、作成要求受信部308と選択部309を含む管理部307を実現するためには、CPU211のような汎用的なプロセッサ、ASICなどの専用のハードウェア回路、両者の組み合わせのうち、いずれが使われてもよい。
CPU211のような汎用的なプロセッサが使われる場合、プロセッサが実行するプログラムは、不揮発性記憶装置(例えば図4の不揮発性記憶装置213)に予め記憶されていてもよい。プログラムは、ネットワーク(例えばネットワーク140)からダウンロードされて、プロセッサを含む装置(例えばストレージコントローラ120a)にインストールされてもよい。
実施形態によっては、プロセッサが実行するプログラムは、コンピュータ読み取り可能な可搬型の記憶媒体に格納されて提供されてもよい。可搬型の記憶媒体としてはCD(Compact Disc)、DVD(Digital Versatile Disk)などの光ディスク、光磁気ディスク、磁気ディスク、半導体メモリカードなどが利用可能である。なお、これらの可搬型の記憶媒体や、例えば図4のRAM212や不揮発性記憶装置213は、いずれも、有形の(tangible)記憶媒体の一種であり、信号搬送波のような一時的な(transitory)媒体ではない。
ところで、図5の例では、管理部307が、仮想ストレージシステム100内の複数のストレージコントローラのうちの特定の1つ(つまりストレージコントローラ120a)に含まれている。したがって、図5の例では、時間記憶部としての共有ディスク170と管理部307とを含むストレージコントローラ選択システムは、仮想ストレージシステム100と一部のハードウェアを共有している。しかし、管理部307は、どのストレージコントローラとも異なる装置に含まれていてもよい。
例えば、管理部307を含む管理コントローラが、複数のストレージコントローラとは独立して設けられていてもよい。管理コントローラは、ネットワーク130と140の双方に接続される。管理コントローラのハードウェア構成は、例えば図4のストレージコントローラ120と同様であってもよい。
ただし、第1〜第2実施形態のように、あるストレージコントローラの中に管理部307を含む実施形態は、独立した管理コントローラを使う実施形態と比べて、コストの面で優れており、耐障害性の点でも優れている。その理由は以下のとおりである。
複数のストレージコントローラのほかに、さらに、管理部307専用の管理コントローラを使う実施形態では、ユーザにとって、管理コントローラを購入するコストが生じる。しかし、図5のように管理部307がストレージコントローラ120aに含まれる場合、管理コントローラのコストは不要である。
また、管理コントローラを使う実施形態において、仮に管理コントローラが1台しかないとすると、管理コントローラがSPoF(Single Point of Failure)になってしまう。つまり、1台の管理コントローラが故障している間には、新規論理ボリュームが作成不能である。2台以上の管理コントローラを使う冗長構成が採用されてもよいが、そのような冗長構成にはさらにコストがかかる。
ところで、管理部307は、プログラムを実行するCPU211と、通信インタフェイス214と、通信インタフェイス215により実現可能である。そして、CPU211と、通信インタフェイス214と、通信インタフェイス215は、管理部307を含まないストレージコントローラにも含まれるコンポーネントである。つまり、ストレージコントローラに管理部307としての機能を果たさせるためだけに、新たなハードウェア要素をストレージコントローラに追加する必要性は、ないのである。そのため、第1〜第2実施形態は、独立した管理コントローラを使う実施形態よりもコスト面で優れている。
そして、第1〜第2実施形態は、以下に述べる仕組みにより容易に耐障害性を向上させることができる。よって、第1〜第2実施形態は、耐障害性の面でも優れている。
管理部307用のプログラムを、2台以上のストレージコントローラ(例えば、仮想ストレージシステム100内のすべてのストレージコントローラ)に予めインストールしておくものとする。そして、上記2台以上のストレージコントローラのうち、特定の1台(図5の例ではストレージコントローラ120a)でのみ、管理部307用のプログラムを有効にしておくものとする。それにより、特定の1台のストレージコントローラは、管理部307としても動作する。
他方、他のストレージコントローラでは、管理部307用のプログラムをディセーブル(disable)しておくものとする。例えば、図5の例では、ストレージコントローラ120bにおいて管理部307用のプログラムはディセーブルされている。よって、ストレージコントローラ120bは管理部307として動作しない。そのため、図5では、ストレージコントローラ120bの箱には管理部307が図示されていない。
上記の特定の1台のストレージコントローラが故障した場合には、論理ボリュームに関するフェイルオーバだけでなく、管理部307に関するフェイルオーバも行われる。例えば、ストレージコントローラ120aが故障すると、故障の検出に応じて、ストレージコントローラ120bにおいて、インストール済みの管理部307用のプログラムが有効にされてもよい。その結果、ストレージコントローラ120bは、以後、管理部307としても動作するようになる。もちろん、場合によっては、ストレージコントローラ120b以外の他のストレージコントローラが、新たに管理部307としても動作するようになってもよい。
管理部307に関するフェイルオーバは、例えば以上のようにして行われてもよい。そして、管理部307に関するフェイルオーバが可能であることは、管理部307に関する耐障害性に優れていることを意味する。よって、第1〜第2実施形態は、コストの面だけでなく、耐障害性の面においても、独立した管理コントローラを使う実施形態より優れている。
最後に、上記の種々の実施形態に関して、さらに下記の付記を開示する。
(付記1)
各々が1つ以上の物理的記憶装置の集まりである第1の数の論理ユニットのうちの2つ以上に断片化された論理ボリュームの作成を求める作成要求を受信する作成要求受信部と、
それぞれ1つ以上の論理ボリュームを管理する第2の数のストレージコントローラの各々について、当該ストレージコントローラが、当該ストレージコントローラの管理する前記1つ以上の論理ボリュームのうちの1つの論理ボリュームに対する入出力要求を受信する要求受信時点から、当該ストレージコントローラが、前記入出力要求に応じて、当該1つの論理ボリュームが断片化されている先の2つ以上の論理ユニットのうちの少なくとも1つの論理ユニットにアクセスした後、前記少なくとも1つの論理ユニットへのアクセスの結果にしたがって、前記入出力要求に対する応答を送信する応答送信時点までの時間のうち、当該ストレージコントローラの内部での処理にかかる内部処理時間を示す時間情報を記憶する時間記憶部と、
前記作成要求受信部が前記作成要求を受信すると、前記時間記憶部に記憶された前記時間情報に基づいて、前記第2の数のストレージコントローラのうちで前記内部処理時間が相対的に短いストレージコントローラを選択し、選択した前記ストレージコントローラに、前記第1の数の論理ユニットのうちの2つ以上に断片化した新たな論理ボリュームを作成するよう命令する選択部と、
を備えるストレージコントローラ選択システム。
(付記2)
前記作成要求受信部と前記選択部が、前記第2の数のストレージコントローラのうちの1つに含まれ、
前記第2の数のストレージコントローラの各々は、
当該ストレージコントローラが受信する複数の入出力要求の各々について、当該入出力要求に応じてかかる前記内部処理時間を計測し、
当該ストレージコントローラに関して前記時間記憶部に記憶されている前記時間情報を、計測した前記内部処理時間に基づいて更新するか、または、前記時間情報の算出用の別の情報を、前記選択部からアクセス可能な記憶装置に記憶する
ことを特徴とする付記1に記載のストレージコントローラ選択システム。
(付記3)
前記時間記憶部が、前記第2の数のストレージコントローラとネットワークを介して接続されている
ことを特徴とする付記2に記載のストレージコントローラ選択システム。
(付記4)
前記時間情報は、過去のある期間内に生じた複数の入出力要求それぞれに対応する前記内部処理時間から得られる統計量である
ことを特徴とする付記1から3のいずれか1項に記載のストレージコントローラ選択システム。
(付記5)
前記選択部は、前記第2の数のストレージコントローラのうちで、前記内部処理時間が最短のストレージコントローラを選択する
ことを特徴とする付記1から4のいずれか1項に記載のストレージコントローラ選択システム。
(付記6)
前記内部処理時間は、前記要求受信時点から前記応答送信時点までの時間から、前記少なくとも1つの論理ユニットへの前記アクセスの前記結果の受信を待つ時間を除外した時間である
ことを特徴とする付記1から5のいずれか1項に記載のストレージコントローラ選択システム。
(付記7)
前記内部処理時間は、前記入出力要求がキューイングされている時間を含む
ことを特徴とする付記6に記載のストレージコントローラ選択システム。
(付記8)
前記選択部により選択された前記ストレージコントローラの故障に応じて、前記選択部により選択された前記ストレージコントローラに代わって前記新たな論理ボリュームを管理するためのスタンバイ・ストレージコントローラを、前記第2の数のストレージコントローラの中から、前記選択部がさらに選択する
ことを特徴とする付記1から7のいずれか1項に記載のストレージコントローラ選択システム。
(付記9)
前記選択部が、前記スタンバイ・ストレージコントローラも、前記時間情報に基づいて選択する
ことを特徴とする付記8に記載のストレージコントローラ選択システム。
(付記10)
コンピュータが、
各々が1つ以上の物理的記憶装置の集まりである第1の数の論理ユニットのうちの2つ以上に断片化された論理ボリュームの作成を求める作成要求を受信し、
それぞれ1つ以上の論理ボリュームを管理する第2の数のストレージコントローラの各々について、当該ストレージコントローラが、当該ストレージコントローラの管理する前記1つ以上の論理ボリュームのうちの1つの論理ボリュームに対する入出力要求を受信する要求受信時点から、当該ストレージコントローラが、前記入出力要求に応じて、当該1つの論理ボリュームが断片化されている先の2つ以上の論理ユニットのうちの少なくとも1つの論理ユニットにアクセスした後、前記少なくとも1つの論理ユニットへのアクセスの結果にしたがって、前記入出力要求に対する応答を送信する応答送信時点までの時間のうち、当該ストレージコントローラの内部での処理にかかる内部処理時間を示す時間情報を取得し、
前記時間情報に基づいて、前記第2の数のストレージコントローラのうちで前記内部処理時間が相対的に短いストレージコントローラを選択し、
選択した前記ストレージコントローラに、前記第1の数の論理ユニットのうちの2つ以上に断片化した新たな論理ボリュームを作成するよう命令する
ストレージコントローラ選択方法。
(付記11)
コンピュータに、
各々が1つ以上の物理的記憶装置の集まりである第1の数の論理ユニットのうちの2つ以上に断片化された論理ボリュームの作成を求める作成要求を受信し、
それぞれ1つ以上の論理ボリュームを管理する第2の数のストレージコントローラの各々について、当該ストレージコントローラが、当該ストレージコントローラの管理する前記1つ以上の論理ボリュームのうちの1つの論理ボリュームに対する入出力要求を受信する要求受信時点から、当該ストレージコントローラが、前記入出力要求に応じて、当該1つの論理ボリュームが断片化されている先の2つ以上の論理ユニットのうちの少なくとも1つの論理ユニットにアクセスした後、前記少なくとも1つの論理ユニットへのアクセスの結果にしたがって、前記入出力要求に対する応答を送信する応答送信時点までの時間のうち、当該ストレージコントローラの内部での処理にかかる内部処理時間を示す時間情報を取得し、
前記時間情報に基づいて、前記第2の数のストレージコントローラのうちで前記内部処理時間が相対的に短いストレージコントローラを選択し、
選択した前記ストレージコントローラに、前記第1の数の論理ユニットのうちの2つ以上に断片化した新たな論理ボリュームを作成するよう命令する
ことを含む処理を実行させるためのストレージコントローラ選択プログラム。
(付記12)
前記コンピュータが、前記第2の数のストレージコントローラのうちの1つに含まれる
ことを特徴とする付記11に記載のストレージコントローラ選択プログラム。