以下、本実施形態の一例について、説明する。
図1は、本実施例に係るストレージシステム100の構成の概要を示す図である。
図1に示すストレージシステム100は、RAID装置110と、RAID装置110とネットワークまたは専用線130を介して通信可能に接続するRAID装置120と、を備える。
RAID装置110は、キャッシュメモリ等に使用されるメモリを有する制御モジュール#00〜#03と、磁気ディスク装置などの記憶装置で構成されるディスク装置117と、退避バッファ118と、を備える分散キャッシュメモリ型のRAID装置である。
制御モジュール#00〜#03は、ディスク装置117および退避バッファ118と接続する。
制御モジュール#00は、CPU(Central Processing Unit)111aと、メモリ112aと、CA(Channel Adapter)113aと、RA(Remote Adapter)114aと、DA(Device Adapter)115aおよび116aと、を備える。
CPU111aは、所定のプログラム命令を実行して制御モジュール#00を動作させ、本実施例に係る順序性を補償したリモートコピーを実現する。
メモリ112aは、キャッシュメモリに使用される他に、後述する記録専用バッファ201やバッファセット情報記憶部202などに使用されるメモリである。
CA113aは、RAID装置110と接続するホストコンピュータであるホスト150に対するインターフェース制御部である。また、RA114aは、ネットワークまたは専用線130を介して接続される他のRAID装置等に対するインターフェース制御部である。
DA115aおよび116aは、ディスク装置117や退避バッファ118とのインターフェース制御部である。本実施例では、DA115aはディスク装置117と接続し、DA116aは退避バッファ118と接続する。
RAID装置110に備わる他の制御モジュール#01〜#03、RAID装置120に備わる制御モジュール#00〜#03も、上述したRAID装置110に備わる制御モジュール#00と同様の構成である。ただし、コピー先装置120は、退避バッファを備えなくてもよい。
「第1の記憶手段」などは、メモリ112aの一部の領域を用いて実現することができる。また、「第2の記憶手段」は、1または2以上の磁気ディスク装置等で構成されるディスク装置117の一部または全部を用いて実現することができる。
なお、図1では、RAID装置110および120が4つの制御モジュール#00〜#03を備える場合について示しているが、これに限定する趣旨ではない。RAID装置110および120は、分散キャッシュメモリ型のRAID装置であればよい。CPU、CA、RAおよびDAの数についても、図1に示す数に限定する趣旨ではない。
以下の実施例では、RAID装置110からRAID装置120にリモートコピーを行なう場合について説明する。そして、この場合のRAID装置110を「コピー元装置110」といい、RAID装置120を「コピー先装置120」という。
図2は、本実施例に係る制御モジュールが備えるメモリ200、例えば、図1に示したRAID装置110の制御モジュール#00に備わるメモリ112aの具体的な構成例を示す図である。
また、RAID装置110の各制御モジュール#01〜#03に備わるメモリ112b、112cおよび112d、RAID装置120の各制御モジュール#00〜#03に備わるメモリ122a、122b、122cおよび122dも、図2と同様の構成でもよい。
図2に示すメモリ200は、記録専用バッファ201と、バッファセット情報記憶部202と、を備える。また、メモリ200は、バッファ管理テーブル記憶部203と、バッファセット管理テーブル記憶部204と、退避バッファ管理テーブル記憶部205と、未使用バッファID記憶部206と、を備える。
記録専用バッファ201は、バッファ201aとBIT記憶部201bとを備える。
バッファ201aは、ディスク装置117などに記憶するもしくは記憶したデータ、例えば後述するWriteデータなどを一時的に記憶する。本実施例に係るバッファ201aは、一定のサイズを有する8つの領域に区分されている。この区分された領域毎に固有の識別情報が割り当てられる。なお、本実施例ではバッファ201aが8つの領域に区分される場合を例に説明するが、バッファ201aが8つの領域に区分される構成に限定する趣旨でないのは当然である。
以下、この区分された領域を「個別バッファ」という。また、個別バッファに割り当てられる識別情報を「バッファID」という。そして、任意のバッファIDが示す個別バッファに記憶されたデータを「バッファデータ」という。
例えば、図2のバッファ201a内に記載の(0000)、(0001)、(0002)、・・・に関し、括弧内の数字0000、0001、0002、・・・は、個別バッファ毎に割当てられたバッファIDを示す。括弧付きの数字(0000)、(0001)、(0002)、・・・は、それぞれ括弧内のバッファIDが示す個別バッファに記憶されたバッファデータを意味している。
BIT記憶部201bは、バッファ201a内の個別バッファに記憶されているバッファデータが展開されているLU(Logical Unit)やLBA(Logical
Block Address)、データサイズ、コピーセッションの番号などを含むBITを記憶する。
BIT記憶部201bに記載の0000、0001、0002、・・・はバッファ201a内の各個別バッファに割当てられたバッファIDを示している。例えば、BIT記憶部201b内の0000は、バッファIDが0000の個別バッファに記憶されているバッファデータが展開されているLUやLBA、データサイズ、コピーセッションの番号などを含むBITを記憶している。
バッファセット情報記憶部202は、同一RAID装置内の各制御モジュールの個別バッファの組み合わせであって次に使用するものを示す識別情報、すなわち、後述するバッファセットIDを記憶する。
以下、同一RAID装置内の各制御モジュールの個別バッファの組み合わせを、「バッファセット」という。また、バッファセットに割り当てられる識別情報を「バッファセットID」という。そして、バッファセットに関する情報を「バッファセット情報」という。さらに、バッファセットに記憶されるバッファデータを総じて「バッファセットデータ」という。
本実施例では、各制御モジュールのバッファ201aに8個の個別バッファが備わっているので、バッファセットも8個となる。説明を簡単にするために、バッファセットIDは、後述するマスタ制御モジュールの個別バッファのバッファIDと同一であるとする。
バッファセット情報には、RAID装置間でリモートコピーを行なう場合の、コピー元装置110に実装されている制御モジュールに備わる個別バッファと、コピー先装置120に実装されている制御モジュールに備わる個別バッファと、を関連付ける情報も含まれる。この関連付ける情報をバッファセット情報に含める処理を「マッチング処理」という。
以下、コピー元装置110に実装されている制御モジュールに備わる個別バッファのバッファIDを、「コピー元ID」という。同様に、コピー先装置120に実装されている制御モジュールに備わる個別バッファのバッファIDを、「コピー先ID」という。
例えば、RAID装置110は、分散キャッシュメモリ型のRAID装置なので、Writeデータ等のデータを、各制御モジュールの個別バッファ、図2の例ではバッファIDが0000、0100、0200および0300の個別バッファに分散して記憶する。
この場合、バッファセット情報記憶部202には、バッファIDが0000、0100、0200および0300の個別バッファを含むバッファセットを表すバッファセット情報が記憶される。
そして、そのバッファセット情報には、例えば、コピー元IDとコピー先IDが、それぞれ0000と1000、0100と1100、0200と1200、0300と1300であるという組み合わせ情報が含まれる。
なお、図2のバッファセット情報記憶部202に記憶されているバッファID0000、0100、0200および0300は、それぞれコピー元装置110に実装されている制御モジュール#00、#01、#02および#03に備わる個別バッファを示すものとする。
また、図2のバッファセット情報記憶部202に記憶されているバッファID1000、1100、1200および1300は、それぞれコピー先装置120に実装されている制御モジュール#00、#01、#02および#03に備わる個別バッファを示すものとする。
本実施例に係るリモートコピーは、バッファセット単位で行なわれる。このバッファセット単位のコピー対象データには、記録専用バッファ201に記憶されているBITおよびバッファデータと、バッファセット情報記憶部202に記憶されているバッファセット情報と、が含まれる。
本実施例では、このバッファセット単位のコピー対象データを、1つの「世代」として管理する。バッファ管理テーブル記憶部203は、記録専用バッファ201等の管理に使用するバッファ管理テーブル300を記憶する。バッファ管理テーブル300については後述する。
バッファセット管理テーブル記憶部204は、バッファセットの使用状態の管理に使用するバッファセット管理テーブル400、順序性補償リモートコピー管理テーブル410、個別バッファ管理テーブル420、日付別加点テーブル430及び、曜日別加点テーブル440を記憶する。また、退避バッファ管理テーブル記憶部205は、退避バッファ118の管理に使用する全退避バッファ管理テーブル500、LU管理テーブル510、退避バッファセット管理テーブル520、空き退避バッファ管理テーブル530を記憶する。これらのテーブルについては後述する。
未使用バッファID記憶部206は、コピー先装置120に備わる未使用の個別バッファのバッファIDを記憶する。以下、未使用の個別バッファのバッファIDを「未使用バッファID」という。例えば、コピー元装置110は、コピー先装置120から未使用バッファIDの通知を受けると、通知された未使用バッファIDを未使用バッファID記憶部206に記憶する。
以上の構成において、本実施例に係るリモートコピーでは、コピー元装置110は、Writeデータを記録専用バッファ201に格納する処理やWriteデータをコピー先装置120に転送するなどの処理を、バッファセット単位で一括して行なう。
同様に、本実施例に係るリモートコピーでは、コピー先装置120は、コピー先装置110から転送されたWriteデータをディスク装置127に展開する処理などを、バッファセット単位で一括して行う。その結果、順序性を補償したリモートコピーが実現される。
図3は、本実施例に係るバッファ管理テーブル300の構成例を示す図である。
バッファ管理テーブル300は、対象バッファセットIDと、ライトバックポインタ情報と、ステージポインタ情報と、バッファ閾値と、を備える。
対象バッファセットIDは、現在使用しているバッファセットのバッファセットIDを示す情報である。ライトバックポインタ情報は、後述のライトバックの対象となる世代を示す情報である。ステージポインタ情報は、最後に後述のステージングが行なわれた世代を示す情報である。バッファ閾値は、後述のライトバックを実行するか否かを判断する基準として使用する情報である。
図4は、本実施例に係るバッファセット管理テーブル400の構成例を示す図である。
バッファセット管理テーブル400は、バッファセットIDごとに、使用目的、対象世代を備え、更に各ID毎に、バッファセットの対象となる制御モジュール番号、バッファBusy状態及び格納数を記憶している。
バッファセット管理テーブル400は、バッファセットIDが示すバッファセット毎にあらかじめ設定される使用目的である。例えば、バッファセットを、ステージングに使用する場合には「ステージング」が設定され、ライトバックに使用する場合には「ライトバック」が設定される。また、Writeデータのコピーデータを単に記憶する場合には「記憶」が設定され、記憶されたコピーデータをコピー先装置120に転送する場合には「転送」が設定される。
対象世代は、使用目的に設定された処理を行なう対象の世代である。格納数は、バッファセットに記憶されているデータの数である。図5のように1世代最大サイズ8MByteで格納サイズが1つあたり8KByteであった場合、最大1024まで格納が可能となる。対象世代および格納数は、例えば、Writeデータをバッファセットに記憶する毎に、コピー元装置110によって更新される。
また、順序性補償リモートコピー管理テーブル410は、順序性を補償したリモートコピーを行うことができるか判断する際に使用するテーブルである。この順序性補償リモートコピー管理テーブル410は、図5に示されるように、バッファ切り替えに要する時間(秒)、1世代分のバッファセットの最大サイズ(Mbyte)、Halt待ち状態となっているか否かの判断フラグ情報(Halt待ち状態であれば、Yes、そうでなければ、No)、及び、格納サイズ(KByte)を記憶する。
また、日付別加点テーブル430、曜日別加点テーブル440は、それぞれ、日付別、曜日別に加点情報を記憶しておくテーブルであり、その例を図6、図7に示す。なお、図6,8では、時刻情報は特に明記していないが、これらテーブルは、1時間単位で用意されており、該当する曜日若しくは日付の該当時刻のテーブルに記憶が行われるものとする。
また、図8は、全退避バッファ管理テーブル500を示す図である。
この全退避バッファ管理テーブル500は、退避バッファ118にある論理ユニットLUの数の数、全制御モジュール数、退避バッファ118内の、全バッファ数、最大バッファセット数が記憶される。加えて、全退避バッファ管理テーブル500は、退避バッファ単位サイズ(MByte)、Write Back退避バッファセット番号、Stagingバッファセット番号が記憶されている。
ここで、論理ユニットLUについて補足する。図9は、本実施の形態における退避バッファの構成例を示す図である。
図9に示す退避バッファ118として用いられるRAIDグループは、RAID600〜607の8グループあり、各々論理ユニットLU#0〜LU#7を有する。
論理ユニットLU#0~LU#7の情報は、各々、退避バッファ管理テーブル記憶部205内の、LU管理テーブル510として記憶されている、図10は、このLU管理テーブル510を示したものである。なお、図10ではLU番号が0,1(LU#0,LU#1にそれぞれ対応)の論理ユニットのLU管理テーブル510しか示していないが、その他の論理ユニット#2〜#7のLU管理テーブル510も、退避バッファ管理テール510に記憶されているものとする。
この管理情報は、退避バッファ管理テーブル記憶部205内に、退避バッファ管理テーブル520として記憶されている。図11は、この退避バッファ管理テーブル520の例を示したものである。この退避バッファセット管理テーブル520に示されるように、退避バッファセット毎に、対応する制御モジュールの番号、対応する論理UNITの番号とその退避バッファオフセット及ぶ退避バッファ数が記憶される。図8で示した様に、全体比バッファセット数は、395008なので、この退避バッファセット520は、その数と同じだけ退避バッファ管理テーブル記憶部205に記憶されていることになる。
例えば、図11に示される退避バッファセット番号1の管理テーブル520を参照すると、制御モジュール番号#00、#01、#02に対応するLU番号は、それぞれ、1,3,4である。説明の都合で図示できなかったが、制御モジュール番号#03のLU番号は7であったとする。この場合、各々の制御モジュールは、この退避バッファセット番号1のバッファセットに対しては、図11に示すように上記対応関係に応じた割り当てがなされることになる。また、この対応付けは、各退避バッファセット520毎に設定することができる。例えば、図11に示される退避バッファセット番号0の管理テーブル520を参照すると、各制御モジュール#00,#01,#02は、それぞれ、1,3,4であり、先に説明した退避バッファセット番号0の管理テーブル520とは異なる対応関係となっている。また、バッファセットは、制御モジュールの数分のバッファをセットとするものであるので、全退避バッファ管理テーブル500の最大バッファセット数は、全退避バッファ数(1580032)を全制御モジュール数(4)で割った数(395008)が記憶されている。
また、上記したように論理ユニット毎に、空き退避バッファ管理テーブル530が、退避バッファ管理テーブル記憶部205内に記憶されている。この空き退避バッファ管理テーブル530は、図12に示すように、各論理ユニットの該当退避バッファオフセットが使用中か否かを判断するための情報を、ビットマップで記憶している。本実施の形態では、「1」が使用中、「0」が空きとしている。
コピー元装置110は、転送中またはコピー先装置120における展開処理待ちのため使用中となっているバッファセットの数がバッファ閾値を超えると、その超えた分のバッファセットに記憶されるデータを退避バッファ118に退避する。
また、コピー元装置110は、転送中またはコピー先装置120における展開処理待ちのために使用中となっているバッファセットが解放されると、退避バッファ118に退避されていたデータを、その解放されたバッファセットに記憶する。
以下、本実施例では、バッファセットに記憶されているデータを退避バッファ118に退避することを「ライトバック」という。そして、退避バッファ118に退避されているデータをバッファセットに記憶することを「ステージング」という。
また、ステージング、転送またはコピー先装置120における展開処理待ちのため使用中となっているバッファセットの数を「使用中のバッファセット数」という。なお、この転送中のバッファセットには、ステージング中の状態にあるバッファセットも含まれるものとする。
なお、「使用中のバッファセット数」の代りに、例えば、「バッファセットの使用率」を使用してもよい。この場合、バッファセットの使用率は、「使用中のバッファセット数」/「全バッファセットの数」により求められる。
コピー元装置110は、Write I/O処理にともなう処理の負荷に応じてバッファ閾値を増減して最適化を行なう。Write I/O処理にともなう処理の負荷は、例えば、ホスト150から受け付けて未処理のまま待ち状態となっているWrite I/Oの数などで判断することができる。
なお、Write I/O処理にともなう処理の負荷の代わりに、例えば、ライトバック/ステージング性能、Write I/O命令等によるデータ更新量、バッファセットの使用状況、コピー元装置110−コピー先装置120間の回線速度などのうち少なくとも1つを含む情報を使用してバッファ閾値を最適化してもよい。
図13および図14は、本実施例に係るバッファ退避処理を説明する図である。
なお、図13および図14は、理解を容易にするために、コピー元装置110の構成を簡略化して記載してある。例えば、制御モジュールは、#00と#01のみを記載しているが、コピー元装置110を図13および図14に示す構成に限定する趣旨ではない。また、制御モジュール毎にディスク装置117を記載しているが、説明のし易さのためであって、コピー元装置110を図13および図14に示す構成に限定する趣旨ではない。
図13は、バッファセット1−4が、転送中またはコピー先装置120における展開処理待ちのため使用中となっている状態で、Write I/O命令を受付けた場合のバッファ退避処理を説明する図である。以下、バッファセット1−4に記憶されているバッファセットデータがそれぞれ世代1、世代2、世代3および世代4であるものとする。また、コピー元装置110に備わる全制御モジュールを総じて「制御モジュール」という。
(a)Write I/O命令を受付けると、制御モジュールは、自身のディスク装置117にWriteデータを記憶するとともに、(b)Writeデータのコピーデータをバッファセット5に記憶する。このバッファセット5に記憶されたバッファセットデータは世代5となる。
ここで、例えば、使用中のバッファセット数がバッファ閾値を超えると、(c)制御モジュールは、次にコピー先装置120に転送予定の例えばバッファセット5に記憶されている世代5のバッファセットデータを退避バッファ118に退避する。その後、制御モジュールは、バッファ閾値の最適化を行なう。
また、バッファセットデータを退避バッファ118に退避すると、制御モジュールは、新たなWriteデータ等の記憶先をバッファセット5からバッファセット6に切り替える。
(d)新たなWrite I/O命令を受付けると、制御モジュールは、Writeデータをディスク装置に記憶するとともに、Writeデータのコピーデータをバッファセット6に記憶する。このバッファセット6に記憶されたバッファセットデータは世代6となる。
この時、バッファセット6の世代6よりも古い世代、例えば図9では世代5が退避バッファ118に退避されているので、(e)制御モジュールは、バッファセット6のバッファセットデータを退避バッファ118に退避する。
使用中の状態にあったバッファセット1が解放されると、(f)制御モジュールは、退避バッファ118に記憶されている世代5のバッファセットデータを読み出して、バッファセット1に記憶する。なお、本実施例で「解放」とは、バッファセットを未使用の状態に置くことをいう。
バッファセット1のバッファデータの転送およびコピー先装置120における展開処理が完了すると、制御モジュールは、バッファ閾値の最適化を行なう。
図15および図16は、本実施例に係るリモートコピーの概要を示すフローチャートである。以下、図15および図16に基づいて、本実施例に係るリモートコピーの概要を説明する。 コピー元装置110は、起動すると、バッファ初期構成処理を行なう。例えば、コピー元装置110は、あらかじめ設定された構成情報にしたがって、各制御モジュールに備わるメモリ200に、図2に示した構成の領域を確保し、各領域について初期化を行なう。
また、コピー元装置110は、制御モジュール毎に、記録専用バッファに対するボリュームグループを割り当てる。具体的な処理は、図18および図19で説明する。
また、コピー元装置110は、バッファセットを生成し、生成したバッファセットについて初期作成処理を行う。例えば、コピー元装置110は、各制御モジュールの個別バッファを組み合わせてバッファセットを生成する。そして、コピー元装置110は、生成したバッファセットをバッファセット情報としてバッファセット情報記憶部202に記憶する。
以上の処理をコピー先装置120も行なう。
コピー元装置110は、さらに、バッファ管理テーブル300やバッファセット管理テーブル400、退避バッファ管理テーブル500などについて初期化を行なう。そして、コピー元装置110は、バッファ閾値を初期化する。具体的な処理は、図20で説明する。
以上の処理により、コピー元装置110−コピー先装置120間でリモートコピーを行なう準備が完了する。そして、ホスト150からWrite I/O命令を受け付ける準備が完了すると、リモートコピーが開始する(ステップS1200a、S1200b)。
ステップS1201aにおいて、コピー元装置110は、コピー先装置120に対して、未使用の個別バッファの通知を要求するために、未使用バッファ通知要求コマンドを発行する。
一方、コピー先装置120は、ステップS1201bに処理を移行し、コピー元装置110からの未使用バッファ通知要求コマンドを受けるまで、未使用バッファ通知要求コマンドを監視する(S1201b NO)。
ステップS1201bにおいて、コピー先装置120は、コピー元装置110からの未使用バッファ通知要求コマンドを検出すると(S1201b YES)、処理をステップS1202bに移行する。
ステップS1202bにおいて、コピー先装置120は、既に領域が解放された未使用となっている個別バッファを検索する。既に領域が解放されて未使用となっている個別バッファを検出すると、コピー先装置120は、検出した個別バッファのバッファIDを未使用バッファIDとしてコピー元装置110に通知する。
一方、コピー元装置110は、コピー先装置120から未使用バッファIDの通知を受けると、通知された未使用バッファIDを、未使用バッファID記憶部206に記憶する。
ステップS1202aにおいて、コピー元装置110は、Writeデータを格納する対象のバッファセットを取得する。このWriteデータを格納する対象のバッファセットを「格納対象バッファセット」という。
例えば、コピー元装置110は、バッファセット管理テーブル400を参照し、未使用に設定されているバッファセットIDを取得する。そして、コピー元装置110は、その取得したバッファセットIDを、バッファ管理テーブル300の対象バッファセットIDに設定する。
コピー元装置110は、バッファ管理テーブル300の対象バッファセットIDに設定したバッファセットIDが示すバッファセットを、「格納対象バッファセット」として以下の処理を行なう。
なお、コピー元装置110は、ステップS1202aでは、マッチング処理を行なわない。コピー元装置110は、マッチング処理を、後述するステップS1211a、すなわち、バッファセットデータの送信処理前に行なう。
ステップS1203aにおいて、コピー元装置110は、バッファ管理テーブル300のライトバックポインタ情報に設定されている世代を1だけインクリメントした値に更新する。
ステップS1204aにおいて、コピー元装置110は、格納対象バッファセットの個別バッファへのWriteデータの格納処理を行なう。
例えば、コピー元装置110が、ホスト150からWrite I/O命令を受付けたとする。すると、コピー元装置110は、そのWrite I/O命令とともに受信したWriteデータを、バッファ管理テーブル300の現在使用している対象バッファセットIDが示す格納対象バッファセット、すなわち、各制御モジュールの個別バッファに分散して記憶する。なお、この個別ファッファへの格納処理1204aの詳細については、後述する。
ステップS1205aにおいて、コピー元装置110は、格納対象バッファセットにデータを格納する格納領域が残っているか否かを判別する。格納領域が残っていないと判断した場合(ステップS1205a NO)、コピー元装置110は、処理をステップS1207aに移行する。
また、ステップS1205aにおいて、格納領域が残っていると判断した場合(ステップS1205a YES)、コピー元装置110は、処理をステップS1206aに移行する。この場合、コピー元装置110は、格納対象バッファセット取得から一定時間経過したか否かを判別する(ステップS1206a)。
そして、一定時間経過していないと判断した場合(ステップS1206a NO)、コピー元装置110は、処理をステップS1204aに移行する。また、一定時間経過したと判断した場合(ステップS1206a YES)、コピー元装置110は、処理をステップS1207aに移行する。
ステップS1207aにおいて、コピー元装置110は、ステップS1202aと同様の処理により、格納対象バッファセットを新たに取得する。そして、ステップS1208aにおいて、コピー元装置110は、格納対象バッファセットを、ステップS1207aで取得した新たな格納対象バッファセットに切り替える。
なお、切り替え前の格納対象バッファセットを、ステップS1210aの処理では「ライトバック対象バッファセット」といい、ステップS1212a以降の処理では「転送対象バッファセット」という。
ステップS1209aにおいて、コピー元装置110は、ステップS1203と同様の処理により、ライトバックポインタ情報を更新する。
ステップS1210aにおいて、コピー元装置110は、ライトバック処理を行なう。その後、コピー元装置110は、バッファ閾値の最適化を行なう。そして、コピー元装置110は、処理をステップS1211aに移行する。
ステップS1211aにおいて、コピー元装置110は、マッチング処理を行なう。例えば、コピー元装置110は、未使用バッファID記憶部206から未使用バッファIDを取得する。そして、コピー元装置110は、取得した未使用バッファIDを転送対象バッファセットのコピー先IDに割り当てることにより、転送対象バッファセットのコピー元IDとコピー先IDとの関連付けを行なう。
ステップS1212aにおいて、コピー元装置110は、転送対象バッファセットに記憶されたバッファセットデータをコピー先装置120に送信する。このバッファセットデータには、各制御モジュールの、バッファ201aに記憶されているバッファデータと、BIT記憶部201bに記憶されているBITと、バッファセット情報記憶部202に記憶されているバッファセット情報と、が含まれる。
一方、コピー先装置120は、コピー元装置110からバッファセットデータを受信すると、処理をステップS1203bに移行する。
ステップS1203bにおいて、コピー先装置120は、バッファセットデータの受信処理を行なう。例えば、コピー先装置120は、受信したバッファセットデータのうち、バッファデータをバッファ201aに、BITをBIT記憶部201bに、バッファセット情報をバッファセット情報記憶部202に、それぞれ記憶する。
ステップS1204bにおいて、コピー先装置120は、全てのバッファセットデータを受信したか否かを判別する。そして、まだ、全てのバッファセットデータを受信していないと判断すると(S1204b NO)、コピー先装置120は、処理をステップS1203bに移行し、ステップS1203b〜S1204bの処理を繰返す。
ステップS1204bにおいて、全てのバッファセットデータを受信したと判断すると(S1204b YES)、コピー先装置120は、処理をステップS1205bに移行する。
ステップS1205bにおいて、コピー先装置120は、ステップS1203bで取得したバッファセットデータが、自身に備わる記憶装置のディスク装置127に展開可能か否かを判断する。展開可能と判断すると(S1205b YES)、コピー先装置120は、処理をステップS1206bに移行する。
ステップS1206bにおいて、コピー先装置120は、ステップS1203bで取得したバッファセットデータを、自身に備わるディスク装置127に展開する。この展開が終了すると、コピー先装置120は、処理をステップS1207bに移行し、バッファセットデータの展開が完了した旨をコピー元装置110に通知する。以下、この通知を「バッファセットデータ展開完了通知」という。
バッファセットデータのディスク装置127への展開が終了すると、ステップS1208bにおいて、コピー先装置120は、バッファセットの解放処理を行なう。例えば、コピー先装置120は、バッファセットデータのディスク装置127への展開が完了したバッファセットを未使用に設定する。
ステップS1209bにおいて、コピー先装置120は、解放した領域に新たにバッファセット情報記憶部202および記録専用バッファ201の領域を確保して、例えば、図2に示した構成を構築する。
以上の処理が終了すると、コピー先装置120は、処理をステップS1210bに移行し、ステップS1208b〜S1209bの処理によって新たに使用可能となったバッファの未使用バッファIDをコピー元装置110に通知する(ステップS1210b)。コピー元装置110は、未使用バッファIDを通知されると、通知された未使用バッファIDを未使用バッファID記憶部206に記憶する。
一方、ステップS1213aにおいて、コピー元装置110は、コピー先装置120からバッファセットデータ展開完了通知を受信したか否かを判断する。そして、バッファセットデータ展開完了通知を受信しない場合(S1213a NO)、ステップS1213aの処理を繰り返す。また、コピー先装置120からバッファセットデータ完了通知を受信すると(S1213a YES)、コピー元装置110は、処理をステップS1214aに移行する。
ステップS1214aにおいて、コピー元装置110は、ステップS1212aによってバッファセットデータ送信処理が行なわれた転送対象バッファセットについて、ステップS1208bと同様に、バッファセットの解放処理を行なう。すなわち、コピー元装置110は、バッファセット管理テーブル400を参照し、データの転送が完了した転送対象バッファセットを未使用に設定する。
ステップS1215aにおいて、コピー元装置110は、バッファ管理テーブル300を参照し、ステージポインタ情報に設定されている世代を1だけインクリメントした値に更新する。そして、ステップS1216aにおいて、コピー元装置110は、バッファ閾値を最適化する処理を実行する。そして、ステップS1217aにおいて、コピー元装置110は、未使用となったバッファセットの領域について初期化を行なうなどしてバッファの再構築処理を行なう。
ステップS1218aにおいて、コピー元装置110は、ステージングが必要か否かを判別する。例えば、コピー元装置110は、退避バッファ118に退避した世代があるか否かによりステージングが必要か否かを判別する。
コピー元装置110は、以下に示す(a)〜(d)の処理により、退避バッファ118に退避した世代の有無を知ることができる。
(a)コピー元装置110は、バッファ管理テーブル300を参照し、ライトバックポインタ情報とステージポインタ情報を取得する。
(b)コピー元装置110は、バッファセット管理テーブル400を参照し、ステージポインタ情報に1を加えた世代から昇順に世代をたどり、バッファセット管理テーブル400に欠落している世代を検索する。
例えば、図3に示したバッファ管理テーブル300には、ステージポインタ情報として世代2が設定されている。そこで、コピー元装置110は、図4に示したバッファセット管理テーブル400を参照し、世代2に1を加えた世代3から世代4、5、・・・と昇順に世代をたどる。すると、コピー元装置110は、バッファセット管理テーブル400に欠落している世代7を検出する。
(c)コピー元装置110は、バッファセット管理テーブル400を参照し、ライトバックポインタ情報の世代から降順に世代をたどり、バッファセット管理テーブル400に欠落している世代を検索する。
例えば、図3に示したバッファ管理テーブル300には、ライトバックポインタ情報として世代15が設定されている。そこで、コピー元装置110は、図4に示したバッファセット管理テーブル400を参照し、世代15から世代14、13、・・・と降順に世代をたどる。すると、コピー元装置110は、バッファセット管理テーブル400に欠落している世代12を検出する。
(d)以上の処理によって検出した世代7から世代12が、退避バッファ118に退避されている世代であることがわかる。
ステップS1218aにおいて、退避バッファ118に退避した世代が存在すると判断した場合(ステップS1218a YES)、コピー元装置110は、処理をステップS1219aに移行する。また、退避バッファ118に退避した世代が存在しないと判断した場合(ステップS1218a NO)、コピー元装置110は、処理をステップS1221aに移行する。
ステップS1219aにおいて、コピー元装置110は、ステージングに使用するバッファセット、すなわちステージング用バッファセットを取得する。
例えば、コピー元装置110は、バッファセット管理テーブル400を参照し、未使用に設定されているバッファセットIDを「ステージング対象バッファセットID」として取得する。
また、コピー元装置110は、バッファセット管理テーブル400を参照し、ステージング対象バッファセットIDと一致するバッファセットIDの対象世代に、後述するステージング対象世代を設定する。
また、コピー元装置110は、バッファセット管理テーブル400を参照し、ステージング対象バッファセットIDと一致するバッファセットIDの使用目的を「ステージング」に設定する。
ステップS1220aにおいて、コピー元装置110は、ステージングを実行する。そして、ステージングが完了すると、コピー元装置110は、処理をステップS1211aに移行する。
以上の処理が終了すると、コピー元装置110は、リモートコピーを終了、または、ステップS1204aに処理を移行してリモートコピーを継続する。また、ホスト150から新たにWrite I/O命令を受付けると、コピー元装置110は、S1204a等に処理を移行して、リモートコピーを継続する。
また、コピー先装置120は、上述の処理が終了すると、リモートコピーを終了する、または、ステップS1203bに処理を移行してリモートコピーを継続する。
本実施例に係るリモートコピーにおいて、以下の処理についてより具体的に説明する。
(1)退避バッファ118の領域を作成する処理。
(2)退避バッファセット管理テーブル記憶部205の各テーブルの生成。
(3)バッファ閾値を初期化する処理。
(4)バッファセットを切り替える処理。
(5)ライトバックポインタ情報/ステージポインタ情報の更新処理。
(6)ライトバック処理。
(7)再配置スケジューリング処理。
(8)ステージング処理。
(9)バッファ閾値を最適化する処理。
以下、上記(1)〜(9)について順に説明する。
(1)退避バッファの領域を作成する処理
図17は、本実施例に係る退避バッファ118の領域を生成する処理を示すフローチャートである。図17に示す処理は、例えば、コピー元装置110の保守作業時やコピー元装置の起動時に実行できる。
ステップS1401において、コピー元装置110は、ユーザーからの入力に応じて退避バッファ118を設定すべき領域を記録専用バッファ201のバッファ201aから選択する。そして、コピー元装置110は、処理をステップS1402に移行し、ユーザーからの入力に応じてRAIDを構成するためのディスク装置を選択する。
ステップS1403において、コピー元装置110は、ステップS1402で選択したディスク装置はRAIDを構成する条件を満たすか否かをチェックする。条件を満たさない場合(S1403 NO)、コピー元装置110は、例えば、他のディスク装置を指定すべき旨を表示装置等に表示して、処理をステップS1402に移行する。
ステップS1403において、条件を満たす場合(S1403 YES)、コピー元装置110は、処理をステップS1404に移行する。
ステップS1404において、コピー元装置110は、ステップS1402で選択されたディスク装置で構成されるRAIDグループを生成し、コピー元装置110の装置構成などを保持する構成情報にその情報を反映する。
ステップS1405において、コピー元装置110は、ステップS1404で作成したRAIDグループ内に複数のボリュームを作成する。コピー元装置110は、処理をステップS1406に移行し、ステップS1405で作成した論理ユニットの構成を構成情報に反映する。
ステップS1407において、コピー元装置110は、図18で示す処理によって、退避バッファセット管理テーブル2記憶部205の各テーブルの生成を行う。
そして、ステップS1408において、コピー元装置110は、バッファ閾値を初期化する。すると、コピー元装置110は、ステップS1409に移行して退避バッファ118の領域を生成する処理を終了する。
(2)退避バッファセット管理テーブル記憶部205の各テーブルの生成
上記してきた図17の処理のうち、S1407の処理の詳細について図18のフローチャートを用いて説明する。
まず、コピー元装置110は、ユーザーから設定された退避バッファセットの容量(ここでは1MByte)とLUの数から、LU管理テーブル510を生成する。上記したように、論理ユニット毎にこのテーブルを生成するので、論理ユニット数分(本実施の形態では8)のLU管理テーブル510が生成される。
具体的には、論理ユニットの容量を退避バッファサイズの容量で割った数を最大退避バッファ数として記憶する。(ステップS1501)
また、起動時や管理時には、退避バッファセットは使用されていないので、使用退避バッファ数は0、空き退避バッファ数は、最大退避バッファ数と同じになる。その他、退避バッファサイズ、LU番号も設定される。また、退避バッファ性能は、論理ユニットにて退避処理を行う際の転送速度に応じて値が決められているものとする。
次に、コピー元装置110は、全退避バッファ管理テーブル500を生成する(ステップS1502)。この全退避バッファ管理テーブル500には、これまでの処理もしくは設定された各種値を用いて生成される。まず、論理ユニットLUの数は、上記してきたように#0〜#7の8であり、制御モジュールの数は4である。また、コピー元装置110は、各LU管理テーブルに記憶されている最大退避バッファセットの数を合計し、全退避バッファ数を生成する。加えて、コピー元装置110は、全退避バッファ数を全制御モジュール数で割った数を最大退避バッファ数として算出する。これは、上記したようにバッファセットは、全ての制御モジュール#00〜#03で使用されるバッファのセットであるので、バッファセットの数は「バッファ数÷制御モジュール数」となるためである。
更に、コピー元装置110は、退避バッファ単位サイズ(先に説明したように1MB)を記憶するとともに、Write Back、Stagingのバッファセット番号を初期設定する(本実施の形態では各々0を設定したものとする)。
更に、コピー元装置110は、上記にて得られた情報を元に退避バッファセット管理テーブル520を生成する(ステップS1503)。これは、退避バッファセットの数だけ生成される。
すなわち、全退避バッファテーブル生成時に算出された全退避バッファセット数が、197504であるので、本実施の形態では、197504の場合退避バッファセット管理テーブル520が生成されることになる。コピー元装置110は、この退避バッファセット管理テーブルに、制御モジュール毎に、使用する論理ユニットの退避バッファオフセットを示す情報、即ち論理ユニットの番号(LU番号)と、その退避バッファオフセットと退避バッファの数とを記憶させる。当然、コピー元記憶装置110は、このアドレスが、他のバッファと記憶領域が重複しないように排他制御を行いながら設定していく。
次に、コピー元装置110は、空き退避バッファ管理テーブル530を、論理ユニット単位で生成する(ステップS1503)。この空き退避バッファ管理テーブル530は、図12に示すように、各退避バッファセットが使用中か否かを判断するための情報を、ビットマップで記憶している。上記したように、本実施の形態では、コピー元装置110は、「1」が使用中、「0」が空きとして記憶する。この初期設定の段階においては全て使用されていないので、コピー元装置110は、全てのビットが「0」となった空き退避バッファ管理テーブルを生成する。
(3)バッファ閾値を初期化する処理
図19は、本実施例に係るバッファ閾値を初期化する処理のフローチャートである。この図19に示す処理は、例えば、コピー元装置110の起動時の他に、保守作業時でも実行できる。
ステップS1301において、コピー元装置110は、メモリ200の所定のアドレスから、制御モジュール数(CTRL_CNT)、バッファサイズ(BUFF_SIZE)[MByte]、バッファセットサイズ(1GENE_SIZE)[MByte]、回線帯域(BANDWIDTH)[MByte/S]、転送効率(TRANS_RATIO)、制御効率(SYSTEM_RATIO)、データ圧縮率(COMPRESS)[%]および補正送信バッファ数(BUFF_ALPHA)を読み出す。
制御モジュール数(CTRL_CNT)は、コピー元装置110に備わる制御モジュールの数である。バッファサイズ(BUFF_SIZE)は、各制御モジュールに備わるバッファ201aを合わせたトータルサイズである。バッファセットサイズ(1GENE_SIZE)は、1世代分のバッファセットのサイズである。
回線帯域(BANDWIDTH)は、コピー元装置110−コピー先装置120間を接続するネットワークまたは専用回線130で使用可能な帯域幅である。
転送効率(TRANS_RATIO)は、コピー元装置110−コピー先装置120間で行なわれる転送処理についての転送効率である。例えば、理論的な転送量が100Mbps、実測値の平均転送量が75Mbpsの場合、転送効率は0.75となる。
制御効率(SYSTEM_RATIO)は、原則として1とする。そして、例えば、ホスト150−コピー元装置110間のデータ転送効率、制御モジュール間の転送効率、制御モジュール−退避バッファ118間のデータ転送効率等に応じてバッファ閾値を調整するために使用する。
データ圧縮率(COMPRESS)は、コピー先装置120に送る際に行なう送信データの圧縮率である。また、補正値(BUFF_ALPHA)は、必要に応じてバッファ閾値を調整するための値である。
以上のデータを読み出すと、コピー元装置110は、次式によりバッファ閾値(THRESHOLD)を算出する。そして、コピー元装置110は、処理をステップS1302に移行する。THRESHOLD = ((BANDWIDTH×TRANS_RATIO×SYSTEM_RATIO)÷(1GENE_SIZE×(COMPRESS÷100)×CTRL_CNT)+BUFF_ALPHA)×2 ・・・・・(1)
ステップS1302において、コピー元装置110は、バッファ閾値が1未満か否かを判別する。そして、バッファ閾値が1未満の場合(ステップS1302 YES)、コピー元装置110は、処理をステップS1303に移行する。この場合、コピー元装置110は、バッファ閾値に1を設定し(ステップS1303)、処理をステップS1304に移行する。
また、ステップS1302において、バッファ閾値が1未満でない場合(ステップS1302 NO)、コピー元装置110は、処理をステップS1304に移行する。
ステップS1304において、コピー元装置110は、バッファ閾値が最大バッファセット数を超えているか否かを判別する。そして、バッファ閾値が最大バッファセット数を超えている場合(ステップS1304 YES)、コピー元装置110は、処理をステップS1305に移行する。この場合、コピー元装置110は、バッファ閾値に最大バッファセット数を設定し(ステップS1305)、処理をステップS1306に移行する。
また、ステップS1304において、バッファ閾値が最大バッファセット数を超えていない場合(ステップS1304 NO)、処理をステップS1306に移行する。
以上の処理が終了すると、コピー元装置110は、バッファ閾値を初期化する処理を終了する。
(4)バッファセットを切替える処理
図20は、本実施例に係るバッファセットの切替え処理を示すフローチャートである。
図20の処理は、図15に示したステップS1208aの具体的な処理を示している。
例えば、Write I/O延長で行なわれる格納処理でバッファセット内の個別バッファに空きがなくなる、または、バッファセットの切替え処理が行なわれてから一定時間経過すると、コピー元装置110は、バッファセットの切替え処理を開始する(ステップS1600)。
ステップS1601において、コピー元装置110は、空きバッファセット、すなわち、バッファセット管理テーブル400に未使用と設定されているバッファセットがあるか否かを判別する。
ステップS1601において、空きバッファセットがない場合(ステップS1601 NO)、コピー元装置110は、処理をステップS1602に移行し、バッファHalt処理待ちの状態となる(ステップS1602)。その後、バッファHalt処理が実行されてバッファ枯渇状態が解消すると、コピー元装置110は、Write I/O命令の処理を再開する。
この場合、コピー元装置110は、バッファセットに記憶されているWriteデータ等の情報を専用のビットマップに書き戻し、バッファHalt処理の実行後にそのビットマップにしたがって順序性を補償しないリモートコピー転送を行なう。
ステップS1601において、空きバッファセットがある場合(ステップS1601 YES)、コピー元装置110は、処理をステップS1603に移行する。
ステップS1603において、コピー元装置110は、空きバッファセットを1つ選択して、その空きバッファセットのステータスを使用中に変更する。また、必要に応じてバッファセット管理テーブル400の使用目的に、ステージング、ライトバックまたは記憶を設定する(ステップS1603)。また、コピー元装置110は、選択した空きバッファセットに切り替える。(ステップS1604)
ステップS1603の処理が完了すると、コピー元装置110は、個別バッファBusy状態決定処理を行う(ステップS1605)。
この個別バッファBusy状態決定処理について、図21を用いて説明する。
この処理は、空きバッファセット切り替えにあたり、その状態を逐次、バッファセット管理テーブル400に反映する処理を含む。
個別バッファBusy状態決定処理において、まず、コピー元装置110は、蓄積していた個別バッファセットがコピー対象データを格納したことが原因で切り替えがなされたものかを確認する。これは、図15のS1205aにて「NO」の判断を行ったかをチェックする。即ち、S1651の処理は、格納領域が残っている場合でも、S1206aの処理にて、個別バッファセットの切り替えが起こる場合があるため、これを切り分けるために、行う処理である。
ステップS1651にてNOの場合は、個別バッファセットへのアクセス自体は少ない状態でもあるので、対象となる個別バッファセットの個別バッファセット管理テーブル440の状態を「Normal」に更新し、処理を完了する。(S1652)
逆に、ステップS1651にて、YESとなった場合、コピー元装置110は、日付別加点テーブル430、曜日別加点テーブル440のうち、該当する時刻のテーブルに対し、日付もしくは曜日の値を、それぞれ加算する。(ステップS1653)
そして、コピー元装置110は、対象となった個別バッファセットに対応するバッファセット管理テーブル400の状態を「Busy」に更新し、処理を終了する。(ステップS1654)
図20のフローチャートに戻り、ステップS1605の処理コピー元装置110は、Write I/O命令を管理する待ち行列等を参照し、待ち状態のWrite I/Oについて処理を再開する。(S1606)
以上の処理が終了すると、コピー元装置110は、バッファセットを切り替える処理を終了する。
(5)ライトバックポインタ情報/ステージポインタ情報の更新処理
本実施例に係るバッファ退避処理では、ライトバックポインタ情報とステージポインタ情報の2つの情報により、退避バッファ118に記憶するデータの書き込み位置(世代)と退避バッファ118から読み出すデータの読み出し位置(世代)とを管理する。
例えば、制御モジュールにおいてx回目のバッファセット切り替えが行なわれた場合を考える。この場合、ステージポインタ情報は、最後にステージングが行なわれた世代を情報として保持する。ライトバックポインタ情報は、退避バッファ1701の世代xを情報として保持する。
また、制御モジュールにおいてx+1回目のバッファセット切り替え時に世代xのバッファセットデータがすぐにコピー先装置120に転送された場合を考える。この場合、世代xに記憶されているバッファセットデータがステージングされて転送処理が完了すると、ステージポインタ情報は、世代xから世代x+1に更新される。ライトバックポインタ情報は、退避バッファ1701の世代x+1を情報として保持する。
また、制御モジュールにおいてx+2回目のバッファセット切り替え時に世代x+1が退避バッファ1701にライトバックされた場合を考える。この場合、ステージポインタ情報が保持する退避バッファ1701の世代が世代xであれば、次のステージング対象は世代x+1となる。ライトバックポインタ情報は、ボリュームグループの世代x+2を保持する。
以上のように、ライトバックポインタ情報は、バッファセットが生成される毎にそのバッファセットの次の世代を情報として保持する。また、ステージポインタ情報は、切り替えられた旧世代のバッファセットの処理が完了する毎に、例えば、コピー元装置110でバッファセットデータの転送が完了しかつコピー先装置120でデータの展開が完了する毎に、ステージポインタ情報が更新される。
なお、退避バッファ1701として割当てたボリュームグループが複数ある場合、ボリュームグループは、ボリュームグループに割り当てられた番号の小さい順に使用される。そして、ボリュームグループを最後まで使用した場合、ボリュームグループは、最初にもどりサイクリックにボリュームグループを使用する。
以下、図22および図23にライトバックポインタ情報およびステージポインタ情報の具体的な更新処理を説明する。
図22は、本実施例に係るライトバックポインタ情報の更新処理を示すフローチャートである。
ステップS1800aにおいて、コピー元装置110に備わる制御モジュールを代表するマスタ制御モジュールは、バッファセットの切替え処理が行なわれると、処理をステップS1801aに移行する。
ステップS1801aにおいて、マスタ制御モジュールは、現在保持しているライトバックポインタ情報を1つ進める。例えば、マスタ制御モジュールは、バッファ管理テーブル300のライトバックポインタ情報に保持されている世代を1だけインクリメントする。
ステップS1802aにおいて、マスタ制御モジュールは、ステップS1801aで求めたライトバックポインタ情報に、自身が保持するバッファ管理テーブル300を更新する。さらに、マスタ制御モジュールは、コピー元装置110に備わる他の制御モジュールに対して、ステップS1802aと同様の処理を依頼する。
一方、ステップS1801bにおいて、各制御モジュールは、ステップS1801aで求めたライトバックポインタ情報に、各自が保持するバッファ管理テーブル300を更新する。そして、各制御モジュールは、バッファ管理テーブル300の更新が完了すると、その旨をマスタ制御モジュールに通知する。
ステップS1803aにおいて、マスタ制御モジュールは、依頼した全ての制御モジュールから応答を受信したか否かをチェックし、応答を受信していない制御モジュールがある場合には(S1803a NO)、ステップS1803aの処理を繰り返す。
ステップS1803aにおいて、依頼した全ての制御モジュールから応答を受信したと判断すると(S1803a YES)、マスタ制御モジュールは、処理をステップS1804aに移行し、ライトバックポインタ情報の更新処理を終了する。
図23は、本実施例に係るステージポインタ情報の更新処理を示すフローチャートである。
ステップS1900aにおいて、コピー元装置110のマスタ制御モジュールは、バッファセットの解放処理を開始すると、処理をステップS1901aに移行する。
ステップS1901aにおいて、マスタ制御モジュールは、解放対象のバッファセットがあるか否かを判別する。解放対象となるバッファセットがない場合(S1901a NO)、マスタ制御モジュールは、ステップS1904aに移行し、処理を終了する。
なお、本実施例では、コピー先装置120への転送が完了し、かつ、コピー先装置120から転送データのディスク装置への展開が完了した旨の通知を受けたバッファセットを領域解放の対象と判断する。
ステップS1901aにおいて、解放対象となるバッファセットがある場合(S1901a YES)、マスタ制御モジュールは、処理をステップS1902aに移行する。
ステップS1902aにおいて、マスタ制御モジュールは、解放対象となるバッファセットの個別バッファ、BITおよびバッファセット情報を解放するとともに、ステージポインタ情報を更新する。例えば、マスタ制御モジュールは、バッファ管理テーブルのステージポインタ情報に保持されている世代を次の世代に更新する。
また、マスタ制御モジュールは、コピー元装置110に備わる他の制御モジュールに対して、ステップS1902aと同様の処理を依頼する。
ステップS1901bにおいて、各制御モジュールは、マスタ制御モジュールから依頼を受けると、解放対象のバッファセットの個別バッファ、BITおよびバッファセット情報を解放するとともに、ステージポインタ情報を更新する。処理が完了すると、各制御モジュールは、マスタ制御モジュールに対して完了通知を行なう。
ステップS1903aにおいて、マスタ制御モジュールは、依頼した制御モジュールからの応答を確認し、全ての制御モジュールから応答を受信したか否かを判別する。そして、応答を受信していない制御モジュールがある場合(S1903a NO)、ステップS1903の処理を繰返す。
また、ステップS1903aにおいて、全ての制御モジュールから応答を受信したと判断した場合(S1903a YES)、マスタ制御モジュールは、ステップS1904aに移行してステージポインタ情報の更新処理を終了する。
(6)記録専用バッファ201から退避バッファ118へのライトバック
図24は、本実施例に係るライトバックを示すフローチャートである。
ステップS2000aにおいて、例えば、Writeデータのバッファセットへの記憶処理が完了すると、コピー元装置110におけるマスタ制御モジュールは、処理をステップS2001aに移行する。
ステップS2001aにおいて、マスタ制御モジュールは、ステージング・転送で使用中のバッファセット数を取得する。そして、マスタ制御モジュールは、ステージング・転送で使用中のバッファセット数とバッファ閾値とを比較し、使用中のバッファセット数がバッファ閾値以上ではない場合(S2001a NO)、処理をステップS2006aに移行する。また、マスタ制御モジュールは、ステージング・転送で使用中のバッファセット数がバッファ閾値以上であった場合(S2001a YES)、処理をステップS2002aに移行する。
ステップS2002aにおいて、マスタ制御モジュールは、ライトバック処理を行なう。なお、ライトバックをするバッファセットを「ライトバック対象世代」という。このライトバック処理の具体的な処理については、後述する。
ライトバックが完了すると、マスタ制御モジュールは、コピー元装置110に備わる他の制御モジュールに対して、ステップS2002aと同様の処理を依頼する。
ステップS2001bにおいて、各制御モジュールは、マスタ制御モジュールから依頼のあったバッファセットのうち各制御モジュールに備わる個別バッファに記憶されているバッファデータ、そのBITおよびバッファセット情報を、自身のBIT記憶部201b等から取得する。そして、各制御モジュールは、取得したBITおよびバッファセット情報を、各制御モジュールに割当てられた個別退避バッファに退避する。
そして、Writeデータ等のバッファデータが個別バッファにない場合(S2002b NO)、各制御モジュールは、ステップS2003bをスキップする。また、Writeデータ等のバッファデータが個別バッファにある場合(S2002b YES)、各制御モジュールは、処理をステップS2003bに移行する。
ステップS2003bにおいて、各制御モジュールは、個別バッファに記憶されているWriteデータ等のバッファデータを、各制御モジュールに割当てられた退避バッファ118の個別退避バッファに退避する。そして、マスタ制御モジュールに依頼された処理の完了を通知する。
一方、ステップS2003aにおいて、マスタ制御モジュールは、依頼した全ての制御モジュールから応答を受信したか否かをチェックし、応答を受信していない制御モジュールがある場合には(S2003a NO)、ステップS2003aの処理を繰返す。
全ての制御モジュールから応答を受信した場合(S2003a YES)、マスタ制御モジュールは、ライトバック対象バッファセットのバッファセット情報等を解放する(ステップS2004a)。また、制御モジュールは、バッファセット管理テーブル400を参照しライトバック対象バッファセットのバッファセットIDと一致するバッファセットIDを未使用に設定する。
ステップS2005aにおいて、マスタ制御モジュールは、バッファ閾値を最適化する処理を実行する。そして、マスタ制御モジュールは、処理をステップS2006aに移行してバッファ退避処理を終了する。
上記した、ステップS2002aのライトバック処理について、図25、図26のフローチャートを使用して説明する。
まず、図25において、マスタ制御モジュールは、必要となるWrite Backの数を、求める(ステップS2050)。詳しくは、まず、マスタ制御モジュールは、図4に示されるバッファ管理テーブル400で管理されるバッファセットのうち、ライトバックの対象となっているバッファセットIDの総格納数を求める。図4では、バッファセットID0003,0004の使用目的がライトバックであり、この総格納数は、760である。
次にマスタ制御モジュールは、ライトバック対象の総格納数を元にライトバックに必要となる退避バッファ数を求める。この際、退避バッファ単位サイズに満たない容量分につおいては、1退避バッファを確保する。本実施の形態の場合、図8に示されるように1退避バッファ単位サイズは1MByteである。また、格納容量は、図5の順序性補償リモートコピー管理テーブル410に示されるように、8KByteであるので、マスタ制御モジュールは、(760×8)÷1024=5.9375を計算し、小数点以下端数分を切り上げ、必要退避バッファ数「6」を抽出する。
次に、マスタ制御モジュールは、Writebackの空き退避バッファを検索する処理を行う(ステップS2051)。この処理は、Busy状態、即ち、キャッシュがフルとなった制御モジュールに対し、Writebackすべき退避バッファを検索する処理である。この処理については、後述する。なお、マスタ制御ユニットは、検索結果を、退避バッファテーブル記憶部205内に、空き退避バッファ情報として記憶する。また、この際記憶される空きバッファ情報は、検索されたバッファの論理ユニット番号(LU番号)及びLU番号の退避バッファオフセットを含んでいる。また、マスタ制御ユニットは、空き退避バッファ情報を見つけることができなかった場合、空きバッファ情報は、「空きなし」を示す情報が記憶する。
次に、マスタ制御モジュールは、ステップS2051の処理において、空き退避バッファを見つけることができたかを確認する(ステップS2052)。詳しくは、空きバッファ情報が「対象なし」を示すものかを確認する。ここで、空き退避バッファセットが見つからなかった、即ち、空き退避バッファ情報が、「対象なし」を示す情報であった場合、本処理を終了し、Halt状態へ移行する(ステップS2053)。
また、ステップS2052にて、空き退避バッファがあったと判断した場合、即ち空き退避バッファの論理ユニット番号及びLU番号の退避バッファオフセットを含んでいる場合、マスタ制御モジュールは、ステップS2054の処理を行う。即ち、マスタ制御モジュールは、ステップS2051の処理において記憶された空き退避バッファ情報(LU番号の退避バッファオフセット及び退避バッファ数)を参照し、その情報を抽出する。(S2054)
次にマスタ制御モジュールは、このアドレスを、退避バッファセット管理テーブル520に設定する(S2055)。そして、マスタ制御モジュールは、退避バッファセット管理テーブル520を参照し、自身の配下にある論理ユニット番号が示す論理ユニットの対応アドレスへ、Write back対象となる個別バッファ201aのデータを転送する。加えて、他の制御モジュールへ設定した退避バッファセット管理テーブル520を通知する。更に、該各LUの空き退避バッファ管理テーブル530のWritebackに使用した退避バッファの使用状況を「1」(使用中)に更新する(ステップS2056)。
この処理が完了すると、マスタ制御モジュールは、Write back対象であった個別バッファ201aを開放する(S2057)。この際、制御モジュールは、Halt待ち状態があれば、バッファ切り替えを行う。
次に、上記した図25の処理において、ステップS2051の空き退避バッファを検索する処理について、図26のフローチャートを用いて説明する。
まず、マスタ制御モジュールは、図4のバッファセット管理テーブルを参照し、バッファのステータスがBusyか否か(Normalか)を確認する(ステップS2061)
ここで、バッファのステータスがNormalであれば、空き退避テーブル管理テーブル530を参照し、各制御ユニットが対象とする論理ユニットLUの数が2つ以上であるかを確認する(ステップS2062)。ステップS2061の処理にてバッファのステータスがBusyの場合、もしくは、ステップS2062の処理にて論理ユニットが1つしかない場合、マスタ制御モジュールは、性能が良い論理ユニットの退避バッファを優先して選択する設定を行う(ステップS2064)。この際、マスタ制御モジュールは、各論理ユニットの、LU管理テーブル510の退避バッファ性能を参照して、退避バッファ性能が一番良い論理ユニットの番号を記憶する。ステップS2064の処理は、具体的には、マスタ制御モジュールが、退避バッファ管理テーブル記憶部205内に、性能が良い方を優先することを示すフラグ情報を記憶する。また、マスタ制御モジュールが、各論理ユニットのLU管理テーブル510の退避バッファ性能を比較し、退避バッファ性能が一番良い論理ユニットの番号を検索対象論理ユニット番号として退避バッファ管理テーブル記憶部205内に記憶する。
また、ステップS2062にて論理ユニットが複数あるとされた場合、退避バッファ性能が悪い方の論理ユニットの退避バッファを優先して退避バッファを選択する設定を行う。(S2063)。この際、マスタ制御モジュールは、各論理ユニットの、LU管理テーブル510の退避バッファ性能を比較し、退避バッファ性能が一番悪い論理ユニットの番号を記憶する。ステップS2064の処理は、具体的には、マスタ制御モジュールが、退避バッファ管理テーブル記憶部205内に、性能が悪い方を優先することを示すフラグ情報を記憶する。また、マスタ制御モジュールが各論理ユニットの、LU管理テーブル510の退避バッファ性能を比較して、退避バッファ性能が一番悪い論理ユニットの番号を検索対象論理ユニット番号として退避バッファ管理テーブル記憶部205内に記憶する。
次に、マスタ制御モジュールは、退避バッファ管理テーブル記憶部205内に記憶されている検索対象論理ユニット内に、退避バッファとして確保出来る連続した空き領域があるかを確認する(ステップS2065〜ステップS2067)。この処理の制御モジュール#00での例を示す。マスタ制御モジュールは、図12に示される空き退避バッファテーブル530を参照する。ここでの値は「11111111111111110000000011111111・・・(以降は全て1とする)」であるので、マスタ制御モジュールは、空き退避バッファのオフセットを、0(空き)を示す最初のオフセットである「16」、該オフセットからの連続空き退避バッファ数「8」を算出する。ここで、退避バッファとして確保出来る連続した空き領域があった場合、マスタ制御モジュールは、検索対象LU番号(上記では、「#00」・及び空き領域の退避バッファオフセット「16」及び退避バッファ数「8」を空き退避バッファ情報として退避バッファ管理テーブル記憶部205に記憶し、処理を終了する(S2068)。
また、ここで、検索対象論理ユニットに、連続した空き領域が見つからなかった場合、マスタ制御モジュールは、次の論理ユニットを検索対象論理ユニットに設定し直し、ステップS2065〜S2067の処理を行う(S2069,S2070)。
この際、マスタ制御ユニットは、退避バッファ管理テーブル記憶部205に記憶されているフラグ情報が、「性能が悪い方を優先」を示す場合、ステップS2065〜S2067で処理を行っていない論理ユニットのうち、最も性能が悪い論理ユニットを選択する。当然、この選択は、退避バッファ管理テーブル記憶部205に記憶されているLU管理テーブル510を参照することによって行われる。
また、マスタ制御ユニットは、退避バッファ管理テーブル記憶部205に記憶されているフラグ情報が、「性能が良い方を優先」を示す場合、ステップS2065〜S2067で処理を行っていない論理ユニットのうち、最も性能が良い論理ユニットを選択する。当然、この選択も、退避バッファ管理テーブル記憶部205に記憶されているLU管理テーブル510を参照することによって行われる。
更に、全ての論理ユニットの検索が完了してしまっても、連続した空き領域が見つからなかった場合、マスタ制御モジュールは、空き退避バッファ情報として、「対象なし」を示す情報を記憶し処理を終了する(S2071)。
(7)再配置スケジューリング処理
本装置において、定期的に行われる再配置処理について図27〜図29を用いて、説明する。
この処理は、退避バッファへのアクセスが少ない曜日・時間帯に自動的に行われるよう、マスタ制御モジュールが、再配置のスケジューリングを自動的に行っている。この処理について図27を参照し、説明する。
まず、上記したように、図21のS1653処理によって、個別バッファの容量が足らず、Write backが発生することに、日付別加点テーブル430・曜日別加点テーブル440の該当欄の値の更新が行われている。
ここで、マスタ制御モジュールは、過去の同地タイミングのデータを集計する(ステップS2101)。本実施の形態では、日付別加点テーブル430においては、過去2年分のデータが記憶されているものとする。この場合、今年の日付別加点テーブル430に昨年の日付別加点テーブル430を反映することによって、集計がなされる。また、曜日別加点テーブル440は、過去2週分について蓄積されており、先週分の曜日別加点テーブル440のデータを今週分に反映させることによって、集計がなされる。
次にマスタ制御モジュールは、週単位で小さい順に表を生成し(図示せず)、退避バッファ管理テーブル記憶部205に記憶する(ステップS2102)。
そして、マスタ制御モジュールは、該表を参照して、週の中で加点が最も小さい時間に対し、再配置処理が実行されるよう、スケジューリングを行う(ステップ2103)。
このスケジューリングを行うと、マスタ制御モジュールは、スケジューリングされた時間に、再配置処理を行う。
この再配置処理について、図28のフローチャートを用いて説明する。
まず、マスタ制御モジュールは、再配置前の空き退避バッファが存在しないか検索する(ステップS2201)。この処理の詳細については、後述する。なお、マスタ制御ユニットは、検索結果を、退避バッファテーブル記憶部205内に、空き退避バッファ情報として記憶する。また、この際記憶される空きバッファ情報は、検索されたバッファの論理ユニット番号(LU番号)及びLU番号の退避バッファオフセットを含んでいる。また、マスタ制御ユニットは、空き退避バッファ情報を見つけることができなかった場合、空きバッファ情報は、「空きなし」を示す情報が記憶する。
次に、マスタ制御モジュールは、ステップS2201の処理において、空き退避バッファを見つけることができたかを確認する(ステップS2202)。詳しくは、空きバッファ情報が「空きなし」を示すものかを確認する。ここで、空き退避バッファセットが見つからなかった、即ち、空き退避バッファ情報が、「空きなし」を示す情報であった場合、再配置できないので、そのまま処理を終了する。
また、ステップS2202にて、空き退避バッファを検索できた場合、空き即ち空き退避バッファの論理ユニット番号及びLU番号の退避バッファオフセットを含んでいる場合、マスタ制御モジュールは、S2201で求めた空き退避バッファ情報の、論理ユニット番号とそのアドレスを抽出する(ステップS2203)。そして、マスタ制御モジュールは、この情報を参照して再配置処理を行う。具体的には、マスタ制御モジュールは、空き退避バッファに記憶されている論理ユニットの性能と近い論理ユニットがセットとなっている退避バッファセット管理テーブル520を抽出する。そして、マスタ制御モジュールは、抽出した退避バッファセット管理テーブル520の1つの論理ユニットを、ステップS2201で抽出した論理ユニットの1つと差し替えた場合、より、性能差が少ない組み合わせになるかを確認する。ここで、性能差が小さければ、組み換えを行う。そして、差し替えられた結果、この退避バッファセットから外された退避バッファに対し、同ようの処理に行う。その後も同ようの処理を繰り返し、再配置を行っていく(ステップS2204)。その再配置処理が完了すると、マスタ制御モジュールは、この再配置結果を、各退避バッファセット管理テーブルへ反映させ(ステップS2205)、ステップS2201へ処理を移行する。これにより、全ての再配置できる空きディスクバッファについて再配置が行われることとなる。
次に、図28のs2201の再配置空きバッファ検索処理について、図29のフローチャートを用いて、説明する。
まず、マスタ制御モジュールは、空き退避バッファ管理テーブル530を参照し、論理ユニットLUの数が2つ以上であるかを確認する(ステップS2251)。ここで、論理ユニットが2つ以上の場合、マスタ制御モジュールは、まだ検索を行っていない論理ユニットのうち、性能が悪い論理ユニット(LU管理テーブル510の下の方)の退避バッファを優先して選択する設定を行う(ステップS2252)。 また、ステップS2251にて論理ユニットが2つ無いとされた場合、再配置は不要なので、処理を終了する。次に、マスタ制御モジュールは、退避バッファ管理テーブル記憶部205内に記憶されている検索対象論理ユニット内に、退避バッファとして確保出来る連続した空き領域があるかを確認する(ステップS2253〜ステップS2254)。ここで、退避バッファとして確保出来る連続した空き領域があった場合、マスタ制御モジュールは、検索対象LU番号・及び空き領域の退避バッファオフセットを空き退避バッファ情報として退避バッファ管理テーブル記憶部205に記憶し、処理を終了する(ステップS2256)。
また、ここで、検索対象論理ユニットに、連続した空き領域が見つからなかった場合、マスタ制御モジュールは、次の論理ユニットを検索対象論理ユニットに設定し直し、ステップS2252〜S2255の処理を行う(S2257)。
全ての論理ユニットの検索が完了してしまっても、連続した空き領域が見つからなかった場合、マスタ制御モジュールは、空き退避バッファ情報として、「対象なし」を示す情報を記憶し処理を終了する(S2258)。
(8)退避バッファ118から記録専用バッファ201へのステージング
図30および図31は、本実施例に係るステージングを示すフローチャートである。図30および図31に示す処理は、図16に示したステップS1218a〜S1220aの処理を具体的に示している。
ステップS2300aにおいて、旧世代の解放処理が完了すると、コピー元装置110におけるマスタ制御モジュールは、処理をステップS2301aに移行する。
ステップS2301aにおいて、マスタ制御モジュールは、ステージング対象となる世代を決定する。例えば、マスタ制御モジュールは、ステージポインタ情報を参照し、ステージポインタ情報に記憶されている世代を1だけインクリメントし、インクリメントした世代を新たにステージング対象の世代に決定する。このステージング対象の世代を「ステージング対象世代」という。また、図30および図31の処理では、必要に応じて、図16のステップS1213aの処理で取得しステージングに使用するバッファセットを「ステージング先」と略す。
ステップS2302aにおいて、マスタ制御モジュールは、ステージング対象世代のステージング先の領域は解放処理待ちか否かをチェックする。ステージング先の領域が解放待ちの場合(S2302a YES)、マスタ制御モジュールは、処理をステップS2303aに移行する。
ステップS2303aにおいて、マスタ制御モジュールは、ステージング対象世代に1を加算した世代を新たなステージング対象世代に設定する。そして、マスタ制御モジュールは、処理をステップS2302aに移行する。
一方、ステップS2302aにおいて、ステージング先の領域が解放待ちでない場合(S2302a NO)、マスタ制御モジュールは、処理をステップS2304aに移行する。
ステップS2304aにおいて、マスタ制御モジュールは、ステージング先が転送中か否かをチェックする。ステージング先が転送中の場合(S2304a YES)、マスタ制御モジュールは、処理をステップS2303aに移行する。
一方、ステップS2304aにおいて、ステージング先が転送中でない場合(S2304a NO)、マスタ制御モジュールは、処理をステップS2305aに移行する。
ステップS2305aにおいて、マスタ制御モジュールは、ステージング対象世代がステージング中か否かをチェックする。ステージング対象世代がステージング中の場合(S2305a YES)、マスタ制御モジュールは、処理をステップS2303aに移行する。
一方、ステップS2305aにおいて、ステージング対象世代がステージング中でない場合(S2305a NO)、マスタ制御モジュールは、処理をステップS2306aに移行する。
ステップS2306aにおいて、マスタ制御モジュールは、ステージング対象世代がライトバック中か否かをチェックする。ステージング対象世代がライトバック中の場合(S2306a YES)、マスタ制御モジュールは、処理をステップS2307aに移行する。
ステップS2307aにおいて、マスタ制御モジュールは、自身のライトバックを中断するとともに、コピー元装置110に備わる他の制御モジュールに対して、ライトバックの中断を依頼する。
ステップS2301bにおいて、各制御モジュールは、マスタ制御モジュールからの依頼を受けると、処理中のライトバックを中断する。そして、マスタ制御モジュールに対して、ライトバックを中断した旨を通知する。
ステップS2308aにおいて、マスタ制御モジュールは、依頼した全ての制御モジュールから応答を受信したか否かをチェックし、応答を受信していない制御モジュールがある場合には(S2308a NO)、ステップS2308aの処理を繰り返す。
ステップS2308aにおいて、依頼した全ての制御モジュールから応答を受信したと判断すると(S2308a YES)、マスタ制御モジュールは、処理をステップS2309aに移行し、ステージングを終了する。
一方、ステップS2306aにおいて、ステージング対象世代がライトバック中でないと判断した場合(S2306a NO)、マスタ制御モジュールは、処理をステップS2310aに移行する。
ステップS2310aにおいて、マスタ制御モジュールは、ステージング先が、Writeデータ等の記憶処理中か否かをチェックする。ステージング先が記憶処理中と判断した場合(S2310a YES)、マスタ制御モジュールは、処理をステップS2311aに移行し、ステージングを終了する。
ステップS2310aにおいて、ステージング先がWriteデータ等の記憶処理中でないと判断した場合(S2310a NO)、マスタ制御モジュールは、処理を図31のステップS2312aに移行する。
ステップS2312aにおいて、マスタ制御モジュールは、図16のステップS1213aの処理で取得したステージング先に既にステージング対象世代が記憶されているか否かをチェックする。
ステージング先にステージング対象世代が記憶されている場合(S2312a YES)、マスタ制御モジュールは、ステップS2316aに移行してステージングを終了する。また、ステージング先にステージング対象世代が記憶されていない場合(S2312a
NO)、マスタ制御モジュールは、処理をステップS2313aに移行する。
ステップS2313aにおいて、マスタ制御モジュールは、ステージング・転送で使用中のバッファセット数を取得する。そして、マスタ制御モジュールは、ステージング・転送で使用中のバッファセット数とバッファ閾値とを比較し、使用中のバッファセット数がバッファ閾値以上であった場合(S2313a YES)、処理をステップS2317aに移行してステージングを終了する。また、マスタ制御モジュールは、ステージング・転送で使用中のバッファセット数がバッファ閾値以上でなかった場合(S2313a NO)、処理をステップS2314aに移行する。
ステップS2314aにおいて、マスタ制御モジュールは、以下のようにステージング対象の世代に対してステージングを行なう。
マスタ制御モジュールは、退避バッファ管理テーブル500から、ステージング対象世代が記憶されている個別退避バッファのアドレスを算出する。そして、マスタ制御モジュールは、算出したアドレスからバッファデータ、BITおよびバッファセット情報を取得する。
そして、マスタ制御モジュールは、取得したバッファデータ、BITおよびバッファセット情報を、ステージング対象バッファセットIDが示すバッファセットのバッファ201a、BIT記憶部201bおよびバッファセット情報記憶部202に記憶する。同様の処理が、コピー元装置110内の制御モジュール毎に行なわれる。
なお、個別退避バッファのアドレスは、制御モジュールに割り当てられた退避バッファが連続したアドレス空間とした場合、退避バッファ管理テーブル500に設定されている「退避データの記憶退避バッファオフセット」に、「(ステージング対象世代−1)×個別退避バッファサイズ」を加えることにより求めることができる。
ステップS2315aにおいて、マスタ制御モジュールは、各制御モジュールに対して、ステップS2314aと同様に、退避バッファ118からステージング対象世代を取得してステージングを行うように依頼する。
ステップS2302bにおいて、各制御モジュールは、以下のようにバッファセット情報およびBITに対してステージングを行なう。
依頼を受けた各制御モジュールは、自身に割り当てられた退避バッファ118の個別退避バッファから、マスタ制御モジュールから依頼のあったステージング対象世代のBITおよびバッファセット情報を取得する。
そして、各制御モジュールは、退避バッファ118の個別退避バッファから取得したBITおよびバッファセット情報を、各制御モジュールに備わるBIT記憶部201bおよびバッファセット情報記憶部202に記憶する。
ステップS2303bにおいて、各制御モジュールは、自身に割り当てられた退避バッファ118の個別退避バッファを参照し、ステージング対象世代のバッファデータがあるか否かを判別する。そして、ステージング対象世代のバッファデータが退避バッファ118の個別退避バッファにある場合(S2303b YES)、各制御モジュールは、そのバッファデータに対してステージングを行なう(S2304b)。ステージングが完了すると、各制御モジュールは、マスタ制御モジュールに対して完了通知を行なう。
また、ステップS2303bにおいて、ステージング対象世代のバッファデータが退避バッファ118の個別退避バッファにない場合(S2303b NO)、各制御モジュールは、マスタ制御モジュールに対して完了通知を行う。
ステップS2316aにおいて、マスタ制御モジュールは、依頼した全ての制御モジュールから応答を受信するまで完了通知を監視する。そして、依頼した全ての制御モジュールから応答を受信すると(S2316a YES)、マスタ制御モジュールは、ステージングにより、空きとなった退避バッファの情報を、空きバッファ管理テーブル530に反映させた後、ステップS2317aに移行してステージングを終了する。即ち、マスタ制御モジュールは、各論理ユニットの空き退避バッファ管理テーブル530の空きとなった退避バッファに対し、そのステータスを「0」(空き)に更新する。
(9)バッファ閾値を最適化する処理
図32は、本実施例に係るバッファ閾値の最適化処理を示すフローチャートである。
図16に示したステップS1216aまたは図19に示したステップS2005aに処理が移行すると、マスタ制御モジュールは、以下に示すバッファ閾値の最適化処理を開始する(ステップS2400)。
ステップS2401において、マスタ制御モジュールは、Write I/O命令を管理する待ち行列等を参照し、待ち状態のWrite I/Oが存在するか否かを判別する。待ち状態のWrite I/Oが存在する場合(ステップS2401 YES)、マスタ制御モジュールは、処理をステップS2402に移行する。
ステップS2402において、マスタ制御モジュールは、解放したバッファセットが、ライトバックに使用されていたものか否かを判別する。なお、「解放したバッファセット」とは、図32に示す最適化処理を開始する前、例えば、図16に示したステップS1214aまたは図19に示したステップS2004aで解放されたバッファセットのことである。
解放したバッファセットがライトバックに使用されていたものでない場合(ステップS2402 NO)、マスタ制御モジュールは、ステップS2408に移行してバッファ閾値の最適化処理を終了する。また、解放したバッファセットがライトバックに使用されていたものである場合(ステップS2402 YES)、マスタ制御モジュールは、処理をステップS2403に移行する。
ステップS2403において、マスタ制御モジュールは、バッファ管理テーブル300からバッファ閾値を取得し、バッファ閾値が最大バッファセット数未満か否かを判別する。バッファ閾値が最大バッファセット数以上の場合(ステップS2403 NO)、マスタ制御モジュールは、ステップS2408に移行してバッファ閾値の最適化処理を終了する。
また、バッファ閾値が最大バッファセット数未満の場合(ステップS2403 YES)、マスタ制御モジュールは、処理をステップS2404に移行する。そして、マスタ制御モジュールは、バッファ閾値を1だけインクリメントし、バッファ管理テーブル300のバッファ閾値を更新する(ステップS2404)。すると、マスタ制御モジュールは、ステップS2408に移行してバッファ閾値の最適化処理を終了する。
一方、ステップS2401において、待ち状態のWrite I/Oが存在しない場合、マスタ制御モジュールは、処理をステップS2405に移行する。
ステップS2405において、マスタ制御モジュールは、解放したバッファセットが、転送に使用されていたものか否かを判別する。なお、ステップS2402と同様に、「解放したバッファセット」とは、図32に示す最適化処理を開始する前、例えば、図16に示したステップS1214aまたは図19に示したステップS2004aで解放されたバッファセットのことである。
解放したバッファセットが転送に使用されていたものでない場合(ステップS2405
NO)、マスタ制御モジュールは、ステップS2408に移行してバッファ閾値の最適化処理を終了する。また、解放したバッファセットが転送に使用されていたものである場合(ステップS2405 YES)、マスタ制御モジュールは、処理をステップS2406に移行する。
ステップS2406において、マスタ制御モジュールは、バッファ管理テーブル300からバッファ閾値を取得し、バッファ閾値が1より大きいか否かを判別する。バッファ閾値が1以下の場合(ステップS2406 NO)、マスタ制御モジュールは、ステップS2408に移行してバッファ閾値の最適化処理を終了する。
また、バッファ閾値が1より大きい場合(ステップS2406 YES)、マスタ制御モジュールは、処理をステップS2407に移行する。そして、マスタ制御モジュールは、バッファ閾値を1だけデクリメントし、バッファ管理テーブル300のバッファ閾値を更新する(ステップS2407)。すると、マスタ制御モジュールは、ステップS2408に移行してバッファ閾値の最適化処理を終了する。
図33は、図16に示したマッチング処理(ステップS1211a)の具体的な処理を示すフローチャートである。なお、図24では、コピー元装置110に備わるマスタ制御モジュールと、その他の制御モジュールと、についての具体的な処理を示す。
ステップS2501aにおいて、マスタ制御モジュールは、未使用バッファID記憶部206を参照する。そして、未使用バッファID記憶部206に記憶されている未使用バッファIDの数が、バッファセット情報記憶部202に記憶されているバッファセット情報に含まれるコピー元IDとのマッチングに必要な数だけあるか否かを確認する。
そして、ステップS2501aにおいて、必要な数の未使用バッファIDを確認できない場合(S2501a NO)、マスタ制御モジュールは、処理をステップS2502aに移行する。そして、マスタ制御モジュールは、S2502aにてコピー先装置120からの未使用バッファ通知を待ち、未使用バッファ通知を受付けると、処理をステップS2501aに移行する。
また、ステップS2501aにおいて、必要な数の未使用バッファIDを確認すると(S2501a YES)、マスタ制御モジュールは、処理をステップS2503aに移行する。
ステップS2503aにおいて、マスタ制御モジュールは、未使用バッファID記憶部206から必要な数の未使用バッファIDを取得する。そして、マスタ制御モジュールは、既にバッファセット情報記憶部202に記憶されているバッファセット情報に含まれるコピー先IDと、取得した未使用バッファIDとを組み合わせて関連付け、すなわち、コピー元バッファとコピー先バッファとのマッチングを行なう。
このマッチング処理が終了すると、マスタ制御モジュールは、他の制御モジュールに対して、バッファセット情報の多重化依頼を通知する。
一方、ステップS2501bにおいて、マスタ制御モジュールからバッファセット情報の多重化依頼の通知を受けると、各制御モジュールは、バッファセット情報の多重化処理を行なう。ここで、バッファセット情報の多重化処理とは、コピー元装置110またはコピー先装置120に備わる全ての制御モジュールに同一のバッファセット情報を保持させる処理である。
例えば、マスタ制御モジュールから、ステップS2503aのマッチング処理が行なわれたバッファセット情報を取得する。そして、自身に備わるバッファセット情報記憶部202に取得したバッファセット情報を反映する。
そして、S2501bにおけるバッファセット情報の多重化処理が終了すると、各制御モジュールは、バッファセット情報の多重化処理の完了をマスタ制御モジュールに通知する。
ステップS2505aにおいて、マスタ制御モジュールは、バッファセット情報の多重化処理の依頼をした制御モジュールの全てから応答を受信したか否かを確認する。そして、当該応答を全ての制御モジュールから受信したと判断すると(S2505a YES)、コピー先バッファ割り当て処理を終了し(ステップS2506a)、図16に示したステップS1212aaの処理に移行する。
上述のように、本実施例に係るコピー元装置110は、退避バッファ118を備える。
そして、転送・ステージングで使用中のバッファセット数がバッファ閾値を超えると、コピー元装置110は、バッファセットデータを、退避バッファ118に退避するライトバックを行なう。
例えば、コピー元装置110−コピー先装置120間の回線能力が低い場合にホスト150から次々にWrite I/O命令を受けても、コピー元装置110は、使用中のバッファセット数がバッファ閾値を超えると、バッファセットデータを退避バッファ118に退避する。
一方、コピー元装置110は、バッファセットデータのコピー先装置120への転送と展開処理が完了すると、そのバッファセットデータが記憶されていた領域を解放し、解放した領域に、退避バッファ118に退避していたバッファセットデータをステージングする。そして、コピー元装置110は、そのバッファデータをコピー先装置120に転送する。
このように、本実施例に係るコピー元装置110によると、コピー元装置110−コピー先装置120間の回線能力が低い場合など、データの転送処理に遅延が生じる場合であっても、バッファセットの枯渇を抑止することができる。したがって、コピー先装置120は、バッファセットの枯渇時に行なうバッファHalt処理を抑止することができる。すなわち、コピー先装置120は、バッファHalt処理によりバッファセットの内容がクリアされ、順序性を補償したリモートコピーが中断されることを抑止することができる。その結果、コピー元装置110は、データの転送処理に遅延が生じる場合でも、順序性を補償したリモートコピーを行なうことが可能となる。
回線能力が均一でなく不安定である場合やWrite I/O等によるデータ更新量がコピー元装置110に備わる記録専用バッファ201の容量を超える場合などによってデータの転送処理に遅延が生じる場合も同様の効果を奏する。
さらに、コピー元装置110は、Write I/O処理にともなう処理の負荷に応じて、バッファ閾値の最適化を行なう。
例えば、コピー元装置110は、ステージング・転送実行後に待ち状態のWrite I/O処理があると、バッファ閾値をデクリメントする。待ち状態のWrite I/O処理が多く存在する場合、ステージング・転送実行後に待ち状態のWrite I/O処理を検出する毎にバッファ閾値をデクリメントすることになる。すると、図26に示すように、バッファ閾値が変動し、ライトバックに使用するバッファセットが多くなる。
その結果、急激にWrite I/O処理が増大しても、バッファセットデータは退避バッファ118に退避されるので、バッファセットの枯渇を抑止することができる。
また、例えば、コピー元装置110は、バッファセットデータのライトバック処理の実行後に待ち状態のWite I/O処理がなければ、バッファ閾値をインクリメントする。待ち状態のWrite I/O条理を検出しない状態が続くと、バッファセットデータの転送処理を実行する毎に、コピー元装置110は、バッファ閾値をインクリメントすることになる。すると、図25に示すように、バッファ閾値が変動し、ステージング・転送に使用するバッファセットが多くなる。
その結果、通信回線の帯域幅を最大限利用してバッファセットデータの転送処理を行なうようになるので、バッファセットデータの転送処理が増大し、バッファセットの枯渇を抑える。
なお、図30および図31には、バッファセットの数が4ではなく16の場合を示しているが、これはバッファ閾値の動作の理解を容易にするためであって、バッファセットの構成を図30および図31に示す構成に限定する趣旨ではない。
また、上記実施の形態以外に、設置時点において、ディスクバッファの運用者は、バッファHalt処理にならない程度の、ディスクバッファの容量を予測し、固定的に設定を行うことで、Halt処理を回避するということも考えられる。しかしながら、このような設定は、実際の運用前に行うことであり、その運用途中において、その運用方法が変わっていくなどにより、一部の論理ユニットの負荷が大きくなることがある。もしくは、一部の論理ユニットの入出力用のポートにおける通信量が増加してしまい、実効速度が遅くなることがある。
この様な場合、この実効速度が遅くなった論理ユニットとの退避バッファセットとされた他の論理ユニットの負荷が軽い、もしくは、入出力に余裕があっても、実効速度が遅くなってしまった論理ユニットにあわせて、遅い実効速度にて処理を行うことになる。上記したように、論理ユニットの実効速度が遅くなると、送信待ちのデータセットが増加し、結果想定していたバッファ容量を超えることにもなってしまう。
本実施の形態の記憶制御装置では、図18における、退避バッファセットテーブル520の生成処理や、図27〜図29の再配置処理に示されるように、バッファセットで組み合わされる各退避バッファを、その退避バッファの論理ユニットのライトバックの性能がなるべく揃うように配置もしくは再配置するようにしている。これにより、本実施の形態の記憶制御装置は、バッファセット内における各バッファの速度差を最小限にしている。
更に本実施の形態では、図27〜図29に示す様に、定期的に再配置を行うことで、システムの運用によって、各論理ユニットに対する負荷や通信量が変わってきたとしても、各退避バッファセット内の各退避バッファの性能差を最小限に押さえることが可能となる。
更に、本実施の形態では、制御モジュールと論理ユニットとの組み合わせを固定しておらず、各退避バッファセット単位で、その組み合わせが異なっている。退避バッファセットにおける各退避バッファは同じサイズであるため、制御モジュール単位で論理ユニットを固定してしまうと、各論理ユニットで記憶される容量は、同じになってしまう。
よって、たとえ一方の論理ユニットの容量が大きくとも、容量の少ない他方の論理ユニットの容量までしか記憶することができない。これに対し、本実施の形態の場合、バッファセット単位で論理ユニットの組み合わせを記憶しているため、制御モジュールと論理ユニットとの組み合わせを固定しておく必要がない。よって、各論理ユニットの容量が同じでない場合でもその容量を有効に活用できる。
更に、制御ユニットと論理ユニット組み合わせを固定する記憶制御装置では、制御モジュールを増設しようとする場合、そのままでは増設した制御モジュールに対応する退避バッファセットを確保することができない。このため、このような記憶制御装置では、一旦、論理ユニット内に記憶されている退避バッファを空にして、新たに増設する制御モジュール用のバッファセットの対応関係を構築するという作業が発生する。これに対し、本実施の形態では、そもそも、論理ユニットと制御モジュールとが固定的に組み合わせられていないので、増設した制御モジュールにも容易にバッファセットを割り当てることが可能となる。