(57)【要約】【課題】データブロックの欠損リスクを回避すること。【解決手段】データブロックを参照する論理アドレスの数を示す参照数２１ａの情報と、参照数２１ａの更新状況２１ｂを示す情報とを記憶するメモリ２１と、参照数２１ａが変化した場合にメモリ２１内にある参照数２１ａの情報を更新して更新状況２１ｂを更新済に設定し、所定のタイミングで、更新済の参照数２１ａの情報を記憶装置３０に格納して更新状況２１ｂを未更新に設定し、参照数２１ａに基づく処理を実行する際に、更新済の参照数２１ａに対応するデータブロックを処理の対象から除外する制御部２２とを有する、ストレージ制御装置２０が提供される。【選択図】図１
2019036130.tif 000002
【特許請求の範囲】
【請求項１】
データブロックを参照する論理アドレスの数を示す参照数の情報と、前記参照数の更新状況を示す情報とを記憶するメモリと、
前記参照数が変化した場合に前記メモリ内にある前記参照数の情報を更新して前記更新状況を更新済に設定し、
所定のタイミングで、更新済の前記参照数の情報を記憶装置に格納して前記更新状況を未更新に設定し、
前記参照数に基づく処理を実行する際に、更新済の前記参照数に対応する前記データブロックを前記処理の対象から除外する制御部と
を有する、ストレージ制御装置。
【請求項２】
前記処理は、前記参照数が０となった前記データブロックを削除する処理である
請求項１に記載のストレージ制御装置。
【請求項３】
前記制御部は、前記処理を実行可能な他のストレージ制御装置に対して前記更新状況を通知し、前記他のストレージ制御装置による前記処理の対象から、更新済の前記参照数に対応する前記データブロックを除外する
請求項１に記載のストレージ制御装置。
【請求項４】
データブロックを参照する論理アドレスの数を示す参照数の情報と、前記参照数の更新状況を示す情報とをメモリに記憶させ、
前記参照数が変化した場合に前記メモリ内にある前記参照数の情報を更新して前記更新状況を更新済に設定し、
所定のタイミングで、更新済の前記参照数の情報を記憶装置に格納して前記更新状況を未更新に設定し、
前記参照数に基づく処理を実行する際に、更新済の前記参照数に対応する前記データブロックを前記処理の対象から除外する
処理をコンピュータに実行させる、プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージ制御装置、及びプログラムに関する。
【背景技術】
【０００２】
ストレージシステムでは、ＨＤＤ（Hard Disk Drive）やＳＳＤ（Solid State Drive）などの記憶装置に格納されるデータの量を削減するために重複排除と呼ばれる技術が適用されることがある。重複排除は、記憶装置に書き込むデータ（ライトデータ）と、既に記憶装置に格納済みのデータ（既存データ）との重複を検出し、重複するデータの書き込みを回避する技術である。重複排除を実施した場合、ライトデータの論理アドレス（ＬＡ：Logical Address）と既存データの物理アドレスとが対応付けられる。
【０００３】
重複排除は、所定サイズのデータブロックを単位として実施される。例えば、記憶装置に書き込まれるデータブロック（ライトブロック）が、記憶装置にあるデータブロック（既存ブロック）と重複する場合、ライトブロックの論理アドレスと既存ブロックの物理アドレスとが対応付けられる。なお、複数のライトブロックが１つの既存ブロックと重複する場合、１つの物理アドレスに複数の論理アドレスが対応付けられ、複数の論理アドレスから同じ１つの物理アドレスが参照される。
【０００４】
個々の既存ブロックを参照する論理アドレスの数（参照数）は、リファレンスカウンタと呼ばれるメタデータを用いて管理される。リファレンスカウンタは、記憶装置に格納されるデータブロックの量が増えるにつれてサイズが大きくなる。そのため、リファレンスカウンタはメモリにすべて格納できない場合、記憶装置に格納される。
【０００５】
リファレンスカウンタは、記憶装置にある不要なデータブロックを削除して空き領域を確保する処理（ＧＣ：Garbage Collection）に利用される。ＧＣでは、参照数が０の物理アドレスにあるデータブロックの削除が実施される。なお、説明の都合上、データブロックを重複排除やＧＣの単位としているが、データブロック以外を単位としてもよい。
【０００６】
ところで、重複排除に関し、ファイルをブロックファイルに分割し、既に登録又は保存されたブロックファイルと重複するブロックファイルをアップロードせず、メタデータや重複排除管理用データベースの更新部分をアップロードする仕組みが提案されている。分割データのファイル内における位置を記憶し、その位置に対応する分割データのアドレス情報を記憶し、その位置とアドレス情報とをメタデータの中で分離して管理する仕組みが提案されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１２−１４１７３８号公報
【特許文献２】特開２０１０−２０４９７０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
リファレンスカウンタは、データブロックへのアクセスに応じて書き換えが実施される。そのため、ＳＳＤなどの書き換え回数に制限のある記憶装置を利用している場合、リファレンスカウンタの頻繁な書き換えにより記憶装置の寿命が短くなるリスクがある。頻繁に書き換えられるメタデータをストレージ制御装置のメモリに格納すれば上記のリスクは低減されるが、リファレンスカウンタがメモリ容量を圧迫するリスクがある。
【０００９】
リファレンスカウンタの一部をメモリにキャッシュして、メモリ上でリファレンスカウンタを更新し、所定のタイミングで更新後のリファレンスカウンタを記憶装置に書き込む制御を実施すれば、記憶装置の寿命に関する上記のリスクが低減されうる。また、メモリに格納するリファレンスカウンタのデータ量を制限することで、メモリ容量の圧迫に関する上記のリスクが回避されうる。
【００１０】
但し、メモリにあるリファレンスカウンタの更新内容が記憶装置のリファレンスカウンタに反映されていない状態（非同期の状態）で、記憶装置のリファレンスカウンタに基づくデータブロックの改変や削除が実施されるとデータブロックが欠損しうる。
【００１１】
例えば、ストレージ制御装置に故障が生じて記憶装置にあるリファレンスカウンタに更新内容が反映されない場合に、そのリファレンスカウンタに基づいてＧＣが実行されると、ＧＣ対象外のデータブロックが削除されるリスクが生じうる。また、ストレージ制御装置の故障以外にも負荷状況や同期タイミングの設定などにより上記リスクが生じうる。
【００１２】
１つの側面によれば、本発明の目的は、データブロックの欠損リスクを回避できるストレージ制御装置、及びプログラムを提供することにある。
【課題を解決するための手段】
【００１３】
一態様によれば、データブロックを参照する論理アドレスの数を示す参照数の情報と、参照数の更新状況を示す情報とを記憶するメモリと、参照数が変化した場合にメモリ内にある参照数の情報を更新して更新状況を更新済に設定し、所定のタイミングで、更新済の参照数の情報を記憶装置に格納して更新状況を未更新に設定し、参照数に基づく処理を実行する際に、更新済の参照数に対応するデータブロックを処理の対象から除外する制御部とを有する、ストレージ制御装置が提供される。
【発明の効果】
【００１４】
データブロックの欠損リスクを回避できる。
【図面の簡単な説明】
【００１５】
【図１】第１実施形態に係るストレージシステムの一例を示した図である。
【図２】第２実施形態に係るストレージシステムの一例を示した図である。
【図３】ユーザデータの書き込み制御について説明するための図である。
【図４】ユーザデータの重複排除及びハッシュキャッシュの管理について説明するための図である。
【図５】ハッシュキャッシュの構造について説明するための図である。
【図６】ＣＭのメモリ（制御情報領域）及び記憶装置に格納される制御情報について説明するための図である。
【図７】ブロックマップ、コンテナメタ情報、及び参照カウンタの関係について説明するための図である。
【図８】ブロックマップの更新に伴うジャーナル情報、更新フラグ情報、及び参照カウンタの更新について説明するための図である。
【図９】ユーザデータのＷＲＩＴＥ時に実行される処理の流れについて説明するためのフロー図である。
【図１０】制御情報の更新に関する処理の流れについて説明するためのフロー図である。
【図１１】参照カウンタの更新に関する処理の流れについて説明するためのフロー図である。
【図１２】ＧＣ処理の流れについて説明するためのフロー図である。
【図１３】ユーザデータのＲＥＡＤ時に実行される処理の流れについて説明するためのフロー図である。
【発明を実施するための形態】
【００１６】
以下に添付図面を参照しながら、本発明の実施形態について説明する。なお、本明細書及び図面において実質的に同一の機能を有する要素については、同一の符号を付することにより重複説明を省略する場合がある。
【００１７】
＜１．第１実施形態＞
図１を参照しながら、第１実施形態について説明する。第１実施形態は、書き込み対象のユーザデータに対してデータブロック単位で重複排除を実施するストレージシステムに関する。図１は、第１実施形態に係るストレージシステムの一例を示した図である。
【００１８】
図１に示すように、第１実施形態に係るストレージシステムは、ホスト装置１０、ストレージ制御装置２０、記憶装置３０、及び他のストレージ制御装置４０を含む。
なお、ストレージ制御装置２０、記憶装置３０、及び他のストレージ制御装置４０を含むユニットは、ストレージ装置の一例である。ストレージ装置に搭載されるＣＭ（Controller Module）は、ストレージ制御装置２０、他のストレージ制御装置４０の一例である。ストレージ制御装置２０、他のストレージ制御装置４０は同じストレージ装置に搭載される形態でもよいし、別々のストレージ装置に搭載される形態でもよい。例えば、第１実施形態の技術は、別々のストレージ装置に搭載される複数のＣＭが連携して動作するスケールアウトストレージシステムなどにも適用できる。
【００１９】
ホスト装置１０は、ストレージ制御装置２０及び／又は他のストレージ制御装置４０を介して記憶装置３０にアクセスするコンピュータである。ＰＣ（Personal Computer）やサーバ装置は、ホスト装置１０の一例である。例えば、ホスト装置１０は、ストレージ制御装置２０に対してユーザデータの書き込み要求や読み出し要求を発行する。
【００２０】
ストレージ制御装置２０は、メモリ２１及び制御部２２を有する。
メモリ２１は、例えば、ＲＡＭ（Random Access Memory）などの揮発性記憶装置、或いは、ＨＤＤ、ＳＳＤ、フラッシュメモリなどの不揮発性記憶装置である。制御部２２は、ＣＰＵ（Central Processing Unit）、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＦＰＧＡ（Field Programmable Gate Array）などのプロセッサである。制御部２２は、例えば、メモリ２１などに格納されたプログラムを実行する。
【００２１】
ストレージ制御装置２０がホスト装置１０からユーザデータの書き込み要求を受け付けると、制御部２２は、ユーザデータを所定サイズのデータブロックに分割し、データブロック（対象データブロック）のハッシュ値を計算する。また、制御部２２は、計算したハッシュ値と、メモリ２１及び／又は記憶装置３０が提供する物理記憶領域に既に格納されているデータブロック（既存データブロック）のハッシュ値と比較する。
【００２２】
計算したハッシュ値と同じハッシュ値の既存データブロックがある場合、制御部２２は、対象データブロックの書き込み先となる論理アドレスと、既存データブロックとを対応付け、書き込み完了の通知をホスト装置１０に送信する。ハッシュ値はデータブロックの内容に対応する。そのため、上記の処理により、物理記憶領域に既に存在するデータブロックと同じ内容のデータブロックが重複して書き込まれる事態を回避することができる。つまり、データブロックが重複排除される。
【００２３】
重複排除が実施されると、複数の論理アドレスから同じデータブロックが参照される。データブロックに対する論理アドレスの参照を管理するために、メモリ２１は、データブロックを参照する論理アドレスの数を示す参照数２１ａの情報と、参照数２１ａの更新状況２１ｂを示す情報とを記憶する。
【００２４】
制御部２２は、参照数２１ａが変化した場合にメモリ２１内にある参照数２１ａの情報を更新して更新状況２１ｂを更新済に設定する。また、制御部２２は、所定のタイミングで、更新済の参照数２１ａの情報を記憶装置３０に格納して更新状況２１ｂを未更新に設定する。なお、説明の都合上、記憶装置３０に格納された情報に含まれる参照数２１ａを参照数３１と表記する場合がある。
【００２５】
ストレージ制御装置２０が正常に動作している場合、所定のタイミングで参照数２１ａの情報が記憶装置３０に格納されるため、参照数２１ａ、３１は同じになる。しかし、ストレージ制御装置２０の故障などに起因して参照数２１ａ、３１が同期されていないと、参照数３１に基づく処理が実行された結果、その処理によりデータブロックが欠損するリスクがある。なお、ＧＣは、参照数３１に基づく処理の一例である。
【００２６】
そこで、制御部２２は、参照数３１に基づく処理を実行する際に、更新済の参照数２１ａに対応するデータブロックを処理の対象から除外する。参照数２１ａ、３１が同期されている場合、更新状況２１ｂは参照数２１ａの未更新を示す。一方、非同期の場合、更新状況２１ｂは参照数２１ａの更新済を示す。この更新状況２１ｂに基づいて、参照数３１に基づく処理の対象を上記の方法で特定することにより、データブロックの欠損リスクが回避される。
【００２７】
例えば、既存データブロックがない状態で、重複しないデータブロックｄＢＬＫ＃１、＃２が、それぞれ論理アドレスＡｄｄ＃１１、＃２１に格納されたとき（Ｓ１）、データブロックｄＢＬＫ＃１、＃２に対する参照数２１ａはいずれも１になる。また、参照数２１ａ、３１が同期されると、参照数３１の情報は図１のＡのようになり、データブロックｄＢＬＫ＃１、＃２の参照数２１ａは未更新に設定される。
【００２８】
上記の状態で、図１のＢに示すように、論理アドレスＡｄｄ＃１２にデータブロックｄＢＬＫ＃１と同じ内容のデータブロックｄＢＬＫ＃３が格納されると（Ｓ２）、重複排除により論理アドレスＡｄｄ＃１２がデータブロックｄＢＬＫ＃１に対応付けられる。
【００２９】
制御部２２は、図１のＣに示すように、参照数２１ａの情報を更新し、データブロックｄＢＬＫ＃１の参照数を２に変更する（Ｓ３ａ）。また、制御部２２は、図１のＤに示すように、データブロックｄＢＬＫ＃１の更新状況２１ｂを更新済（更新「あり」）に設定する（Ｓ３ｂ）。この状態でＧＣが実施されるとき、図１のＥに示すように、更新状況２１ｂが確認され（Ｓ４ａ）、データブロックｄＢＬＫ＃１がＧＣ対象から除外される（Ｓ４ｂ）。つまり、データブロックｄＢＬＫ＃１に対するＧＣが回避される。
【００３０】
なお、上記のＳ３ｂに示した手順が完了した状態ではデータブロックｄＢＬＫ＃１に対する論理アドレスの参照があるため、データブロックｄＢＬＫ＃１はＧＣ対象外である。しかし、参照数２１ａ、３１にずれがある状態で（例えば、参照数２１ａが１で、参照数３１が０の場合）、他のストレージ制御装置４０によるＧＣなどが生じた場合にデータブロックの欠損リスクが生じうる。
【００３１】
更新状況２１ｂが他のストレージ制御装置４０に通知されていれば、他のストレージ制御装置４０は、上記のＳ４ａ、Ｓ４ｂの手順でデータブロックｄＢＬＫ＃１をＧＣ対象から除外することができる。そのため、ストレージ制御装置２０の故障などに起因して参照数２１ａ、３１の同期が未了になっている場合でも、他のストレージ制御装置４０によるＧＣによりデータブロックが欠損するリスクを回避できる。
【００３２】
以上、第１実施形態について説明した。
なお、故障以外の理由で参照数２１ａ、３１が非同期の状態で維持される可能性もある。また、データブロックに対するＧＣ以外の処理に参照数３１が利用される可能性もある。このような状況に対しても同様に上述した第１実施形態の技術を適用することで、データブロックが欠損するリスクを回避できる。
【００３３】
＜２．第２実施形態＞
次に、第２実施形態について説明する。第２実施形態は、書き込み対象のユーザデータに対してデータブロック単位で重複排除を実施するストレージシステムに関する。
【００３４】
［２−１．ストレージシステム］
図２を参照しながら、ストレージシステム１００について説明する。図２は、第２実施形態に係るストレージシステムの一例を示した図である。図２に示したストレージシステム１００は、第２実施形態に係るストレージシステムの一例である。
【００３５】
図２に示すように、ストレージシステム１００は、ホスト装置１０１、及びストレージ装置１０２を有する。ストレージ装置１０２は、ＣＭ１２１、１２２、及び記憶装置１２３を有する。
【００３６】
なお、図２には、ストレージ装置１０２に２つのＣＭが搭載される例を示しているが、第２実施形態に係る技術は１つ又は３つ以上のＣＭがストレージ装置１０２に搭載される場合にも適用可能である。また、ＣＭ１２１、１２２は実質的に同じハードウェア及び機能を有するものとし、ＣＭ１２２については詳細な説明を省略する場合がある。
【００３７】
ＣＭ１２１は、複数のＣＡ（Channel Adapter）、複数のＩ／Ｆ（Interface）、プロセッサ１２１ａ、及びメモリ１２１ｂを有する。
ＣＡは、ホスト装置１０１との間の接続制御を実施するアダプタ回路である。例えば、ＣＡは、ＦＣなどの通信回線を介して、ホスト装置１０１に搭載されるＨＢＡ（Host Bus Adapter）や、ＣＡとホスト装置１０１との間に設置されるスイッチに接続される。Ｉ／Ｆは、ＳＡＳ（Serial Attached SCSI）やＳＡＴＡ（Serial ATA）などの回線を介して記憶装置１２３と接続するためのインターフェースである。
【００３８】
プロセッサ１２１ａは、例えば、ＣＰＵ、ＤＳＰ、ＡＳＩＣ、ＦＰＧＡなどである。メモリ１２１ｂは、例えば、ＲＡＭやフラッシュメモリなどである。なお、図２の例ではＣＭ１２１の内部にメモリ１２１ｂが搭載されているが、ＣＭ１２１の外部に接続されたメモリを利用してもよい。
【００３９】
メモリ１２１ｂには、後述する制御情報が格納される制御情報領域（Ｃｔｒｌ）２０１、及びユーザデータが一時的に格納されるユーザデータキャッシュ領域（ＵＤＣ）２０２が設定される。また、メモリ１２１ｂには、書き込み時にデータのハッシュ値が格納されるハッシュキャッシュ領域（ＨＣ）２０３が設定される。
【００４０】
なお、ＵＤＣ２０２は物理記憶領域の一例である。また、ＵＤＣ２０２、ＨＣ２０３の少なくとも一部は、ＣＭ１２１の外部に接続されたメモリに設けられてもよい。また、ＵＤＣ２０２、ＨＣ２０３はそれぞれ別のメモリに設けられてもよい。
【００４１】
記憶装置１２３は、記録媒体Ｄ１、…、Ｄｎを有する。記録媒体Ｄ１、…、Ｄｎは、例えば、ＳＳＤやＨＤＤなどである。記録媒体Ｄ１、…、Ｄｎには、異なる種類の記録媒体（ＨＤＤ、ＳＳＤなど）が混在していてもよい。記憶装置１２３に搭載される記録媒体の数ｎは１以上の任意の数である。ディスクアレイ（ストレージアレイ）やＲＡＩＤ装置などは記憶装置１２３の一例である。記憶装置１２３により提供される物理ボリュームやストレージプールなどの記憶領域は物理記憶領域の一例である。
【００４２】
ＣＭ１２２は、上述したＣＭ１２１と同じ要素を有する。また、ＣＭ１２１、１２２はストレージ装置１０２の内部で通信可能に接続されている。また、ＣＭ１２２は、ＣＭ１２１と同様に記憶装置１２３へのアクセスが可能である。
【００４３】
（書き込み制御）
ここで、図３を参照しながら、ユーザデータの書き込み制御について説明する。図３は、ユーザデータの書き込み制御について説明するための図である。なお、以下では、書き込み対象のユーザデータをＷＲＩＴＥデータと呼ぶ場合がある。
【００４４】
プロセッサ１２１ａは、ホスト装置１０１からＷＲＩＴＥデータの書き込み要求を受け付けたとき、ＷＲＩＴＥデータを、重複排除を実施するための所定サイズ（例えば、４ＫＢ）のデータブロックに分割する。図３の例では、ＷＲＩＴＥデータが５つのデータブロックＢ＃１、…、Ｂ＃５に分割されている。プロセッサ１２１ａは、データブロックＢ＃１、…、Ｂ＃５のハッシュ値Ｈ＃１、…、Ｈ＃５を計算し、ハッシュ値Ｈ＃１、…、Ｈ＃５を順次ＨＣ２０３のハッシュ値と比較する。
【００４５】
図３の例において、ＨＣ２０３には、古い順にハッシュ値Ｈ＃７、Ｈ＃８、Ｈ＃３、Ｈ＃４が格納されている。例えば、プロセッサ１２１ａは、ハッシュ値Ｈ＃１と、ＨＣ２０３のハッシュ値Ｈ＃７、Ｈ＃８、Ｈ＃３、Ｈ＃４とをそれぞれ比較する（Search）。この例では、ハッシュ値Ｈ＃１がＨＣ２０３に格納されていない。この場合、プロセッサ１２１ａは、データブロックＢ＃１を重複排除の対象外にし、ハッシュ値Ｈ＃１をＨＣ２０３に格納する。
【００４６】
但し、図３の例ではＨＣ２０３にはハッシュ値Ｈ＃７、Ｈ＃８、Ｈ＃３、Ｈ＃４が格納されており、ハッシュ値Ｈ＃１を格納する空き領域が不足している。この場合、プロセッサ１２１ａは、ＨＣ２０３の中で最も古いハッシュ値Ｈ＃７を削除し、ＨＣ２０３に空き領域を確保する。そして、プロセッサ１２１ａは、ＨＣ２０３の空き領域にハッシュ値Ｈ＃１を格納する。このように、ＨＣ２０３が溢れる場合には古い順にハッシュ値の削除が実施され、ＨＣ２０３の内容が更新される（Update）。
【００４７】
また、プロセッサ１２１ａは、重複排除の対象外であるデータブロックＢ＃１を圧縮し、圧縮後のデータブロックＢ＃１にハッシュ値Ｈ＃１を付加した圧縮データＢＨ＃１を生成する。そして、プロセッサ１２１ａは、圧縮データＢＨ＃１をＵＤＣ２０２に格納する。なお、プロセッサ１２１ａは、ＵＤＣ２０２が溢れうる場合（例えば、空き容量が基準値以下の場合や、使用率が閾値以上の場合など）、ＷＲＩＴＥデータの書き込みとは非同期に、ＵＤＣ２０２に格納されている圧縮データを記憶装置１２３に書き出す。
【００４８】
対象のデータブロックが重複排除の対象外になる場合、プロセッサ１２１ａにより上記のような処理が実行される。一方、ＨＣ２０３に比較対象のハッシュ値がある場合、図４のような処理が実行される。図４は、ユーザデータの重複排除及びハッシュキャッシュの管理について説明するための図である。
【００４９】
図４の例において、ＨＣ２０３には、古い順にハッシュ値Ｈ＃３、Ｈ＃４、Ｈ＃１、Ｈ＃２が格納されている。例えば、プロセッサ１２１ａは、ハッシュ値Ｈ＃４と、ＨＣ２０３のハッシュ値Ｈ＃３、Ｈ＃４、Ｈ＃１、Ｈ＃２とをそれぞれ比較する（Search）。この例では、ハッシュ値Ｈ＃４がＨＣ２０３に格納されている。この場合、プロセッサ１２１ａは、データブロックＢ＃４を重複排除の対象とし、ＨＣ２０３の中でハッシュ値Ｈ＃４を最新の位置に移動する。
【００５０】
上記のように、データブロックＢ＃４は重複排除の対象である場合、プロセッサ１２１ａは、データブロックＢ＃４及びハッシュ値Ｈ＃４のＵＤＣ２０２への書き込みを回避する（重複排除）。また、プロセッサ１２１ａは、後述する制御情報を用いて、ＵＤＣ２０２又は記憶装置１２３におけるデータブロックＢ＃４の位置（圧縮データＢＨ＃４のアドレス）と書き込み先とを対応付け、書き込み完了の応答をホスト装置１０１に返す。
【００５１】
（ＨＣの構造）
ここで、図５を参照しながら、ＨＣ２０３の構造の一例を紹介する。図５は、ハッシュキャッシュの構造について説明するための図である。
【００５２】
図５に示すように、ＨＣ２０３では、１つのデータブロックに対応するハッシュ値をエントリと呼ばれる単位で管理する。また、Ｍ個（例えば、Ｍ＝１２８）のエントリを纏めた単位をバンドルと呼ぶ場合がある。バンドルには、バンドルの識別情報などが含まれるヘッダと、Ｍ個のエントリが登録されうるエントリ領域とが含まれる。エントリには、ハッシュ値やスロット番号（後述）と共にエントリの位置を示すポインタが含まれる。
【００５３】
プロセッサ１２１ａは、個々のバンドル内でエントリの新旧を管理し、エントリ領域が溢れると最も古いエントリを削除して新たなエントリを格納する。なお、ハッシュ値の格納先となるバンドルの決め方としては、例えば、ハッシュ値をバンドルの総数で割った値に基づいて格納先を決める方法などがある。この方法によれば、検索の際には、既知であるバンドルの総数を用いてハッシュ値から格納先を特定することができる。
【００５４】
（制御情報の更新）
ここで、図６〜図８を参照しながら、制御情報領域２０１に格納される情報（制御情報）、及び制御情報の更新について説明する。
【００５５】
図６は、ＣＭのメモリ（制御情報領域）及び記憶装置に格納される制御情報について説明するための図である。図７は、ブロックマップ、コンテナメタ情報、及び参照カウンタの関係について説明するための図である。図８は、ブロックマップの更新に伴うジャーナル情報、更新フラグ情報、及び参照カウンタの更新について説明するための図である。
【００５６】
図６に示すように、制御情報領域２０１には、ブロックマップ２１１、コンテナメタ情報２１２、参照カウンタ２１３、ハッシュ情報２１４、ジャーナル情報２１５、及び更新フラグ情報２１６が格納される。
【００５７】
なお、ブロックマップ２１１は、記憶装置１２３に格納されたブロックマップ２２１の一部である。コンテナメタ情報２１２は、記憶装置１２３に格納されたコンテナメタ情報２２２の一部である。参照カウンタ２１３は、記憶装置１２３に格納された参照カウンタ２２３の一部である。つまり、ブロックマップ２１１、コンテナメタ情報２１２、参照カウンタ２１３は、それぞれブロックマップ２２１、コンテナメタ情報２２２、参照カウンタ２２３のキャッシュデータである。
【００５８】
既に述べたように、ストレージ装置１０２において、ユーザデータは、所定サイズを有するデータブロックに分割され、データブロックの単位で管理される。データブロックの格納先はスロット番号により管理される。例えば、データブロックＢ＃１、Ｂ＃２、Ｂ＃３、…の格納先は、それぞれスロット番号１、２、３、…に対応付けられる。
【００５９】
ブロックマップ２２１は、図６のＡに示すように、データブロックの格納位置を示す論理アドレスと、そのデータブロックに対応するスロット番号とを対応付ける情報である。論理アドレスは、例えば、論理ボリューム、仮想ディスク、ＬＵＮ（Logical Unit Number）などで表現される論理記憶領域内の位置を示すアドレスである。重複排除の対象となるデータブロックの場合、複数の論理アドレスに同じスロット番号が対応付けられる。
【００６０】
なお、ブロックマップ２１１については、例えば、ブロックマップ２２１のうち、論理アドレスｘ１、…、ｘ６の部分がブロックマップ２１１として制御情報領域２０１に格納される。
【００６１】
コンテナメタ情報２２２は、図７に示すように、スロット番号と、そのスロット番号に対応するデータブロックの格納位置を示す物理アドレスとを対応付ける情報である。コンテナメタ情報２１２には、データブロックの圧縮サイズが含まれていてもよい。物理アドレスは、ＵＤＣ２０２又は記憶装置１２３により提供される物理記憶領域内の位置を示すアドレスである。
【００６２】
ブロックマップ２２１及びコンテナメタ情報２２２から、各データブロックの論理アドレスと物理アドレスとの対応関係を特定することができる。図７の例では、ブロックマップ２２１で論理アドレスｘ２、ｘ６に同じスロット番号２が対応付けられている。また、コンテナメタ情報２２２では、スロット番号２に物理アドレスｙ２が対応付けられている。つまり、論理アドレスｘ２、ｘ６には同じデータブロックが格納されており、論理アドレスｘ２、ｘ６に対するアクセスがあると物理アドレスｙ２が参照される。
【００６３】
なお、コンテナメタ情報２１２については、例えば、コンテナメタ情報２２２のうち、制御情報領域２０１に格納されたブロックマップ２１１の論理アドレスに対応するスロット番号の部分がコンテナメタ情報２１２として制御情報領域２０１に格納される。
【００６４】
参照カウンタ２２３は、図７に示すように、スロット番号とカウンタ値（参照数）とを対応付ける情報である。参照数は、１つのスロット番号に対応付けられている論理アドレスの数を表す。つまり、参照数は、重複排除により同じ物理アドレスに対応付けられる論理アドレスの数を表し、その物理アドレスを参照する論理アドレスの数に相当する。
【００６５】
なお、参照カウンタ２１３については、例えば、参照カウンタ２２３のうち、制御情報領域２０１に格納されたコンテナメタ情報２１２のスロット番号に対応する部分が参照カウンタ２１３として制御情報領域２０１に格納される。
【００６６】
ハッシュ情報２１４は、図６のＢに示すように、データブロックのハッシュ値とスロット番号とを対応付ける情報である。例えば、ハッシュ情報２１４は、スロット番号１、２、３、…にハッシュ値Ｈ＃１、Ｈ＃２、Ｈ＃３、…を対応付ける。データブロックの内容とハッシュ値とは１対１に対応するため、ハッシュ情報２１４は、スロット番号とデータブロックの内容とを対応付けている。
【００６７】
上記のように、ブロックマップ２１１、コンテナメタ情報２１２、参照カウンタ２１３は、記憶装置１２３にあるブロックマップ２２１、コンテナメタ情報２２２、参照カウンタ２２３の一部に相当するキャッシュデータである。
【００６８】
ユーザデータの書き込み（新規書き込み／書き換え）要求があると、書き込み先の論理アドレスとスロット番号との対応関係が更新されうる。この更新は、制御情報領域２０１にあるブロックマップ２１１などの制御情報に反映され、所定のタイミングで記憶装置１２３にあるブロックマップ２２１などの制御情報に反映される。つまり、書き込み要求の際には制御情報領域２０１の制御情報が更新され、所定のタイミングで、制御情報領域２０１にある制御情報と、記憶装置１２３にある制御情報とが同期される。
【００６９】
例えば、論理アドレスｘ１に対するデータブロックの書き込みが生じた場合、図８のＡに示すように、ブロックマップ２１１が更新される。図８のＡに示した例では、論理アドレスｘ１に書き込まれるデータブロックが、スロット番号２に対応する物理アドレスにあるデータブロックと同じである（重複排除の対象）。この場合、プロセッサ１２１ａは、ブロックマップ２１１を更新して論理アドレスｘ１にスロット番号２を対応付ける。
【００７０】
上記の更新があると、スロット番号１に対応付けられる論理アドレスの数が１つ減少し、スロット番号２に対応付けられる論理アドレスの数が１増加する。つまり、スロット番号１、２の参照数が変化する。このような参照数の変化があると、プロセッサ１２１ａは、参照カウンタ２１３をすぐに更新するのではなく、ジャーナル情報２１５に参照数の変化を記録する。
【００７１】
例えば、プロセッサ１２１ａは、図８のＢに示すように、ブロックマップ２１１の更新前に論理アドレスｘ１に対応付けられていたスロット番号をＯＬＤスロット番号に設定し、新たに論理アドレスｘ１に対応付けたスロット番号をＮＥＷスロット番号に設定する。つまり、ＯＬＤスロット番号は書き換え前のスロット番号を示し、ＮＥＷスロット番号は書き換え後のスロット番号を示す。なお、新規書き込みの場合（論理アドレスに対応付けられているスロット番号がない場合）、ＮＥＷスロット番号だけが設定される。
【００７２】
図８のＢに示すように、ＯＬＤスロット番号は、参照数が１減少したスロット番号である。一方、ＮＥＷスロット番号は、参照数が１増加したスロット番号である。このように、ＯＬＤスロット番号とＮＥＷスロット番号とをジャーナル情報２１５に記録しておくことで、各スロット番号に対する参照数の増減を把握することが可能になる。
【００７３】
プロセッサ１２１ａは、所定のタイミングで、図８のＣに示すように、ジャーナル情報２１５の更新内容を参照カウンタ２１３に反映させる。図８のＢに例示したジャーナル情報２１５の場合、スロット番号１（ＳＮ＃１）の参照数が１減少し（１増２減）、スロット番号２（ＳＮ＃２）の参照数は変化せず（１増１減）、スロット番号３（ＳＮ＃３）の参照数が１増加する（１増）。プロセッサ１２１ａは、ジャーナル情報２１５に基づいて各スロット番号に対する参照数の増減を計算し、図８のＣに示すように、計算した増減に基づいて参照カウンタ２１３のカウンタ値（参照数）を更新する。
【００７４】
プロセッサ１２１ａは、参照数を更新したスロット番号を図８のＤに示すような更新フラグ情報２１６により管理する。なお、プロセッサ１２１ａは、１つ又は複数のスロット番号を組にし、組毎に参照数の変化（更新）があるか否かを管理してもよい。図８のＤに示した例では、２つのスロット番号を組にして更新の有無が管理されている。更新の有無は、例えば、更新フラグで示される。この例では、更新フラグが１の場合には更新ありの状態を示し、更新フラグが０の場合には更新なしの状態を示す。
【００７５】
図８のＤに例示した参照カウンタ２１３によれば、スロット番号１又は２に対する参照数が更新されている。更新フラグは、制御情報領域２０１にある参照カウンタ２１３と、記憶装置１２３にある参照カウンタ２２３とが同期されたときにリセットされる。なお、参照カウンタ２１３、２２３の同期は、ユーザデータの書き込みタイミングと非同期に実施される。プロセッサ１２１ａは、参照カウンタ２１３、２２３の同期を完了したスロット番号の更新フラグを０に更新（リセット）する。
【００７６】
（ＧＣの処理）
参照カウンタ２２３のカウンタ値は、例えば、ＧＣに利用される。ＧＣは、論理アドレスによる参照がないデータブロックを削除する処理である。ＧＣを実施するプロセッサ１２１ａは、参照カウンタ２２３のカウンタ値を参照し、カウンタ値が０のスロット番号を特定する。また、プロセッサ１２１ａは、コンテナメタ情報２２２を参照し、特定したスロット番号に対応する物理アドレスを特定する。そして、プロセッサ１２１ａは、特定した物理アドレスにあるデータブロックを削除する。
【００７７】
上記のように、ＧＣでは記憶装置１２３にある参照カウンタ２２３が利用される。そのため、ＣＭ１２１の故障などにより参照カウンタ２１３の更新内容が記憶装置１２３の参照カウンタ２２３に反映されていないと、実際にはカウンタ値が０ではないスロット番号に対応するデータブロックが削除されるリスクがある。そのため、プロセッサ１２１ａは、ＧＣを実施する際に更新フラグ情報２１６を参照し、参照カウンタ２２３のカウンタ値が０のスロット番号のうち、更新フラグが１のスロット番号をＧＣ対象から除外する。
【００７８】
また、プロセッサ１２１ａは、更新フラグ情報２１６を更新した際に更新後の更新フラグ情報２１６をＣＭ１２２に通知する。ＧＣはＣＭ１２２により実施されることがある。この場合、ＣＭ１２２は、上記のプロセッサ１２１ａと同様に、記憶装置１２３にある参照カウンタ２２３のカウント値及び更新フラグ情報２１６の更新フラグに基づいてＧＣ対象のスロット番号を特定する。そして、ＣＭ１２２は、特定したＧＣ対象のスロット番号についてＧＣの処理を実行する。
【００７９】
なお、ＣＭ１２２もＣＭ１２１（プロセッサ１２１ａ）と同様にブロックマップ、コンテナメタ情報、参照カウンタ、ハッシュ情報、ジャーナル情報、更新フラグ情報を管理する。そして、更新フラグ情報を更新した場合、ＣＭ１２２は、更新後の更新フラグ情報をＣＭ１２１に通知する。プロセッサ１２１ａは、ＧＣを実施する際、制御情報領域２０１にある更新フラグ情報２１６に加え、ＣＭ１２２から通知された更新フラグ情報を参照してＧＣ対象のスロット番号を特定する。
【００８０】
上記のように、参照カウンタ２２３の一部を参照カウンタ２１３としてメモリ１２１ｂ（制御情報領域２０１）にキャッシュし、書き込み時に参照カウンタ２１３を更新することで、記憶装置１２３に対するアクセス頻度を低減することができる。記憶装置１２３がＳＳＤなどの書き換え回数に制限があるデバイスである場合、アクセス頻度の低減は、記憶装置１２３の寿命を延ばすことに寄与する。また、記憶装置１２３へのアクセス頻度を減らすことで記憶装置１２３の処理負荷を低減することにも寄与する。
【００８１】
また、ＣＭ１２１の故障などに起因して参照カウンタ２１３、２２３が同期されていない状態にあっても更新フラグ情報２１６を利用することで非同期のカウンタ値に対応するスロット番号のデータブロックをＧＣ対象から除外することが可能になる。ＧＣ対象から除外されることで、実際には論理アドレスから参照されているデータブロックが削除されるリスクを回避することができる。ＣＭ１２１、１２２間で互いに更新フラグ情報を共有することで、他ＣＭがＧＣを実施する場合の上記リスクも回避される。
【００８２】
以上、ストレージシステム１００について説明した。
［２−２．処理の流れ］
次に、ストレージ装置１０２による処理の流れについて説明する。
【００８３】
（ＷＲＩＴＥ時の処理）
図９を参照しながら、ＷＲＩＴＥ時の処理の流れについて説明する。図９は、ユーザデータのＷＲＩＴＥ時に実行される処理の流れについて説明するためのフロー図である。
【００８４】
（Ｓ１０１）ホスト装置１０１からＷＲＩＴＥデータの書き込み要求を受けると、プロセッサ１２１ａは、ＷＲＩＴＥデータを複数のデータブロックに分割する。また、プロセッサ１２１ａは、各データブロックのハッシュ値を計算する。
【００８５】
（Ｓ１０２）プロセッサ１２１ａは、Ｓ１０１で計算した複数のハッシュ値から未選択のハッシュ値を１つ選択する。なお、Ｓ１０２で選択されたハッシュ値を選択ハッシュ値と表記する場合がある。
【００８６】
（Ｓ１０３）プロセッサ１２１ａは、選択ハッシュ値がＨＣ２０３にあるか否かを判定する。選択ハッシュ値がＨＣ２０３にある場合、処理はＳ１０４へと進む。一方、選択ハッシュ値がＨＣ２０３にない場合、処理はＳ１０５へと進む。
【００８７】
（Ｓ１０４）プロセッサ１２１ａは、選択ハッシュ値が最新になるように、ＨＣ２０３内で選択ハッシュ値の位置を移動する（図４を参照）。Ｓ１０４の処理が完了すると、処理はＳ１０７へと進む。
【００８８】
（Ｓ１０５）プロセッサ１２１ａは、ＨＣ２０３に選択ハッシュ値を格納する。ＨＣ２０３に空きがない場合、プロセッサ１２１ａは、ＨＣ２０３内で最も古いハッシュ値を削除して空き領域を確保する。そして、プロセッサ１２１ａは、ＨＣ２０３に選択ハッシュ値を格納する（図３を参照）。
【００８９】
（Ｓ１０６）プロセッサ１２１ａは、選択ハッシュ値に対応するデータブロックを圧縮する。また、プロセッサ１２１ａは、圧縮後のデータブロックに選択ハッシュ値を付加して圧縮データを生成し、圧縮データをＵＤＣ２０２に格納する。
【００９０】
（Ｓ１０７）プロセッサ１２１ａは、制御情報２０１ａを更新する。
（更新内容＃１）選択ハッシュ値がＨＣ２０３にあった場合（Ｓ１０３：ＹＥＳ）、プロセッサ１２１ａは、ハッシュ情報２１４を参照して選択ハッシュ値に対応するスロット番号（既存のデータブロックに対応するスロット番号）を特定する。また、プロセッサ１２１ａは、選択ハッシュ値に対応するデータブロックの論理アドレスをブロックマップ２１１に登録し、登録した論理アドレスと、特定したスロット番号とを対応付ける。
【００９１】
また、登録した論理アドレスに既に対応付けられているスロット番号（ＯＬＤスロット番号）がブロックマップ２１１にある場合、プロセッサ１２１ａは、ＯＬＤスロット番号をジャーナル情報２１５に登録する。また、プロセッサ１２１ａは、ジャーナル情報２１５の中で、登録したＯＬＤスロット番号と、上記の特定したスロット番号（ＮＥＷスロット番号）とを対応付ける。
【００９２】
（更新内容＃２）選択ハッシュ値がＨＣ２０３にない場合（Ｓ１０３：ＮＯ）、プロセッサ１２１ａは、選択ハッシュ値の書き込み先である論理アドレスをブロックマップ２１１に登録し、登録した論理アドレスと新たに確保したスロット番号とを対応付ける。また、プロセッサ１２１ａは、ハッシュ情報２１４に新たなスロット番号を登録し、登録したスロット番号と選択ハッシュ値とを対応付ける。
【００９３】
また、プロセッサ１２１ａは、コンテナメタ情報２１２に新たなスロット番号を登録し、登録したスロット番号と、選択ハッシュ値に対応するデータブロックの格納先となる物理アドレス（この場合はＵＤＣ２０２内の位置を示すアドレス）とを対応付ける。また、プロセッサ１２１ａは、コンテナメタ情報２１２に登録したスロット番号と、データブロックの圧縮サイズとを対応付ける。また、プロセッサ１２１ａは、新たなスロット番号（ＮＥＷスロット番号）をジャーナル情報２１５に登録する。
【００９４】
（Ｓ１０８）プロセッサ１２１ａは、ハッシュ値を選択し終えたか否かを判定する。未選択のハッシュ値がある場合、処理はＳ１０２へと進む。一方、ハッシュ値を選択し終えた場合、処理はＳ１０９へと進む。
【００９５】
（Ｓ１０９）プロセッサ１２１ａは、書き込み要求に対する応答として、ＷＲＩＴＥデータの書き込みが完了した旨の通知をホスト装置１０１に送信する。Ｓ１０９の処理が完了すると、図９に示した一連の処理は終了する。
【００９６】
ここで、図１０を参照しながら、制御情報の更新に関する処理（Ｓ１０７に対応する処理）の流れについて、さらに説明する。図１０は、制御情報の更新に関する処理の流れについて説明するためのフロー図である。
【００９７】
（Ｓ１１１）プロセッサ１２１ａは、選択ハッシュ値に対応するデータブロックが重複排除の対象であるか否か（Ｓ１０３で選択ハッシュ値がＨ２０３にあると判定したか否か）を判定する。重複排除の対象である場合、処理はＳ１１３へと進む。一方、重複排除の対象ではない場合、処理はＳ１１２へと進む。
【００９８】
（Ｓ１１２）プロセッサ１２１ａは、選択ハッシュ値の書き込み先である論理アドレスをブロックマップ２１１に登録し、登録した論理アドレスと新たに確保したスロット番号とを対応付ける。また、プロセッサ１２１ａは、ハッシュ情報２１４に新たなスロット番号を登録し、登録したスロット番号と選択ハッシュ値とを対応付ける。
【００９９】
また、プロセッサ１２１ａは、コンテナメタ情報２１２に新たなスロット番号を登録し、登録したスロット番号と、選択ハッシュ値に対応するデータブロックの格納先となる物理アドレスとを対応付ける。また、プロセッサ１２１ａは、コンテナメタ情報２１２に登録したスロット番号と、データブロックの圧縮サイズとを対応付ける。また、プロセッサ１２１ａは、新たなスロット番号（ＮＥＷスロット番号）をジャーナル情報２１５に登録する。Ｓ１１２の処理が完了すると、図１０に示した一連の処理は終了する。
【０１００】
（Ｓ１１３）プロセッサ１２１ａは、ハッシュ情報２１４を参照して選択ハッシュ値に対応するスロット番号（既存のデータブロックに対応するスロット番号）を特定する。また、プロセッサ１２１ａは、選択ハッシュ値に対応するデータブロックの論理アドレスをブロックマップ２１１に登録し、登録した論理アドレスと、特定したスロット番号とを対応付ける。
【０１０１】
また、登録した論理アドレスに既に対応付けられているスロット番号（ＯＬＤスロット番号）がブロックマップ２１１にある場合、プロセッサ１２１ａは、ＯＬＤスロット番号をジャーナル情報２１５に登録する。また、プロセッサ１２１ａは、ジャーナル情報２１５の中で、登録したＯＬＤスロット番号と、上記の特定したスロット番号（ＮＥＷスロット番号）とを対応付ける。
【０１０２】
なお、登録した論理アドレスに既に対応付けられているスロット番号（ＯＬＤスロット番号）がブロックマップ２１１にない場合、プロセッサ１２１ａは、ＮＥＷスロット番号をジャーナル情報２１５に登録する。ブロックマップ２１１、ジャーナル情報２１５の更新が完了すると、図１０に示した一連の処理は終了する。
【０１０３】
（参照カウンタの更新）
ここで、図１１を参照しながら、参照カウンタの更新に関する処理の流れについて説明する。図１１は、参照カウンタの更新に関する処理の流れについて説明するためのフロー図である。なお、参照カウンタ２１３の更新は、例えば、ジャーナル情報２１５のレコード数が基準数に達した場合、前回更新時からの経過時間が基準時間に達した場合、或いは、予め設定された周期（１時間毎など）やタイミングで実施される。
【０１０４】
（Ｓ１２１）プロセッサ１２１ａは、ジャーナル情報２１５に基づいて参照数の増減があるスロット番号を特定する。例えば、図８の例では、スロット番号１（ＳＮ＃１）の参照数が１減少（１増２減）、スロット番号３の参照数が１増加している。この場合、プロセッサ１２１ａは、ジャーナル情報２１５からスロット番号１、３を特定する。
【０１０５】
（Ｓ１２２）プロセッサ１２１ａは、Ｓ１２１で特定したスロット番号に対応する参照カウンタ２１３の内容（カウンタ値）がメモリ１２１ｂ（制御情報領域２０１）にあるか否かを判定する。Ｓ１２１で特定されたスロット番号に対応する参照カウンタ２１３の内容がメモリ１２１ｂにある場合、処理はＳ１２６へと進む。一方、Ｓ１２１で特定されたスロット番号に対応する参照カウンタ２１３の内容がメモリ１２１ｂにない場合、処理はＳ１２３へと進む。
【０１０６】
（Ｓ１２３）プロセッサ１２１ａは、Ｓ１２１で特定したスロット番号に対応する参照カウンタ２１３の内容を格納するための空き領域（参照カウンタ用の空き領域）が制御情報領域２０１にあるか否かを判定する。参照カウンタ用の空き領域がある場合、処理はＳ１２５へと進む。一方、参照カウンタ用の空き領域がない場合、処理はＳ１２４へと進む。
【０１０７】
（Ｓ１２４）プロセッサ１２１ａは、Ｓ１２１で特定したスロット番号以外のスロット番号に対応する参照カウンタ２１３の内容（対象外の参照カウンタ）を記憶装置１２３に移動して空き領域を確保する。また、プロセッサ１２１ａは、対象外の参照カウンタに対応するスロット番号について更新フラグ情報２１６を０に更新する。
【０１０８】
（Ｓ１２５）プロセッサ１２１ａは、Ｓ１２１で特定したスロット番号に対応する参照カウンタ２２３の内容を記憶装置１２３から読み出す。そして、プロセッサ１２１ａは、読み出した参照カウンタ２２３の内容をメモリ１２１ｂ（制御情報領域２０１）に格納する。なお、制御情報領域２０１に格納された参照カウンタ２２３の内容が参照カウンタ２１３として利用される。
【０１０９】
（Ｓ１２６）プロセッサ１２１ａは、ジャーナル情報２１５に基づく参照数の増減をメモリ１２１ｂ（制御情報領域２０１）上の参照カウンタ２１３に反映する。
例えば、図８に例示したジャーナル情報２１５の場合、スロット番号１の参照数が１減少、スロット番号３の参照数が１増加している。この場合、プロセッサ１２１ａは、参照カウンタ２１３にあるスロット番号１のカウンタ値を１減少させ、スロット番号３のカウンタ値を１増加させる。
【０１１０】
また、プロセッサ１２１ａは、該当するスロット番号（この例ではスロット番号１、３）に対応する更新フラグ情報２１６の更新フラグを１に更新する。
（Ｓ１２７）プロセッサ１２１ａは、更新後の更新フラグ情報２１６を他ＣＭ（ＣＭ１２２）に通知する。Ｓ１２７の処理が完了すると、図１１に示した一連の処理は終了する。なお、ＣＭ１２１、１２２は異なるスロット番号を管理するが、ＣＭ１２２もＣＭ１２１と同様に動作する。ＣＭ１２２から更新フラグ情報が通知された場合、プロセッサ１２１ａは、通知された更新フラグ情報をメモリ１２１ｂに保持する。
【０１１１】
（ＧＣ処理）
ここで、図１２を参照しながら、ＧＣ処理の流れについて説明する。図１２は、ＧＣ処理の流れについて説明するためのフロー図である。
【０１１２】
（Ｓ１３１）プロセッサ１２１ａは、更新フラグ情報２１６を参照し、更新フラグが０のスロット番号を特定する。また、プロセッサ１２１ａは、ＣＭ１２２（他ＣＭ）から更新フラグ情報の通知を受けている場合、ＣＭ１２２の更新フラグ情報を参照し、更新フラグが０のスロット番号を特定する。なお、説明の都合上、Ｓ１３１で特定されたスロット番号の集合をスロット番号群Ｘと表現する。
【０１１３】
（Ｓ１３２）プロセッサ１２１ａは、記憶装置１２３にある参照カウンタ２２３の中でカウンタ値（参照数）が０のスロット番号を抽出する。なお、説明の都合上、Ｓ１３２で抽出されたスロット番号の集合をスロット番号群Ｙと表現する。
【０１１４】
（Ｓ１３３）プロセッサ１２１ａは、スロット番号群Ｘ、Ｙに共通するスロット番号に対応するユーザデータをＵＤＣ２０２及び記憶装置１２３から削除する。Ｓ１３３の処理が完了すると、図１２に示した一連の処理は終了する。
【０１１５】
（ＲＥＡＤ時の処理）
次に、図１３を参照しながら、ＲＥＡＤ時の処理の流れについて説明する。図１３は、ユーザデータのＲＥＡＤ時に実行される処理の流れについて説明するためのフロー図である。
【０１１６】
（Ｓ１４１）ホスト装置１０１からＲＥＡＤデータの読み出し要求を受けたとき、プロセッサ１２１ａは、ＲＥＡＤデータがＵＤＣ２０２にあるか否かを判定する。
例えば、プロセッサ１２１ａは、ブロックマップ２１１及びコンテナメタ情報２１２を参照し、読み出し元の論理アドレスに対応する物理アドレスがＵＤＣ２０２に対応するか、記憶装置１２３に対応するかを判定する。
【０１１７】
読み出し元の論理アドレスがＵＤＣ２０２の物理アドレスに対応する場合、プロセッサ１２１ａは、ＲＥＡＤデータがＵＤＣ２０２にあると判定する。一方、読み出し元の論理アドレスが記憶装置１２３の物理アドレスに対応する場合、プロセッサ１２１ａは、ＲＥＡＤデータが記憶装置１２３にあると判定する。
【０１１８】
ＲＥＡＤデータがＵＤＣ２０２にある場合、処理はＳ１４３へと進む。一方、ＲＥＡＤデータがＵＤＣ２０２にない場合（記憶装置１２３にある場合）、処理はＳ１４２へと進む。
【０１１９】
（Ｓ１４２）プロセッサ１２１ａは、ＲＥＡＤデータを記憶装置１２３から読み出してＵＤＣ２０２に格納する。例えば、プロセッサ１２１ａは、ブロックマップ２１１及びコンテナメタ情報２１２を参照し、読み出し元の論理アドレスに対応する物理アドレスを特定する。そして、プロセッサ１２１ａは、特定した物理アドレスにある圧縮データを読み出してＵＤＣ２０２に格納する。
【０１２０】
（Ｓ１４３）プロセッサ１２１ａは、ＵＤＣ２０２に格納した圧縮データに含まれる圧縮後のデータブロックを伸長して圧縮前のデータブロックを復元する。また、プロセッサ１２１ａは、復元した複数のデータブロックを結合してＲＥＡＤデータを復元する。そして、プロセッサ１２１ａは、読み出し要求に対する応答として、復元したＲＥＡＤデータをホスト装置１０１に送信する。
【０１２１】
Ｓ１４３の処理が完了すると、図１３に示した一連の処理は終了する。
以上、ストレージ装置１０２による処理の流れについて説明した。
上記のように、参照カウンタ２２３の一部を参照カウンタ２１３としてメモリ１２１ｂ（制御情報領域２０１）にキャッシュし、書き込み時に参照カウンタ２１３を更新することで、記憶装置１２３に対するアクセス頻度を低減することができる。記憶装置１２３がＳＳＤなどの書き換え回数に制限があるデバイスである場合、アクセス頻度の低減は、記憶装置１２３の寿命を延ばすことに寄与する。また、記憶装置１２３へのアクセス頻度を減らすことで記憶装置１２３の処理負荷を低減することにも寄与する。
【０１２２】
また、ＣＭ１２１の故障などに起因して参照カウンタ２１３、２２３が同期されていない状態にあっても更新フラグ情報２１６を利用することで非同期のカウンタ値に対応するスロット番号のデータブロックをＧＣ対象から除外することが可能になる。ＧＣ対象から除外されることで、実際には論理アドレスから参照されているデータブロックが削除されるリスクを回避することができる。ＣＭ１２１、１２２間で互いに更新フラグ情報を共有することで、他ＣＭがＧＣを実施する場合の上記リスクも回避される。
【０１２３】
以上、第２実施形態について説明した。
上記のように、記憶装置１２３にある参照カウンタ２２３の一部を参照カウンタ２１３としてメモリ１２１ｂに格納し、参照カウンタ２１３を更新することで、記憶装置１２３に対する書き換え負荷を軽減できる。また、参照カウンタ２１３、２２３の同期状況を更新フラグ情報２１６により管理することで、参照カウンタ２２３に基づくＧＣにより実際には参照数が０ではないユーザデータが削除されるリスクを回避できる。
【０１２４】
なお、上述したＣＭ１２１の機能は、プロセッサ１２１ａにプログラムを実行させることで実現できる。
上記のプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、磁気記憶装置、光ディスク、光磁気記録媒体、半導体メモリなどがある。磁気記憶装置には、ハードディスク装置（ＨＤＤ）、フレキシブルディスク（ＦＤ）、磁気テープなどがある。光ディスクには、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact Disc-Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などがある。光磁気記録媒体には、ＭＯ（Magneto-Optical disk）などがある。
【０１２５】
プログラムを流通させる場合には、例えば、そのプログラムが記録されたＤＶＤ、ＣＤ−ＲＯＭなどの可搬型記録媒体が販売される。また、プログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
【０１２６】
プログラムを実行するコンピュータは、例えば、可搬型記録媒体に記録されたプログラム又はサーバコンピュータから転送されたプログラムを、自己の記憶装置に格納する。そして、コンピュータは、自己の記憶装置からプログラムを読み取り、プログラムに従った処理を実行する。
【０１２７】
コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することもできる。また、コンピュータは、ネットワークを介して接続されたサーバコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムに従った処理を実行することもできる。
【０１２８】
＜３．付記＞
以上説明した実施形態に関し、さらに以下の付記を開示する。
（付記１）  データブロックを参照する論理アドレスの数を示す参照数の情報と、前記参照数の更新状況を示す情報とを記憶するメモリと、
前記参照数が変化した場合に前記メモリ内にある前記参照数の情報を更新して前記更新状況を更新済に設定し、
所定のタイミングで、更新済の前記参照数の情報を記憶装置に格納して前記更新状況を未更新に設定し、
前記参照数に基づく処理を実行する際に、更新済の前記参照数に対応する前記データブロックを前記処理の対象から除外する制御部と
を有する、ストレージ制御装置。
【０１２９】
（付記２）  前記処理は、
前記参照数が０となった前記データブロックを削除する処理である
付記１に記載のストレージ制御装置。
【０１３０】
（付記３）  前記制御部は、
前記処理を実行可能な他のストレージ制御装置に対して前記更新状況を通知し、前記他のストレージ制御装置による前記処理の対象から、更新済の前記参照数に対応する前記データブロックを除外する
付記１に記載のストレージ制御装置。
【０１３１】
（付記４）  データブロックを参照する論理アドレスの数を示す参照数の情報と、前記参照数の更新状況を示す情報とをメモリに記憶させ、
前記参照数が変化した場合に前記メモリ内にある前記参照数の情報を更新して前記更新状況を更新済に設定し、
所定のタイミングで、更新済の前記参照数の情報を記憶装置に格納して前記更新状況を未更新に設定し、
前記参照数に基づく処理を実行する際に、更新済の前記参照数に対応する前記データブロックを前記処理の対象から除外する
処理をコンピュータに実行させる、プログラム。
【０１３２】
（付記５）  前記処理は、
前記参照数が０となった前記データブロックを削除する処理である
付記４に記載のプログラム。
【０１３３】
（付記６）  前記処理を実行可能な他のストレージ制御装置に対して前記更新状況を通知し、前記他のストレージ制御装置による前記処理の対象から、更新済の前記参照数に対応する前記データブロックを除外する
処理をコンピュータに実行させる、付記５に記載のプログラム。
【符号の説明】
【０１３４】
１０  ホスト装置
２０  ストレージ制御装置
２１  メモリ
２１ａ、３１  参照数
２１ｂ  更新状況
２２  制御部
３０  記憶装置
４０  他のストレージ制御装置
ｄＢＬＫ＃１、ｄＢＬＫ＃２  データブロック
Ａｄｄ＃１１、Ａｄｄ＃１２、Ａｄｄ＃２１  論理アドレス
【図１】
2019036130.tif 000003
【図２】
2019036130.tif 000004
【図３】
2019036130.tif 000005
【図４】
2019036130.tif 000006
【図５】
2019036130.tif 000007
【図６】
2019036130.tif 000008
【図７】
2019036130.tif 000009
【図８】
2019036130.tif 000010
【図９】
2019036130.tif 000011
【図１０】
2019036130.tif 000012
【図１１】
2019036130.tif 000013
【図１２】
2019036130.tif 000014
【図１３】
2019036130.tif 000015