(57)【要約】【課題】  ガベージの発生に起因する記憶領域の枯渇を防止しながら、ホストから見た応答性能の低下をも防止し得るストレージ装置及びその制御方法を提案する。【解決手段】  プールを構成する１又は複数の記憶デバイスと、仮想的な論理空間である追書き空間を管理し、ホストにより仮想ボリュームに書き込まれたデータのうちの圧縮対象のデータを圧縮して追書き空間に追記し、追書き空間に追記した圧縮後のデータを記憶デバイスに書き込むコントローラとをストレージ装置に設け、コントローラは、プールの使用量が閾値以上となった場合には、ホストからのライト要求の受付を制限し、コントローラが、追書き空間に追記したデータが更新された場合に、所定の条件を満たすか否かを判定し、所定の条件を満たす場合に、更新後の当該データの圧縮データを、追書き空間に追記されている更新前の当該データの圧縮データに上書きするようにした。【選択図】        図１７
2019128906.tif 000002
【特許請求の範囲】
【請求項１】
ホストに対して仮想的な記憶空間である仮想ボリュームを提供するストレージ装置において、
プールを構成する１又は複数の記憶デバイスと、
仮想的な論理空間である追書き空間を管理し、前記ホストにより前記仮想ボリュームに書き込まれた前記データのうちの圧縮対象のデータを圧縮して前記追書き空間に追記し、前記追書き空間に追記した圧縮後の前記データを前記記憶デバイスに書き込むコントローラと
を備え、
前記コントローラは、
前記プールの使用量が閾値以上となった場合には、前記ホストからの前記ライト要求の受付を制限し、
前記追書き空間に追記したデータが更新された場合に、所定の条件を満たす場合には、更新後の当該データの圧縮データを、前記追書き空間に追記されている更新前の当該データの圧縮データに上書きする
ことを特徴とするストレージ装置。
【請求項２】
前記追書き空間に格納された前記データが更新され、更新後の当該データの圧縮データが前記追書き空間に追記された場合には、前記追書き空間に格納されている更新前の当該データの圧縮データがガベージとして管理され、
前記コントローラは、
更新後の前記データの圧縮後のデータサイズが前記追書き空間に格納されている更新前の当該データの圧縮後のデータサイズ以下であり、かつ、前記プールにおける前記ガベージのデータ量が、当該プールに格納された各データの前記圧縮前の総データ量と、当該プールに格納された各前記データの前記圧縮後の総データ量との差分以上であるか、又は、更新後の前記データの圧縮後のデータサイズが前記追書き空間に格納されている更新前の当該データの圧縮後のデータサイズ以下であり、かつ、当該プールの使用量が閾値以上の場合に、更新後の当該データの圧縮データを、前記追書き空間に格納されている更新前の当該データの圧縮データに上書きする
ことを特徴とする請求項１に記載のストレージ装置。
【請求項３】
前記コントローラは、
前記仮想ボリュームの同一領域に対する前記ホストからの初回のデータライト時には当該データライトと同期してデータを前記記憶デバイスに書き込み、２回目以降のデータライト時には当該データライトとは非同期にデータを前記記憶デバイスに書き込む
ことを特徴とする請求項２に記載のストレージ装置。
【請求項４】
一部の前記記憶デバイスは、格納されたデータを圧縮して記憶保持する圧縮機能が搭載され、
当該記憶デバイスに格納される前記データは、前記仮想ボリュームから圧縮されて前記追書き空間に追記されることなく当該記憶デバイスに与えられる
ことを特徴とする請求項３に記載のストレージ装置。
【請求項５】
ホストに対して仮想的な記憶空間である仮想ボリュームを提供するストレージ装置の制御方法において、
前記ストレージ装置は、
プールを構成する１又は複数の記憶デバイスと、
仮想的な論理空間である追書き空間を管理し、前記ホストにより前記仮想ボリュームに書き込まれた前記データのうちの圧縮対象のデータを圧縮して前記追書き空間に追記し、前記追書き空間に追記した圧縮後の前記データを前記記憶デバイスに書き込むコントローラと
を有し、
前記コントローラは、
前記プールの使用量が閾値以上となった場合には、前記ホストからの前記ライト要求の受付を制限し、
前記コントローラが、前記追書き空間に追記したデータが更新された場合に、所定の条件を満たすか否かを判定する第１のステップと、
前記所定の条件を満たす場合に、前記コントローラが、更新後の当該データの圧縮データを、前記追書き空間に追記されている更新前の当該データの圧縮データに上書きする第２のステップと
を備えることを特徴とするストレージ装置の制御方法。
【請求項６】
前記追書き空間に格納された前記データが更新され、更新後の当該データの圧縮データが前記追書き空間に追記された場合には、前記追書き空間に格納されている更新前の当該データの圧縮データがガベージとして管理され、
前記第１のステップにおいて、前記コントローラは、
更新後の前記データの圧縮後のデータサイズが前記追書き空間に格納されている更新前の当該データの圧縮後のデータサイズ以下であり、かつ、前記プールにおける前記ガベージのデータ量が、当該プールに格納された各データの前記圧縮前の総データ量と、当該プールに格納された各前記データの前記圧縮後の総データ量との差分以上であるか、又は、更新後の前記データの圧縮後のデータサイズが前記追書き空間に格納されている更新前の当該データの圧縮後のデータサイズ以下であり、かつ、当該プールの使用量が閾値以上の場合に、前記条件を満たすと判定する
ことを特徴とする請求項５に記載のストレージ装置の制御方法。
【請求項７】
前記コントローラは、
前記仮想ボリュームの同一領域に対する前記ホストからの初回のデータライト時には当該データライトと同期してデータを前記記憶デバイスに書き込み、２回目以降のデータライト時には当該データライトとは非同期にデータを前記記憶デバイスに書き込む
ことを特徴とする請求項６に記載のストレージ装置の制御方法。
【請求項８】
一部の前記記憶デバイスは、格納されたデータを圧縮して記憶保持する圧縮機能が搭載され、
当該記憶デバイスに格納される前記データは、前記仮想ボリュームから圧縮されて前記追書き空間に追記されることなく当該記憶デバイスに与えられる
ことを特徴とする請求項７に記載のストレージ装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージ装置及びその制御方法に関し、例えば、データの圧縮・重複排除機能が搭載されたストレージ装置に適用して好適なものである。
【背景技術】
【０００２】
従来、ストレージ装置は、低コストで大量のデータを保存できることが要求されている。こうした要求を満たすために、データを可逆圧縮（以下、これを単に圧縮と呼ぶ）して記録する技術が知られている。圧縮によりデータサイズを縮小してから記憶デバイスに記録することにより、データを圧縮せずに記憶デバイスに記録するよりも多くのデータをストレージ装置に格納できる。その結果、記憶媒体のビットコストや、ストレージ装置の消費電力コスト等などのデータの保持コストを削減できる。
【０００３】
データの圧縮後のデータサイズはそのデータの内容によって異なり、圧縮前のデータのデータサイズが同じであったとしても、圧縮後のデータのデータサイズが同じになるとは限らない。このためボリュームに圧縮されて書き込まれたデータが更新された場合、その更新後のデータを更新前のデータに上書きできないときがある。
【０００４】
そこで、圧縮してボリュームに書き込まれたデータが更新された場合、更新後のデータを圧縮したものを、更新前のデータとは別個にボリュームに書き込むことが特許文献１に開示されている。
【０００５】
なお、更新後のデータが更新前のデータとは別個にボリューム書き込まれた場合、更新前のデータがボリューム内に残ることになるが、このデータは不要である。このため圧縮機能が搭載されたストレージ装置では、かかる不要となったデータ（以下、これをガベージと呼ぶ）を破棄するガベージコレクションと呼ばれる処理が定期的に実行される。
【０００６】
一方、ストレージ装置において、装置内の記憶領域に格納すべきデータ量を削減するもう一つの技術として、重複排除技術がある。重複排除技術は、ストレージ装置内に同一内容のデータが複数存在することをストレージ装置が検出した場合に、そのうちの１つだけをストレージ装置内の記憶デバイスに残し、残りのデータを記憶デバイスに格納しないようにする技術である。
【０００７】
重複排除技術は、圧縮技術と併用可能である。例えば、特許文献２には、上位装置から転送されてきたデータの中で重複しているデータについては重複排除処理を行い、重複排除の行われなかったデータを圧縮するストレージ装置が開示されている。
【０００８】
データの圧縮・重複排除を行うタイミングとしては、上位装置からのＩ／Ｏ（Input/Output）と同期してデータの圧縮・重複排除処理を実行する制御方式（以下、これをインライン（Inline）方式と呼ぶ）と、上位装置からのＩ／Ｏとは非同期にデータの圧縮・重複排除処理を実行する制御方式（以下、これをポストプロセス（Postprocess）方式）とが存在する。
【０００９】
インライン方式は、上位装置にＩ／Ｏのレスポンスを送信する前に圧縮・重複排除処理を実行するため、システム性能（レスポンス性能及びスループット性能）が低下するものの、圧縮・重複排除によるデータの削減結果が直ぐに得られるため、ストレージ装置に用意すべき記憶容量が圧縮・重複排除処理後のデータ量だけでよいというメリットがある。
【００１０】
これに対して、ポストプロセス方式は、Ｉ／Ｏのレスポンスを送信した後に圧縮・重複排除処理を実行するため、システム性能が向上するというメリットがあるものの、圧縮・重複排除後のデータを保存するための記憶領域以外に圧縮・重複排除処理が施されていないデータを一時的に保存しておくための記憶領域が必要となるため、その分、より多くの記憶領域が必要となるというデメリットもある。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】国際公開第２０１７／１４１３１５号
【特許文献２】特許第５２１６９１号明細書
【発明の概要】
【発明が解決しようとする課題】
【００１２】
ところで、圧縮機能が搭載されたストレージ装置において、定期的にガベージコレクションを実行したとしても、データ更新が急増した場合や、ガベージコレクション処理の実行周期に対してデータ更新の頻度が多い場合には、ガベージコレクション処理によるガベージの破棄量よりもデータ更新に起因して発生するガベージの発生量のほうが多くなり、ガベージの増加によってプールが枯渇するおそれがある。
【００１３】
このような事態の発生を防止する方法として、プールが枯渇しそうになった場合に、ホストからのＩ／Ｏに対して受付を制限する方法が考えられるものの、このようなＩ／Ｏの受付制限を行った場合、ホストから見たストレージ装置の応答性能が低下するという問題がある。
【００１４】
本発明は以上の点を考慮してなされたもので、ガベージの発生に起因する記憶領域の枯渇を防止しながら、ホストから見た応答性能の低下をも防止し得るストレージ装置及びその制御方法を提案しようとするものである。
【課題を解決するための手段】
【００１５】
かかる課題を解決するため本発明においては、ホストに対して仮想的な記憶空間である仮想ボリュームを提供するストレージ装置において、プールを構成する１又は複数の記憶デバイスと、仮想的な論理空間である追書き空間を管理し、前記ホストにより前記仮想ボリュームに書き込まれた前記データのうちの圧縮対象のデータを圧縮して前記追書き空間に追記し、前記追書き空間に追記した圧縮後の前記データを前記記憶デバイスに書き込むコントローラとを設け、前記コントローラが、前記プールの使用量が閾値以上となった場合には、前記ホストからの前記ライト要求の受付を制限し、前記追書き空間に追記したデータが更新された場合に、所定の条件を満たす場合には、更新後の当該データの圧縮データを、前記追書き空間に追記されている更新前の当該データの圧縮データに上書きするようにした。
【００１６】
また本発明においては、ホストに対して仮想的な記憶空間である仮想ボリュームを提供するストレージ装置の制御方法において、前記ストレージ装置は、プールを構成する１又は複数の記憶デバイスと、仮想的な論理空間である追書き空間を管理し、前記ホストにより前記仮想ボリュームに書き込まれた前記データのうちの圧縮対象のデータを圧縮して前記追書き空間に追記し、前記追書き空間に追記した圧縮後の前記データを前記記憶デバイスに書き込むコントローラとを有し、前記コントローラは、前記プールの使用量が閾値以上となった場合には、前記ホストからの前記ライト要求の受付を制限し、前記コントローラが、前記追書き空間に追記したデータが更新された場合に、所定の条件を満たすか否かを判定する第１のステップと、前記所定の条件を満たす場合に、前記コントローラが、更新後の当該データの圧縮データを、前記追書き空間に追記されている更新前の当該データの圧縮データに上書きする第２のステップとを設けるようにした。
【００１７】
本ストレージ装置及びその制御方法によれば、データの更新に起因するガベージの発生を抑え、ガベージの増加に起因するプールの枯渇を抑制することができる。またホストからのライト要求が受付制限される事態の発生を有効に抑制することができる。
【発明の効果】
【００１８】
本発明によれば、ガベージの発生に起因する記憶領域の枯渇を防止しながら、ホストから見た応答性能の低下をも防止し得るストレージ装置及びその制御方法を実現できる。
【図面の簡単な説明】
【００１９】
【図１】本実施形態に係るストレージ装置を含む、計算機システムの構成例を示すブロック図である。
【図２】仮想ボリュームとページの関係を示す概念図である。
【図３】管理情報の一覧を示すブロック図である。
【図４】ページ管理テーブルの構成例を示す図表である。
【図５】プール管理テーブルの構成例を示す図表である。
【図６】仮想ボリューム管理テーブルの構成例を示す図表である。
【図７】追書き空間マッピングテーブルの構成例を示す図表である。
【図８】ＬＰ変換テーブルの構成例を示す図表である。
【図９】ＦＰＭＱ及びＦＰＴＤの構成例を示す図表である。
【図１０】ガベージ管理テーブルの構成例を示す図表である。
【図１１】追書き上書き条件管理テーブルの構成例を示す図表である。
【図１２】ストレージ装置に実装されたプログラム等の説明に供するブロック図である。
【図１３】ライト処理の処理手順を示すフローチャートである。
【図１４】圧縮・重複排除処理の処理手順を示すフローチャートである。
【図１５Ａ】重複排除処理の処理手順を示すフローチャートである。
【図１５Ｂ】重複排除処理の処理手順を示すフローチャートである。
【図１６】ＰＡ決定及び書込み処理の処理手順を示すフローチャートである。
【図１７】追書き上書き要否判定処理の処理手順を示すフローチャートである。
【図１８】デステージ処理の処理手順を示すフローチャートである。
【図１９】ガベージコレクション処理の処理手順を示すフローチャートである。
【発明を実施するための形態】
【００２０】
以下図面について、本発明の一実施形態を詳述する。
【００２１】
なお、以下の実施形態において、ストレージ装置内で実行される処理について、「プログラム」を主語として説明を行う場合がある。実際には、ストレージ装置が有するプロセッサ（ＣＰＵ：Central Processing Unit）がプログラムを実行することによって、プログラムに記述された処理が行われるため、処理の主体はプロセッサ（ＣＰＵ）であるが、説明が冗長になることを防ぐため、プログラムを主語にして処理の内容を説明することがある。また、プログラムの一部又は全部が専用のハードウェアによって実現されてもよい。
【００２２】
また、以下で説明する各種プログラムは、プログラム配布サーバや計算機が読み取り可能な記憶メディアによって提供され、プログラムを実行する各装置にインストールされてもよい。計算機が読み取り可能な記憶メディアとは、非一時的なコンピュータ可読媒体で、例えばＩＣ（Integrated Circuit）カード、ＳＤ（Secure Digital）カード、ＤＶＤ（Digital Versatile Disc）等の不揮発性記憶媒体である。
【００２３】
実施形態の説明に入る前に、本明細書で用いられる各種用語について説明する。
【００２４】
本明細書において、「圧縮」とはＬＺＷ（Lempel-Ziv-Welch）アルゴリズム等の可逆圧縮アルゴリズムを用いて、データの意味を保ったままデータサイズを縮小する処理のことを意味する。本実施形態に係るストレージ装置では、ホストにより書き込まれたデータの圧縮を行うことがある。ストレージ装置で圧縮処理が行われたことによりサイズの縮小されたデータのことを、「圧縮データ」と呼び、ストレージ装置で圧縮処理が施されていないデータの事を「非圧縮データ」と呼ぶ。また可逆圧縮アルゴリズムを用いて、圧縮データを元のデータサイズに戻す処理のことを、「伸長」と呼ぶ。
【００２５】
「ボリューム」とは、ストレージ装置や記憶デバイス等のターゲットデバイスが、ホスト計算機等のイニシエータデバイスに提供する記憶空間のことを意味する。イニシエータデバイスが記憶空間上のある位置（アドレス）に対するデータの書き込み要求を発行すると、そのアドレスに割り当てられている記憶領域にデータが格納される。本実施形態に係るストレージ装置は、ボリュームとして、いわゆるThin Provisioning技術により形成される仮想ボリュームをホストに提供する。仮想ボリュームは、その初期状態（仮想ボリュームが定義された直後）では、仮想ボリューム上の各アドレスに記憶領域が割り当てられていない。ストレージ装置は、イニシエータデバイス（ホスト）から記憶空間上のアドレスに対するデータ書き込み要求を受領した時点で、そのアドレスに割り当てる記憶領域を動的に決定する。
【００２６】
「ブロック」とは、ボリューム上の領域を意味する。以下で説明する実施形態では、ブロックは、イニシエータデバイスがボリュームにアクセスする時の最小アクセス単位と等しいサイズの領域で、固定長である。ブロックのサイズは一例として512バイトである。イニシエータデバイスがボリューム上の領域にアクセスする際には、各ブロックにアサインされているアドレスを指定することでアクセスする。このアドレスは、論理ブロックアドレス（以下、これをＬＢＡ（Logical Block Address）と呼ぶ）と呼ばれる。ボリュームの先頭ブロックのＬＢＡが０で、それ以降のブロックには順に１，２，……の連続番号が付される。また、以下の実施形態では、ボリューム上の領域を特定するアドレスとして、ＬＢＡ以外のアドレスを用いることがある。これについては、実施形態中で説明する。
【００２７】
「重複排除処理」とは、ストレージ装置内に同一内容のデータが複数存在する場合、そのうちの１つだけをストレージ装置内に残し、それ以外のデータをストレージ装置から削除する処理を指す。ストレージ装置内に同一内容のデータが存在するか否かを判定することを「重複判定」と呼び、その処理のことを「重複判定処理」と呼ぶ。なお、特に断りのない限り、重複排除処理は重複判定処理を含む。
【００２８】
以下で説明する実施形態に係るストレージ装置では、チャンクと呼ばれる所定サイズのデータ毎に重複判定を行う。以下の実施形態では、チャンクのサイズが８ＫＢの例について説明するが、チャンクのサイズは８ＫＢ以外のサイズであってもよい。同一内容のデータ（又はチャンク）のことを「重複データ（又は重複チャンク）」と呼ぶ。
【００２９】
重複判定の際、２つのデータをビット単位あるいはバイト単位で比較すると、判定処理に長時間を要することになる。そのため一般的に重複判定を行う装置は、比較対象のデータについて、例えばハッシュ関数を利用して算出するハッシュ値などの、そのデータに基づいて算出される小サイズ（例えば８バイト程度）の特徴量でなるチェックコードを生成し、生成したチェックコードを用いて重複判定を行う。以下の実施形態では、データから生成されるチェックコードのことを、「FingerPrint Key」と呼ぶ。FingerPrint Keyは、ＦＰＫと略記されることもある。
【００３０】
以下で説明する実施形態では、データＡから算出されたＦＰＫの値がＨであった場合、値ＨはデータＡのＦＰＫと呼ばれる。逆にデータＡのことを、「ＦＰＫ  Ｈを持つデータ」と呼ぶことがある。
【００３１】
「重複排除の範囲」とは、重複データの有無を判定する際のデータの探索範囲のことを意味する。例えば重複排除の範囲が「ストレージ装置」の場合、ストレージ装置はデータＡと同一のデータが存在するか判定する際に、データＡとストレージ装置内の全データとを比較する。一方、重複排除の範囲がストレージ装置内の一部の記憶デバイス（ここではこれを「記憶グループ」と呼ぶ）に限定されている場合、ストレージ装置は重複データの有無を判定する際に、対応する記憶グループ内のデータのみの中から重複データの有無を検索する。
【００３２】
記憶領域やデータの「更新」とは、記憶領域に格納されているデータの内容を新しい内容に書き換える（上書きする）ことを意味する。以下においては、ある記憶領域やあるデータが更新される前に、その記憶領域に格納されていたデータ又は更新前のそのデータを「更新前データ」と呼び、その記憶領域に新たに書き込まれるデータ又は更新後のデータのことを「更新データ」又は「更新後データ」と呼ぶものとする。
【００３３】
「追書き（log-structured write）」又は「追記（log-structured）」とは、データを記憶領域の未使用領域に対してシーケンシャルに書き込む動作のことをいう。以下の実施形態におけるストレージ装置では、追書き用の記憶領域が設けられる。ストレージ装置が追書き処理を行う場合、追書き用の記憶領域の先頭から順にデータを書き込んでいく。ストレージ装置は、直前に行われた追書き処理でデータが書き込まれた終端アドレスを記憶しており、追書き処理を行う際には、この終端アドレスの次のアドレスから、データを書き込む。
【００３４】
（１）システム構成
次に、本実施の形態のストレージ装置について説明する。図１は、本実施形態に係るストレージ装置１を含む計算機システムの構成例を示す。ストレージ装置１は、ストレージコントローラ１０と、ストレージコントローラ１０に接続された複数の記憶デバイス２０とを備える。
【００３５】
記憶デバイス２０は、ストレージ装置１がホスト２などの上位装置からのライトデータを記憶するために用いられる。記憶デバイス２０としては、例えば、磁気ディスクを記憶媒体として用いるＨＤＤ（Hard Disk Drive）や、フラッシュメモリ等の不揮発性半導体メモリを記憶媒体として採用したＳＳＤ（Solid State Drive）が用いられる。
【００３６】
本実施形態のストレージ装置１には、記憶デバイス２０として、データを圧縮して記憶し、記憶したデータを伸長して出力する（つまりデータの圧縮／伸長を記憶デバイス２０内で行う）圧縮機能を有する記憶デバイス（圧縮機能付き記憶デバイス）２０と、かかる圧縮機能を有さない記憶デバイス（圧縮機能なし記憶デバイス）２０との双方が搭載されているものとする。
【００３７】
記憶デバイス２０は、一例としてＳＡＳ（Serial Attached SCSI）規格に従う伝送線（ＳＡＳリンク）や、ＰＣＩ（Peripheral Component Interconnect）規格に従う伝送線（ＰＣＩリンク）などによって、ストレージコントローラ１０と接続される。
【００３８】
ストレージコントローラ１０には、１又は複数のホスト２が接続される。またストレージコントローラ１０には、管理ホスト５も接続される。ストレージコントローラ１０及びホスト２は、一例としてファイバチャネルを用いて形成されるＳＡＮ（Storage Area Network）３を介して接続される。ストレージコントローラ１０及び管理ホスト５間は、一例としてイーサネット（登録商標）を用いて形成されるＬＡＮ（Local Area Network）６を介して接続される。
【００３９】
ストレージコントローラ１０は、少なくともデバイスインタフェース（以下、これをデバイスＩ／Ｆと呼ぶ）１１、ホストインタフェース（以下、これをホストＩ／Ｆと呼ぶ）１２、ＣＰＵ１３、ローカルメモリ１４、キャッシュメモリ１５及び管理用インタフェース（以下、これを管理用Ｉ／Ｆと呼ぶ）１６を備える。またデバイスＩ／Ｆ１１、ホストＩ／Ｆ１２、ＣＰＵ１３、キャッシュメモリ１５及び管理用Ｉ／Ｆ１６は、内部スイッチ（以下、これを内部ＳＷと呼ぶ）１７を介して相互接続される。図１ではこれらの構成要素がそれぞれ１つだけ示されているが、高性能化及び高可用性の確保のため、これらの構成要素のそれぞれがストレージコントローラ１０内に複数搭載されていてもよい。また内部ＳＷ１７ではなく、共通バスを介して各構成要素が相互接続された構成にしてもよい。
【００４０】
デバイスＩ／Ｆ１１は、少なくともインタフェースコントローラと転送回路を備える。インタフェースコントローラは、記憶デバイス２０で用いられているプロトコル（一例ではＳＡＳ）をストレージコントローラ１０内部で用いられている通信プロトコル（例えば、ＰＣＩ−Ｅｘｐｒｅｓｓ）に変換するためのコンポーネントである。転送回路は、ストレージコントローラ１０が、記憶デバイス２０に対してデータの転送（リード、ライト）を行う際に用いられる。
【００４１】
ホストＩ／Ｆ１２は、デバイスＩ／Ｆ１１と同様に、少なくともインタフェースコントローラ及び転送回路を備える。ホストＩ／Ｆ１２が備えるインタフェースコントローラは、ホスト２とストレージコントローラ１０との間のデータ転送経路で用いられている通信プロトコル（例えばファイバチャネル）と、ストレージコントローラ１０内部で用いられている通信プロトコルとの間のプロトコル変換を行うためのものである。
【００４２】
ＣＰＵ１３は、ストレージ装置１の各種制御を行うプロセッサである。またローカルメモリ１４には、ＣＰＵ１３が実行するプログラムが格納される。ＣＰＵ１３は、データの圧縮処理を行う際に、ローカルメモリ１４上の記憶領域の一部を、一種の作業用領域として使用する。ローカルメモリ１４としては、ＤＲＡＭ（Dynamic Random Access Memory）、ＳＲＡＭ（Static Random Access Memory）等の揮発性記憶媒体を適用できるが、別の実施形態として、不揮発性メモリを適用するようにしてもよい。
【００４３】
キャッシュメモリ１５は、記憶デバイス２０に入出力するデータを一時的に保持するために用いられる。またキャッシュメモリ１５は、ＣＰＵ１３が使用する、ストレージ装置１の各種管理情報を記憶するためにも用いられる。キャッシュメモリ１５としては、ＤＲＡＭ又はＳＲＡＭ等の揮発性記憶媒体を適用できるが、別の実施形態として、不揮発性メモリを用いてキャッシュメモリ１５を構成してもよい。また、キャッシュメモリ１５として揮発性記憶媒体が適用される場合、ストレージ装置１にバッテリ等の補助電源を搭載し、停電時にキャッシュメモリ１５の記憶内容を維持できるように構成されていてもよい。
【００４４】
管理用Ｉ／Ｆ１６は、ストレージコントローラ１０が管理ホスト５と通信を行う際のプロトコル制御を行うハードウェアであり、通信ケーブル等の通信路６を介して管理ホスト５と接続される。
【００４５】
本実施形態に係るストレージ装置１において、ＣＰＵ１３は、ローカルメモリ１４とキャッシュメモリ１５の何れにもアクセスすることができる。ただしＣＰＵ１３がキャッシュメモリ１５にアクセスする際、内部スイッチ１７を経由してアクセスすることになる。そのため、ＣＰＵ１３がキャッシュメモリ１５にアクセスした時の応答時間は、ＣＰＵ１３がローカルメモリ１４にアクセスした時の応答時間よりも長くなる。
【００４６】
管理ホスト５は、ユーザ（管理者）がストレージ装置１の管理操作を行うための計算機である。管理ホスト５は、キーボードやディスプレイ等の入出力デバイス（図示せず）を備えたノート型のパーソナルコンピュータ装置などから構成される。ユーザ（管理者）は入出力デバイスを用いてストレージ装置１に対する設定指示を行うことができる。また管理ホスト５は、ストレージ装置１の状態等の情報をディスプレイ等の出力デバイスに表示することもできる。
【００４７】
本実施形態に係るストレージ装置１は、記憶デバイス２０に格納されるデータを圧縮／伸長することができる。データの圧縮／伸長は、ＣＰＵ１３がデータ圧縮／伸長を行うためのプログラムコードを実行することにより行われるか又は圧縮機能付きの記憶デバイス２０の内部で行われる。ただし別の実施形態として、ストレージコントローラ１０にデータ圧縮／伸長を行う専用のハードウェアを設け、ストレージコントローラ１０がこのハードウェアを用いてデータ圧縮／伸長を行うように構成されていてもよい。
【００４８】
（２）記憶領域の管理
続いて、本実施形態に係るストレージ装置１が管理する記憶領域について説明する。本実施形態に係るストレージ装置１が有する１以上の記憶デバイス２０は、所定サイズの記憶空間をストレージコントローラ１０に提供する。ただし、ストレージコントローラ１０は、記憶デバイス２０の提供する記憶空間を直接ホスト２には提供しない。ストレージコントローラ１０はホスト２に、記憶デバイス２０の提供する記憶空間とは異なる、１以上の仮想的な記憶空間を提供する。この仮想的な記憶空間を「仮想ボリューム」と呼ぶ。また、仮想ボリューム（ホスト２に提供される記憶空間）のことを、「上書き空間」と呼ぶこともある。
【００４９】
仮想ボリュームは、公知のThin Provisioning技術を用いて形成されるボリュームである。ストレージ装置１は、ホスト２から仮想ボリューム上の領域に対するライト要求を受け付けた時点で、その領域に記憶デバイス２０の記憶領域を割り当てる（マップする）。
【００５０】
本実施形態では、ストレージ装置１が有する複数の記憶デバイス２０のうち、仮想ボリュームに割り当てることができる記憶デバイス２０を「プール」という管理単位に所属させる。ストレージ装置１は、プールに所属する記憶デバイス２０の記憶空間を、所定サイズ（一例として42ＭＢ）の部分領域に分割して管理する。本実施形態では、この部分領域のことを「物理ページ」又は「ページ」と呼ぶ。なお、ストレージ装置１内に複数のプールが設けられてもよい。各プールには、それぞれプール番号（プール＃）と呼ばれる、ストレージ装置１内で一意な識別番号が付与される。またプール番号がｋのプールは、「プール＃ｋ」と表記される。
【００５１】
ストレージ装置１が仮想ボリュームに記憶デバイス２０の記憶領域を割り当てる場合、物理ページ単位で割り当てる。そのためストレージ装置１は、仮想ボリュームも物理ページと同サイズの領域に分割して管理する。以下においては、仮想ボリューム上の物理ページと同サイズの領域を「仮想ページ」又は「上書きページ」と呼ぶものとする。なお、本実施形態では仮想ページのサイズが42ＭＢの場合の例を説明するが、仮想ページのサイズはこれ以外のサイズでもよい。
【００５２】
ホスト２が仮想ボリュームにアクセスする場合、ホスト２はストレージ装置１にアクセス要求（リード要求、ライト要求等）を発行する。リード要求やライト要求には、アクセス対象の仮想ボリュームを特定するための識別子（ＬＵＮ（Logical Unit Number）等）と、仮想ボリューム上の領域を特定するための情報とが含まれる。仮想ボリューム上の領域を特定する情報には、ＬＢＡと領域の長さの情報が含まれる。
【００５３】
ストレージ装置１は、ホスト２からライト要求を受信すると、ライト要求に含まれる、仮想ボリューム上の領域を特定する情報（ＬＢＡ及び領域の長さ）から、アクセス対象の仮想ページを特定する。アクセス対象の仮想ページに未だ物理ページが割り当てられていない場合、ストレージ装置１はその仮想ボリュームが属するプール内に存在する物理ページのうち未使用の物理ページ（まだ仮想ページに割り当てられていない物理ページ）を選択し、選択した物理ページをデータライト先の仮想ページに割り当てる（マップする）。ホスト２からのライトデータは、このデータライト先の仮想ページにマップされた物理ページに格納される。
【００５４】
またストレージ装置１は、仮想ページと、仮想ページに割り当てられた物理ページとの対応関係（マッピング）をマッピングテーブル（図６について後述する仮想ボリューム管理テーブル４２など）に格納して管理する。そしてストレージ装置１は、仮想ページに対するリード要求を受け付けた場合、マッピングテーブルを参照することで、仮想ページに割り当てられた物理ページを特定し、特定した物理ページからデータを読み出す。
【００５５】
図２は、仮想ボリュームと、仮想ボリュームに割り当てられる記憶領域（物理ページ）との関係を表す。図２において、長方形状のオブジェクト３０は仮想ボリューム（上書き空間）を表し、円柱状のオブジェクト３１はプールを表す。
【００５６】
ストレージ装置１は、仮想ボリューム（上書き空間）に加えて、これとは異なる記憶空間を有する。この記憶空間は「追書き空間」と呼ばれる。図２に示されている長方形状のオブジェクト３２が追書き空間を表す。追書き空間は、ホスト２がアクセスできる記憶空間ではなく、ストレージコントローラ１０だけが使用可能な記憶空間である。追書き空間は、ストレージコントローラ１０のＣＰＵ１３が圧縮データを記憶デバイス２０に追書きにより格納するために用いられる。
【００５７】
まず、上書き空間の仮想ページと物理ページとの関係について説明する。各仮想ページには、仮想ページ番号（ＶＰ＃と表記されることもある）と呼ばれる、一意な識別番号（識別番号には非負の整数値が用いられる）が付与される。図２では、仮想ページ番号がｎ（ｎは非負の整数値）の仮想ページを「ＶＰ＃ｎ」と表記している。同様に各物理ページには、物理ページ番号と呼ばれる、ストレージ装置１内で一意な識別番号が付される（この識別番号も非負の整数値である）。図２では、物理ページ番号がｎ（ｎは非負の整数値）の物理ページを「物理ページ＃ｎ」と表記している。図２の例では、「ＶＰ＃０」に「物理ページ＃０」がマップされた例が示されている。
【００５８】
ストレージ装置１は、仮想ページ内の領域（１又は複数のブロック）を対象とするホスト２からのライト要求（及びライトデータ）を受け付けた場合、仮想ページにマップされている物理ページ内のブロックにライトデータを格納する。そしてストレージ装置１は、このときの仮想ページ及び物理ページの対応関係（マッピング）を、図６について後述する仮想ボリューム管理テーブル４２に格納して管理する。
【００５９】
本実施形態に係るストレージ装置１は、原則として（後述する、圧縮データ格納のケースを除いて）、仮想ページの先頭からｎ番目のブロックへのデータライト要求を受領した場合、仮想ページにマップされている物理ページの先頭からｎ番目のブロックにデータを格納する。なお、説明が冗長になることを避けるため、以下においては、ストレージ装置１が仮想ページに割り当てられている物理ページにデータを格納することを、「仮想ページ（又は上書き空間）にデータを格納する」と表現する。
【００６０】
追書き空間も上書き空間と同じく、いわゆるThin Provisioning技術により形成される記憶空間である。ストレージコントローラ１０は、追書き空間上の領域に、動的に物理ページを割り当て、データを追書き空間に割り当てた物理ページに書き込む。上書き空間と同じく、ストレージ装置１は、追書き空間を物理ページと同サイズの領域に分割して管理する。この領域は「追書きページ」と呼ばれる。追書きページにも追書きページ番号と呼ばれる一意な識別番号が付与される。
【００６１】
また、ストレージ装置１は、追書きページと物理ページとの対応関係（マッピング）を、後述する追書き空間マッピングテーブル４３（図７）に格納して管理する。なお、以下においては、説明が冗長になることを避けるため、ストレージ装置１が追書きページに割り当てられている物理ページにデータを書き込む処理を、「追書きページ（又は追書き空間）にデータを書き込む」と表現する。
【００６２】
先にも述べたが、追書き空間に書き込まれるデータは、圧縮データである。また追書き空間は仮想ボリュームごとに設けられる。従って、仮想ボリュームがｎ個ある場合には追書き空間もｎ個存在する。追書き空間に割り当てられる物理ページは、仮想ページに割り当てられる物理ページと同じく、プールから未使用の物理ページが選択される。プール番号が「ｋ」のプール内に存在する物理ページが割り当てられる仮想ボリュームのチャンクが追書き空間に移動されるとき、その追書き空間に割り当てられる物理ページは、プール番号が「ｋ」のプール内に存在する物理ページである。
【００６３】
ストレージ装置１は、ホスト２から仮想ページに書き込まれたデータ（非圧縮データ）について、必要に応じて圧縮処理を行う。圧縮処理により生成された圧縮データは、非圧縮データの格納された物理ページとは異なる場所、具体的には追書き空間に移動される。また、このとき重複データの有無の判定なども行われる。
【００６４】
本実施形態に係るストレージ装置１は、仮想ページ内の領域を、仮想ページの先頭から順に８ＫＢの部分領域に区分し、この部分領域ごとにデータ圧縮を行う。本実施形態では、この８ＫＢの部分領域（あるいはこの部分領域に格納されているデータ）のことを「チャンク」と呼ぶ。なお、チャンクの大きさには、８ＫＢ以外の大きさが採用されてもよい。また、チャンクを圧縮することで生成されたデータ、又は圧縮デバイスに書き込みする前提を満たし、圧縮処理をスキップしたデータのことを「圧縮チャンク」と呼ぶ。圧縮チャンクの大きさはデータの内容に依存して変動するが、最小で512バイト、最大で８ＫＢである。また本実施形態に係るストレージ装置１は、512バイトの整数倍のサイズの圧縮チャンクを生成する。
【００６５】
ストレージコントローラ１０（のＣＰＵ１３）が圧縮チャンクを生成すると、ストレージコントローラ１０はその圧縮チャンクを追書き空間に追記する。ある仮想ページのチャンクがすべて圧縮されて、圧縮チャンクが全て追書き空間に書き込まれると、仮想ページに割り当てられていた物理ページが破棄される。具体的には、その仮想ページに割り当てられていた物理ページは、未使用状態（仮想ページに割り当てられていない状態）に変更される。これにより、上書き空間に対して書き込まれたデータが、追書き空間に移動されたことになる。
【００６６】
なお、追書き空間に割り当てられた物理ページには、複数の仮想ページのチャンク（圧縮チャンク）が格納されることもある。圧縮によりチャンクのサイズは小さくなり、複数の仮想ページのデータが１物理ページに収容可能になることもあるからである。ストレージ装置１は、上書き空間上のチャンクと追書き空間上の圧縮チャンクの対応関係（マッピング）を、図８について後述するＬＰ変換テーブル４４に格納して管理する。
【００６７】
ホスト２から書き込まれたデータが追書き空間に移動された仮想ページに対して、ホスト２から更新データの書き込み要求（つまり更新要求）があった場合、更新データは圧縮され、原則として追記により追書き空間に格納される。ただし別の実施形態として、ストレージ装置１は再び上書き空間の仮想ページに物理ページを割り当て、追書き空間に移動されたデータを伸長して、仮想ページに割り当てられた物理ページに伸長されたデータを書き戻し、そしてこの物理ページ上のデータを更新（上書き）するようにしてもよい。
【００６８】
ストレージ装置１が、上書き空間上のチャンクを特定するために使用するアドレスをＬＡと呼ぶ。ＬＡはチャンクごとに付されるアドレスで、次式
【数１】
2019128906.tif 000003
の関係にある。上書き空間上の先頭に位置するチャンクのＬＡは０で、後続のチャンクのＬＡは順に、１，２，……の連続番号になる。
【００６９】
一方、追書き空間上の圧縮チャンクは可変長で、最小512バイトのサイズであるので、追書き空間上の512バイトの領域（ブロック）ごとにアドレスが付される。このアドレスをＰＡと呼ぶ。追書き空間上の先頭に位置する512バイト領域のＰＡが０で、後続の領域のＰＡには、順に１，２，……の連続番号が用いられる。
【００７０】
（３）管理情報
続いて、上で述べたプール（図２のオブジェクト３１）、仮想ボリューム（図２のオブジェクト３０）及び追書き空間（図２のオブジェクト３２）の管理に用いられる管理情報の内容について説明する。なお、本明細書や図面で、数値の先頭に文字列“0x”が付されているものがあるが、これはその数値が16進数で表記されていることを意味する。
【００７１】
図３に、ストレージ装置１が有する管理情報を示す。ストレージ装置１は、ページ管理テーブル４０、プール管理テーブル４１、仮想ボリューム管理テーブル４２、追書き空間マッピングテーブル４３、論理物理変換テーブル（ＬＰ変換テーブル）４４、ＦＰＭＱ（FingerPrint Match Queue）４５、ＦＰＴＤ（FingerPrint Table Directory）４６、ガベージ管理テーブル４７及び追書き上書き条件管理テーブル４８をキャッシュメモリ１５に保持している。
【００７２】
図４は、ページ管理テーブル４０の構成例を示す。ページ管理テーブル４０は、プールに属する物理ページを管理するために利用されるテーブルであり、プールごとに設けられる。従って、ストレージ装置１内にｎ個のプールが設けられている場合には、ストレージ装置１はｎ個のページ管理テーブル４０を有する。
【００７３】
ページ管理テーブル４０の各行（レコード）には、対応するプール内の各物理ページの情報が格納される。各レコードは、物理ページ番号（ページ＃）欄４０Ａ、ＤＥＶ番号（ＤＥＶ＃）欄４０Ｂ、アドレス（Addr）欄４０Ｃ、使用状況（use）欄４０Ｄ及び圧縮機能有無フラグ欄４０Ｅをそれぞれ備える。
【００７４】
そして物理ページ番号欄４０Ａには、対応するプール内に存在するすべての物理ページの物理ページ番号がそれぞれ格納される。つまり物理ページ番号欄４０Ａに格納された物理ページ番号が「ｎ」のレコードは、対応するプール内の物理ページ番号が「ｎ」の物理ページに関する情報を管理するレコードである。
【００７５】
またＤＥＶ番号欄４０Ｂには、対応する物理ページが存在する記憶デバイス２０の識別番号（デバイス番号）が格納され、アドレス欄４０Ｃには、その記憶デバイス２０内のその物理ページが存在するアドレスが格納される。従って、図４の場合、物理ページ番号が「１」の物理ページは、デバイス番号が「０」の記憶デバイス２０の、アドレス「0x15000」から始まる42ＭＢの領域（１物理ページのサイズに等しい領域）に相当することが示されている。
【００７６】
使用状況欄４０Ｄには、対応する物理ページの使用状況を表す情報が格納される。対応する物理ページが仮想ボリューム又は追書き空間にマップされている場合、使用状況欄４０Ｄには「１」が格納される。逆に、対応する物理ページが仮想ボリューム又は追書き空間にマップされていない場合、使用状況欄４０Ｄには「０」が格納される。使用状況欄４０Ｄに「１」が格納されている物理ページは、使用中のページと呼ばれ、逆に使用状況欄４０Ｄに「０」が格納されている物理ページは、未使用のページと呼ばれる。
【００７７】
圧縮機能有無フラグ欄４０Ｅには、対応する物理ページが存在する記憶デバイス２０が圧縮機能を有するか否かを表す情報（圧縮機能有無フラグ）が格納される。その記憶デバイス２０が圧縮機能を備える場合、圧縮機能有無フラグは「１」に設定され、その記憶デバイス２０が圧縮機能を備えない場合、圧縮機能有無フラグは「０」に設定される。
【００７８】
なお、本実施形態では、ページ管理テーブル４０に、記憶デバイス２０（例えばＨＤＤ）の識別番号とアドレスが登録され、各物理ページが１つの記憶デバイス２０内の記憶領域に相当する例が説明されている。ただし、これ以外のプール（又は物理ページ）の構成方法が採用されてもよい。例えば、ストレージ装置１がＲＡＩＤ（Redundant Arrays of Independent （or Inexpensive） Disks）技術を用いて、複数の記憶デバイス２０から１つの論理的な記憶デバイス（以下、これを論理デバイスと呼ぶ）を形成する場合、論理デバイス上の所定サイズ（例えば42ＭＢ）の記憶領域をページとして扱ってよい。その場合、ページ管理テーブル４０のＤＥＶ番号欄４０Ｂ及びアドレス欄４０Ｃには、論理デバイスの識別番号と、論理デバイス内のアドレスとを格納する。
【００７９】
図５は、プール管理テーブル４１の構成例を示す。プール管理テーブル４１は、各プールに属する仮想ボリュームに関する情報などを格納するためのテーブルである。プールが複数存在する場合、ストレージ装置１は各仮想ボリュームを、いずれか１つのプールに所属させる。ストレージ装置１は、仮想ボリュームの仮想ページに物理ページを割り当てる際、仮想ボリュームが属しているプール内の未使用の物理ページを選択し、選択した物理ページを仮想ページに割り当てる。
【００８０】
プール管理テーブル４１の各レコードは、プール番号欄４１Ａ、仮想ボリューム番号欄４１Ｂ、最終書き込み位置欄４１Ｃ及びプールサイズ欄４１Ｄをそれぞれ有する。そしてプール番号欄４１Ａには、プール番号が格納される。また仮想ボリューム番号欄４１Ｂには、プールに属する仮想ボリュームの識別番号（仮想ボリューム番号）が格納される。プールに属する仮想ボリュームが複数存在する場合には、仮想ボリューム番号欄４１Ｂには複数の仮想ボリューム番号が格納される。
【００８１】
最終書き込み位置欄４１Ｃには、対応するプールに属する各仮想ボリューム（同じ行の仮想ボリューム番号欄４１Ｂに仮想ボリューム番号が格納された各仮想ボリューム）にそれぞれ対応させて、その仮想ボリュームと対応付けられた追書き空間内の最後に圧縮チャンクが書き込まれた追書きページの追書きページ番号が格納される。ストレージコントローラ１０が追書きページに圧縮チャンクを書き込む際、最終書き込み位置欄４１Ｃを参照することで、最後に書き込みが行われた追書きページを特定する。
【００８２】
さらにプールサイズ欄４１Ｄには、対応するプールのプールサイズ（容量）が格納される。図５の例の場合、「０」というプール番号が付与されたプールのプールサイズ（容量）は「0xFFF」であり、「１」というプール番号が付与されたプールのプールサイズ（容量）は「0x12AB」であることが示されている。
【００８３】
図６は、仮想ボリューム管理テーブル４２の構成例を示す。仮想ボリューム管理テーブル４２は仮想ボリューム毎に作成される。このため仮想ボリュームが複数存在する場合、仮想ボリューム管理テーブル４２も複数存在する。仮想ボリューム管理テーブル４２もキャッシュメモリ１５に格納されて管理される。
【００８４】
仮想ボリューム管理テーブル４２の各レコードには、対応する仮想ボリューム内の仮想ページについての情報が格納される。具体的には各レコードは、仮想ページ番号（仮想ページ＃）欄４２Ａ、最終更新時刻欄４２Ｂ、ページ種別欄４２Ｃ、物理ページ番号（物理ページ＃）欄４２Ｄ及びプール番号（プール＃）欄４２Ｅをそれぞれ備える。
【００８５】
そして仮想ページ番号欄４２Ａには、仮想ページの仮想ページ番号が格納される。また物理ページ番号欄４２Ｄには、対応する仮想ページに割り当てられた物理ページの物理ページ番号が格納される。プール番号欄４２Ｅには、対応する仮想ページに割り当てられた物理ページが存在するプールのプール番号が格納される。
【００８６】
最終更新時刻欄４２Ｂには、対応する仮想ページに対するライト要求を最後に受け付けた時刻が格納される。ストレージ装置１はある仮想ページに対してライト要求を受け付けるたびに、その仮想ページの最終更新時刻欄４２Ｂにライト要求を受け付けた時刻が格納される。
【００８７】
ページ種別欄４２Ｃには、「１」又は「０」が格納される。初期状態では、全仮想ページのページ種別欄４２Ｃの値が「１」に設定される。
【００８８】
ページ種別欄４２Ｃに「０」が格納されている場合、対応する仮想ページに対して書き込まれたデータは圧縮されて、追書き空間に移動されたことを表す。この場合には、物理ページ番号欄４２Ｄ及びプール番号欄４２Ｅには、無効値（「null」と呼ぶ。具体的には「−１」などの、ページ番号やプール番号に用いられない値である）が格納される。また移動されたデータ（圧縮チャンク）の格納場所は、後述するＬＰ変換テーブル４４（図８）等に記録される。
【００８９】
一方、ページ種別欄４２Ｃに「１」が格納されている場合、対応する仮想ページに書き込まれたデータはまだ追書き空間に移動されていないか、あるいはその仮想ページに対してまだホスト２からのライト要求が発生していないことを表す。ページ種別欄４２Ｃの値が「１」で、物理ページ番号欄４２Ｄ及びプール番号欄４２Ｅに有効な値（「null」でない値）が格納されている場合、その仮想ページに対して物理ページが割り当てられており、その物理ページにホスト２からのライトデータが格納されていることを示す。逆にページ種別欄４２Ｃに格納された値が「１」で、物理ページ番号欄４２Ｄ及びプール番号欄４２Ｅの双方に「null」が格納されている場合、その仮想ページに対してまだホスト２からの書き込み要求が発生しておらず、物理ページが割り当てられていないことを表す。
【００９０】
なお、仮想ボリュームが複数存在する場合、仮想ボリューム管理テーブル４２の各レコードには、上で説明した仮想ページ番号４２Ａ等の情報に加えて、仮想ボリュームを特定するための情報（例えば仮想ボリューム番号）が含まれてもよい。
【００９１】
図７は、追書き空間マッピングテーブル４３の構成例を示す。追書き空間マッピングテーブル４３には、追書き空間にマッピングされた物理ページを管理するための管理情報が格納される。追書き空間は仮想ボリュームごとに設けられるので、追書き空間マッピングテーブル４３も仮想ボリュームごとに存在する。
【００９２】
各レコードの追書きページ番号欄４３Ａには、追書きページ番号（追書きページ＃）が昇順に格納される。追書き空間マッピングテーブル４３の各レコードは、追書きページ番号欄４３Ａに格納された追書きページ番号で特定される追書きページに、物理ページ番号欄４３Ｂに格納された物理ページ番号と、プール番号欄４３Ｃに格納されたプール番号とで特定される物理ページが割り当てられていることを表している。追書きページに物理ページが割り当てられていない場合、その追書きページの物理ページ番号欄４３Ｂ及びプール番号欄４３Ｃには、それぞれ「null」が格納される。
【００９３】
ページ内最終書き込み位置欄４３Ｄには、追書きページ内のブロックのうち、最後に圧縮チャンクが書き込まれたブロックの相対アドレスが格納される。相対アドレスとは、具体的には、ページ内の先頭ブロックのアドレスを「０」と定めたときの、ブロックのアドレスである。図７の例では、追書きページ番号欄４３Ａに格納された追書きページ番号が「２」のレコードのページ内最終書き込み位置欄４３Ｄには「0x00005」が格納されているので、この追書きページ番号が「２」の追書きページに割り当てられている物理ページには、ページ先頭から５番目のブロックまで圧縮チャンクが書き込まれていることを表している。ストレージ装置１は、追書き空間に圧縮チャンクを追記する際に、このページ内最終書き込み位置欄４３Ｄに格納されているアドレスと、プール管理テーブル４１の最終書き込み位置欄４１Ｃに格納されているアドレスとを参照することで、圧縮チャンクを書き込むべき位置を特定する。
【００９４】
続いてＬＰ変換テーブル４４について説明する。ＬＰ変換テーブル４４は、上書き空間上のチャンクが圧縮されて追書き空間に移動された場合における各チャンクの移動先を管理するためのテーブルである。図８にＬＰ変換テーブル４４の構成例を示す。
【００９５】
ＬＰ変換テーブル４４の各レコードは、仮想ボリューム上のチャンクと、そのチャンクの圧縮チャンクの記録位置との対応関係（マッピング）についての情報をそれぞれ表す。具体的に、各レコードは、上書き空間におけるレコードのＬＡ欄４４Ａに格納されたＬＡで特定される８ＫＢの領域（チャンク）のデータが圧縮されて、対応する追書き空間におけるＰＡ欄４４Ｃに格納されたＰＡで特定されるアドレスから始まる、長さ（Length）欄４４Ｄに格納された長さの領域に格納されており、そのデータのＦＰＫの上位32ビットがＦＰＫ上位32ｂｉｔ欄４４Ｂに格納された値であることを表す。
【００９６】
先に述べたとおり、本実施形態に係るストレージ装置１は重複排除処理を行うので、原則として、同一内容の複数のチャンクが追書き空間に格納されないように制御される。再び図２を用いて重複排除処理の概略を説明する。
【００９７】
図２において、「１」という仮想ページ番号が付与された仮想ページに格納された「チャンクＡ」及び「チャンクＢ」という２つのチャンクのそれぞれが、「圧縮チャンクａ」、「圧縮チャンクｂ」として追書き空間上に格納されている状態にあるとき、ストレージ装置１が「２」という仮想ページ番号が付与された仮想ページに格納されたチャンクを追書き空間に移動する処理を開始した場合を想定する。もし「チャンクＤ」の内容が「チャンクＢ」と同一だった場合、「チャンクＤ」の圧縮チャンクは追書き空間に書き込まれない。代わりにストレージ装置１は、ＬＰ変換テーブル４４の「チャンクＢ」の情報を格納しているレコードのＰＡ欄４４Ｃに格納されたアドレスと同一の値を、ＬＰ変換テーブル４４の「チャンクＤ」の情報を格納しているレコードのＰＡ欄４４Ｃに格納する。
【００９８】
また、ストレージ装置１が重複排除処理を行うとき、チャンクごとに、そのチャンクのデータに応じた値のチェックコードを算出する。上述のように本実施形態では、このチェックコードをＦＰＫ（FingerPrint Key）と呼ぶ。本実施形態の場合、ＦＰＫは８バイトのサイズの情報である。ただしＦＰＫは８バイト以外のサイズであってもよい。
【００９９】
ストレージ装置１は、チャンクから生成されるＦＰＫとチャンクのＬＡとの対応関係を管理情報に記録する。この管理情報をＦＰＭＱ（FingerPrint Match Queue）と呼ぶ。図９にＦＰＭＱ４５の構成例を示す。ＦＰＭＱ４５は、ＦＰＫ欄４５Ａ及びＬＡ欄４５Ｂを備えるテーブルで、ＬＡ欄４５Ｂに格納されたＬＡから始まる８ＫＢの領域（チャンク）から生成されたＦＰＫが、同じレコードのＦＰＫ欄４５Ａに格納される。ＦＰＭＱ４５には、対応する仮想ボリューム内のすべてのＬＡのＦＰＫが登録される。ＦＰＭＱ４５の各レコードは、ＦＰＫ欄４５Ａに格納されたＦＰＫの昇順にソートされ、同じＦＰＫのＬＡ同士はＬＡの昇降順にソートされている。以下では、ＦＰＭＱ４５のレコード、つまりＦＰＫ欄４５Ａ及びＬＡ欄４５Ｂのセットのことを、「チャンクのメタデータ」（あるいは単に「メタデータ」）と呼ぶことがある。
【０１００】
ＦＰＭＱ４５は仮想ボリュームごとに設けられる。ストレージ装置１は、例えば仮想ボリューム番号が「ｎ」の仮想ボリューム（上書き空間）に格納されたチャンクを追書き空間に移動するとき（仮にこのチャンクを「チャンクＡ」と呼ぶ）、仮想ボリューム番号が「ｎ」用のＦＰＭＱ４５を参照することで、「チャンクＡ」と同一のチャンク（圧縮チャンク）が既に追書き空間に存在するか判定する。
【０１０１】
「チャンクＡ」のＦＰＫと同一のＦＰＫが、仮想ボリューム番号が「ｎ」用のＦＰＭＱ４５に存在しない場合、「チャンクＡ」と同一のチャンク（圧縮チャンク）はプール番号が「ｎ」用の追書き空間に存在しないと判定できる。本実施形態に係るストレージ装置１では、重複排除の範囲は仮想ボリュームである。そのため「チャンクＡ」と同一のチャンク（圧縮チャンク）が、仮想ボリューム番号が「ｎ」の仮想ボリュームには存在しないが、それ以外の仮想ボリュームに存在した場合、「チャンクＡ」（の圧縮チャンク）は仮想ボリューム番号が「ｎ」の仮想ボリュームに書き込まれる。
【０１０２】
また、ＦＰＭＱ４５内の情報の検索を効率的に行えるようにするために、ストレージ装置１はＦＰＭＱ４５内のいくつかのレコードが格納されているアドレス（キャッシュメモリ１５上アドレス）を記録した管理情報を有する。この管理情報は、FingerPrint Table Directoryと呼ばれる。以下ではこれを、「ＦＰＴＤ」と呼ぶ。
【０１０３】
図９にＦＰＴＤ４６の例を示す。ＦＰＴＤ４６もＦＰＭＱ４５と同様に、仮想ボリュームごとに設けられる。ＦＰＭＱ格納アドレス欄４６Ｂには、ＦＰＭＱ４５のレコードのうち、ＦＰＫ欄４５Ａに格納されているＦＰＫの上位32ｂｉｔが、ＦＰＫ先頭32ｂｉｔ欄４６Ａに格納されたＦＰＫ先頭32ｂｉｔと等しいレコードの中で、ＦＰＫ欄４５Ａに格納されたＦＰＫが  最も小さいレコードが格納されているアドレス（キャッシュメモリ１５上のアドレス）が格納される。
【０１０４】
例えばＦＰＭＱ４５内で、ＦＰＫ欄４５Ａに格納された上位32ｂｉｔが「0x00000001」であるレコードのうち、値が最小のレコードのＦＰＫ欄４５Ａに格納されたＦＰＫが「0x0000000100000001」だった場合を想定する。このときＦＰＫ欄４５Ａに格納されたＦＰＫが「0x0000000100000001」のレコードが格納されているアドレスが「ＡＤＲ２」だった場合には、ＦＰＴＤ４６には、ＦＰＫ先頭32ｂｉｔ欄４６Ａに格納されたＦＰＫ先頭32ｂｉｔが「0x00000001」、ＦＰＭＱ格納アドレス欄４６Ｂに格納されたＦＰＭＱ格納アドレスが「ＡＤＲ２」のレコードが記録される。
【０１０５】
後述する圧縮・重複排除プログラム５２（図１２）は、チャンクのＦＰＫを算出してから、そのＦＰＫと同じ値がＦＰＭＱ４５のＦＰＫ欄４５Ａに格納されているかを判定する。ＦＰＭＱ４５に格納されているレコード数が非常に多い場合、検索に時間がかかるため、ＦＰＴＤ４６が用いられる。
【０１０６】
例えば、「0x0000000100000001」の格納されているレコードを検索する場合、圧縮・重複排除プログラム５２は、ＦＰＴＤ４６を参照することで、ＦＰＫ先頭32ｂｉｔ欄４６Ａに格納された値が「0x00000001」のＦＰＭＱ格納アドレス欄４６Ｂに格納された値が「ＡＤＲ２」であることを認識する。続いて圧縮・重複排除プログラム５２は、ＦＰＭＱ４５内のレコードのうち、アドレスが「ＡＤＲ２」（これはキャッシュメモリ１５上のアドレスである）のレコードから順に、「0x0000000100000001」の格納されているレコードを探索する。なお、ＦＰＴＤ４６は、ＦＰＭＱ４５内の情報の検索速度を向上させるための情報であるから、ＦＰＴＤ４６は必須の情報ではない。
【０１０７】
図８のＦＰＫ上位32ｂｉｔ欄４４Ｂと、ＦＰＭＱ登録欄４４Ｅとについて説明する。ＬＰ変換テーブル４４のＦＰＫ上位32ｂｉｔ欄４４Ｂには、チャンクのＦＰＫの上位32ビットが格納される。ＦＰＭＱ登録欄４４Ｅには、チャンクのメタデータがＦＰＭＱ４５に登録されているかいないかを表す情報が格納される。ストレージ装置１がＬＡ欄４４Ａに格納されたＬＡで特定されるチャンクのメタデータをＦＰＭＱ４５に登録した場合、ＦＰＭＱ登録欄４４Ｅに「１」が格納され、そうでない場合にはＦＰＭＱ登録欄４４Ｅに「０」が格納される。また、チャンクから生成されたＦＰＫ（及びそのチャンクのＬＡ）をＦＰＭＱ４５に登録した後、ＦＰＭＱ４５からＦＰＫ及びそのチャンクのＬＡを削除することもある。その場合にもストレージ装置１はＦＰＭＱ登録欄４４Ｅに「０」が格納される。
【０１０８】
図１０は、ガベージ管理テーブル４７の構成例を示す。上書き空間のデータが圧縮されて追書き空間やプールに移動された後に、そのデータが更新されたときには、追書き空間やプール内に存在する更新前の圧縮データ（圧縮チャンク）はガベージとなる。ガベージ管理テーブル４７は、このようなストレージ装置１内に存在するガベージを管理するために利用されるテーブルである。このガベージ管理テーブル４７は、追書き空間毎（つまりプール毎）に生成される。
【０１０９】
ガベージ管理テーブル４７のレコードには、対応する追書き空間と対応付けられたプール内に存在するガベージを管理するための情報が格納される。具体的には、対応する追書き空間と対応付けられたプール内のＰＡ欄４７Ａに格納されたＰＡで特定されるアドレスから始まる、長さ（Length）欄４７Ｂに格納された長さの領域に格納されているデータがガベージであることを表す。例えば、図１０の例では、対応する追書き空間と対応付けられたプール内のＰＡが「0x0010」から始まる「512」バイトの領域に格納されているデータがガベージであることが示されている。
【０１１０】
また図１１は、追書き上書き条件管理テーブル４８の構成例を示す。後述のように、本実施形態のストレージ装置１には、既に圧縮チャンクが追書き空間に格納されているデータが更新された場合、更新後のデータの圧縮チャンクが一定条件を満たす場合には、その更新後のデータの圧縮チャンクを追書き空間に格納された更新前のそのデータの圧縮チャンクに上書きする圧縮チャンク上書き機能が搭載されている。追書き上書き条件管理テーブル４８は、このような本実施形態の圧縮チャンク上書き機能を実現するために必要な、プール毎のガベージ量等を管理するために利用されるテーブルである。
【０１１１】
追書き上書き条件管理テーブル４８の各レコードは、プール番号（プール＃）欄４８Ａ、総データ量欄４８Ｂ、圧縮・重複排除総データ量欄４８Ｃ及びガベージ量欄４８Ｄを備える。そしてプール番号欄４８Ａには、ストレージ装置１内に存在する各プールのプール番号がそれぞれ格納される。また総データ量欄４８Ｂには、ホストが使用している全領域のデータの圧縮・重複排除前のデータサイズの合計値が格納される。以下においては、この合計値のことを、適宜、そのプールの「総データ量」と呼ぶものとする。
【０１１２】
圧縮・重複排除総データ量欄４８Ｃには、対応するプールに格納されたデータのうち、圧縮・重複排除処理により得られた圧縮データの総データ量が格納される。またガベージ量欄４８Ｄには、対応するプールに存在するガベージの総データ量が格納される。従って、図１１の例の場合、プール番号が「１」のプールには、総データ量が「10240」（ＧＢ）分のデータが圧縮・重複排除処理により「5120」（ＧＢ）にまでデータ量が削減されて格納されており、さらに「256」（ＧＢ））のガベージも格納されていることが示されている。
【０１１３】
（４）処理の流れ
続いて、本実施形態に係るストレージ装置１が実施する各種処理の流れについて説明する。図１２に示すように、本実施形態に係るストレージ装置１のローカルメモリ１４には、少なくとも、Ｉ／Ｏプログラム５０、バッファ更新プログラム５１、圧縮・重複排除プログラム５２、ガベージコレクションプログラム５３が格納されており、ＣＰＵ１３がこれらのプログラムを実行することにより以下に説明する各種処理が実行される。
【０１１４】
またローカルメモリ１４には、稼働情報４２’が格納される。稼働情報４２’は、仮想ボリューム管理テーブル４２（図６）に格納される情報のうちの一部からなる情報である。具体的には稼働情報４２’は、仮想ボリューム管理テーブル４２の各レコードのうち、仮想ページ番号欄４２Ａ、最終更新時刻欄４２Ｂにそれぞれ格納されている情報のみを有する。そのため、本明細書では稼働情報４２’の図示は略す。
【０１１５】
さらにローカルメモリ１４には、バッファ５４が設けられる。バッファ５４は、ＣＰＵ１３が圧縮処理又は伸長処理を実行する際に使用するメモリ領域である。
【０１１６】
（４−１）ライト処理
まず、図１３を参照してＩ／Ｏプログラム５０が実行するライト処理の流れを説明する。なお、以下においては、ライト対象のデータのデータサイズが１チャンク（８ＫＢ）と同じで、かつライト要求で指定されたこのデータのライト先の先頭アドレスがチャンクの先頭アドレスに一致しているものとして説明する。
【０１１７】
Ｉ／Ｏプログラム５０は、ホスト２からのライト要求を受領すると、この図１３に示すライト処理を開始し、まず、ライト対象のデータを受領するための領域をキャッシュメモリ１５上に確保し、確保した領域に当該データを格納する（Ｓ１）。これは公知のストレージ装置でも行われる処理のため、詳細の説明は略す。
【０１１８】
続いて、Ｉ／Ｏプログラム５０は、ライト要求においてデータのライト先として指定されたアドレス（ＬＢＡ）から、上述した（１）式を利用してデータのライト先のＬＡを算出し（Ｓ２）、算出したＬＡの領域にＰＡが割り当てられているか否かを確認する（Ｓ３）。具体的に、Ｉ／Ｏプログラム５０は、ＬＰ変換テーブル４４（図８）のレコードの中からステップＳ２で算出したＬＡがＬＡ欄４４Ａに格納されたレコードを特定し、そのレコードのＰＡ欄４４Ｃに有効な値（null以外の値）が格納されているか否かを確認する。
【０１１９】
次いで、Ｉ／Ｏプログラム５０は、かかるＬＡの領域にＰＡが割り当てられているとの確認がステップＳ２で得られた（そのＬＡに対応するＰＡ欄４４Ｃにnull以外の値が格納されてることを確認できた）か否かを判断する（Ｓ４）。
【０１２０】
ここで、この判断で否定結果を得ることは、ライト要求においてデータライト先として指定された領域には未だデータが書き込まれておらず、そのデータライトが最初のデータライトであることを意味する。かくして、このときＩ／Ｏプログラム５０は、追書き上書き条件管理テーブル４８（図１１）のレコードの中から、ライト要求においてデータのライト先として指定された仮想ボリュームが属するプールに対応するレコードの総データ量欄４８Ｂ（図１１）に格納された値を、選択チャンク（図１４のステップＳ１０で選択したチャンク）のデータ量を加算した値に更新する（Ｓ５）。
【０１２１】
具体的に、圧縮・重複排除プログラム５２は、プール管理テーブル４１を参照して、そのときのライト要求において指定された仮想ボリュームの仮想ボリューム番号が仮想ボリューム番号欄４１Ｂ（図５）に格納されているレコードを特定し、そのレコードのプール番号欄４１Ａ（図５）に格納されたプール番号を取得する。このプール番号が付与されたプールが、ライト要求において指定された仮想ボリュームが属するプールである。そして圧縮・重複排除プログラム５２は、追書き上書き条件管理テーブル４８のレコードのうち、上述のようにして取得したプール番号がプール番号欄４８Ａ（図１１）に格納されているレコードを特定し、そのレコードの総データ量欄４８Ｂに格納されている値を選択チャンクのデータ量を加算した値に更新する。
【０１２２】
続いて、Ｉ／Ｏプログラム５０は、圧縮・重複排除プログラム５２（図１２）を呼び出す（Ｓ６）。そして、Ｉ／Ｏプログラム５０に呼び出された圧縮・重複排除プログラム５２は、ライト対象のデータに対して図１４について後述する圧縮・重複排除処理を実行し、かくして得られた圧縮・重複排除処理が施されたデータを対応する記憶デバイス２０に格納する。
【０１２３】
さらにＩ／Ｏプログラム５０は、ライト要求が完了した旨の応答をライト要求の送信元のホスト２に返信する（Ｓ７）。またＩ／Ｏプログラム５０は、ライト要求においてデータのライト先として指定されたアドレス（ＬＢＡ）を仮想ページ番号に変換し（以下、変換後の仮想ページ番号が「ｐ」であったものとする）、ローカルメモリ１４（図１２）内に稼働情報４２’（図１２）として保持している仮想ボリューム管理テーブル４２（図６）のレコードのうち、仮想ページ番号欄４２Ａ（図６）に格納された仮想ページ番号が「ｐ」のレコードの最終更新時刻欄４２Ｂ（図６）に現在時刻を格納する（Ｓ８）。そして、Ｉ／Ｏプログラム５０は、この後、このライト処理を終了する。
【０１２４】
このように本実施の形態では、仮想ページに対する最初のデータライトでは、データをインライン方式（同期方式）で記憶デバイス２０に格納する。これにより、ストレージ装置１に要求される記憶容量を、データを圧縮・重複排除処理した後のデータ量だけに抑えることができ、ポストプロセス方式でデータライトを行う場合に比べてストレージ装置に要求される記憶容量を抑えることができる。
【０１２５】
一方、ステップＳ４の判断で肯定結果を得ることは、ライト要求においてデータライト先として指定された領域には既にデータが書き込まれており（つまりそのデータライトが最初のデータライトでない）、さらにそのデータが既に圧縮・重複排除処理が施されて圧縮チャンクとして追書き空間に移動されていることを意味する。かくして、このときＩ／Ｏプログラム５０は、ライト要求の送信元のホスト２にライト要求が完了した旨の応答を返信する（Ｓ７）。またＩ／Ｏプログラムは、ステップＳ８を上述のように処理し、この後、このライト処理を終了する。
【０１２６】
なお、キャッシュメモリ１５に格納されたデータは、この後、ホストＩ／Ｏとは非同期にＩ／Ｏプログラム５０により圧縮・重複排除処理が施されて記憶デバイス２０に書き込まれる（Ｓ８）。この処理はデステージと呼ばれる。Ｉ／Ｏプログラム５０は、仮想ページに書き込まれたデータをデステージする際、その仮想ページに物理ページが割り当てられている場合には、その物理ページを提供する記憶デバイス２０にデータをデステージする。またＩ／Ｏプログラム５０は、その仮想ページに物理ページが割り当てられていない場合には、デステージ前にその仮想ページに物理ページを割り当てた上でデータをデステージする。このようなデステージ処理の詳細については後述する。
【０１２７】
このように本実施形態では、仮想ページの同一領域に対する２回目以降のデータライトでは、データをポストプロセス方式（非同期方式）で記憶デバイス２０に格納する。これにより、すべてのデータライトをインライン方式で実行する場合に比べてホスト２から見たストレージ装置１の応答性能を向上させることができる。
【０１２８】
（４−２）圧縮・重複排除処理
図１４は、図１３のステップＳ６においてＩ／Ｏプログラム５０により呼び出された圧縮・重複排除プログラム５２により実行される圧縮・重複排除処理の流れを示す。
【０１２９】
圧縮・重複排除プログラム５２は、Ｉ／Ｏプログラム５０により呼び出されると、この図１４に示す圧縮・重複排除処理を開始し、まず、必要に応じてライト対象のデータを８ＫＢのチャンク単位で分割し、かかる分割により得られたチャンクの中から未処理の１つのチャンクを選択する（Ｓ１０）。
【０１３０】
また、圧縮・重複排除プログラム５２は、選択したチャンク（以下、これを選択チャンクと呼ぶ）をローカルメモリ１４のバッファ５４（図１２）に転送し（Ｓ１１）、バッファ５４に転送した選択チャンクのＦＰＫを算出する（Ｓ１２）。
【０１３１】
続いて、圧縮・重複排除プログラム５２は、選択チャンクの圧縮チャンクを書き込むべき追書き空間上のアドレス（ＰＡ）を特定し、そのＰＡを含む追書きページに割り当てられる物理ページを提供する記憶デバイス２０が圧縮機能付きの記憶デバイス２０であるか否かを判断する（Ｓ１３）。
【０１３２】
具体的に、圧縮・重複排除プログラム５２は、追書き空間マッピングテーブル４３（図７）を参照して、追書き空間における最後に圧縮チャンクを書き込んだ位置の次のＰＡを算出する。このＰＡが選択チャンクの圧縮チャンクを書き込むべき追書き空間上のアドレスである。より具体的には、圧縮・重複排除プログラム５２は、プール管理テーブル４１（図５）における対応するレコードの最終書込み位置欄４１Ｃ（図５）を参照することにより、対応する仮想ボリュームと対応付けられた追書き空間における最後に圧縮チャンクの書き込みが行われた追書きページの追書きページ番号を特定する。以下、これを「ＡＰ１」とする。
【０１３３】
また圧縮・重複排除プログラム５２は、追書き空間マッピングテーブル４３のレコードの中から、上述のようにして特定した追書きページ番号が追書きページ番号欄４３Ａに格納されたレコードを特定し、そのレコードのページ内最終書込み位置欄４３Ｄに格納された最終書込み位置を取得する。以下、これを「ＡＲ１」とする。
【０１３４】
そして圧縮・重複排除プログラム５２は、このようにして得られたＡＰ１及びＡＲ１を用いて、次式
【数２】
2019128906.tif 000004
により、追書き空間における選択チャンクの圧縮チャンクを書き込むべきＰＡを求める。そして圧縮・重複排除プログラム５２は、このＰＡを含む追書きページに割り当てるべき物理ページを事前に選択する。そして圧縮・重複排除プログラム５２は、ページ管理テーブル４０（図４）を参照して、その物理ページの物理ページ番号が物理ページ番号欄４０Ａに格納されたレコードの圧縮機能有無フラグ欄４０Ｅに格納された圧縮機能有無フラグの値が「１」であるか否かに基づいて、その物理ページを提供する記憶デバイス２０が圧縮機能を備えるか否かを判断する。
【０１３５】
ここで、このステップＳ１３の判断で肯定結果を得た場合（ステップＳ１３で確認した圧縮機能有無フラグの値が「１」であった場合）、選択チャンクの圧縮処理を当該選択チャンクの格納先の記憶デバイス２０に任せることができるため、ストレージコントローラ１０において当該選択チャンクに対する圧縮処理を実行する必要はない。かくして、このとき圧縮・重複排除プログラム５２は、選択チャンクに圧縮処理を施すことなくステップＳ１５に進む。
【０１３６】
これに対して、ステップＳ１３の判断で否定結果を得た場合、選択チャンクの圧縮処理を当該選択チャンクの格納先の記憶デバイス２０に任せることができない。かくして、このとき圧縮・重複排除プログラム５２は、選択チャンクを圧縮処理することにより圧縮チャンクを生成する（Ｓ１４）。
【０１３７】
続いて、圧縮・重複排除プログラム５２は、図１５Ａ及び図１５Ｂについて後述する重複排除処理を実行することにより選択チャンクに対して重複排除処理を施し（Ｓ１５）、この後、必要なすべてのチャンクについてステップＳ１１〜ステップＳ１５の処理を実行し終えたか否かを判断する（Ｓ１６）。
【０１３８】
圧縮・重複排除プログラム５２は、この判断で否定結果を得るとステップＳ１０に戻り、この後、ステップＳ１０で選択するチャンク（選択チャンク）を未処理の他のチャンクに順次切り替えながら、ステップＳ１０〜ステップＳ１６の処理を繰り返す。そして圧縮・重複排除プログラム５２は、この後、この重複排除処理を終了する。
【０１３９】
（４−３）重複排除処理
図１５Ａ及び図１５Ｂは、図１４について上述した圧縮・重複排除処理のステップＳ１５において圧縮・重複排除プログラム５２により実行される重複排除処理の具体的な処理手順を示す。圧縮・重複排除プログラム５２は、この図１５Ａ及び図１５Ｂに示す処理手順に従って、選択チャンクに対する重複排除処理を実行する。
【０１４０】
実際上、圧縮・重複排除プログラム５２は、かかる圧縮・重複排除処理のステップＳ１５に進むと、この図１５Ａ及び図１５Ｂに示す重複排除処理を開始する。そして圧縮・重複排除プログラム５２は、選択チャンクについて圧縮・重複排除処理（図１４）のステップＳ１２で算出したＦＰＫと同じＦＰＫがＦＰＭＱ４５（図９）に格納されているか否かを判定する（Ｓ２０）。この判定は、上述のようにＦＰＴＤ４６（図９）を利用して、ＦＰＭＱ４５のレコードのうち、圧縮・重複排除処理のステップＳ１２で算出したＦＰＫがＦＰＫ欄４５Ａ（図９）に格納されたレコードが存在するか否かを探索することにより行われる。
【０１４１】
そして圧縮・重複排除プログラム５２は、ステップＳの判定で肯定結果を得ると、圧縮・重複排除処理（図）のステップＳ２０で算出したＦＰＫとＦＰＫが同じチャンク（圧縮チャンク）を記憶デバイス２０から読み出す（Ｓ２１）。
【０１４２】
具体的に、圧縮・重複排除プログラム５２は、まず、ＦＰＭＱ４５及びＬＰ変換テーブル４４（図８）を参照することにより圧縮・重複排除処理のステップＳ１２で算出したＦＰＫと同じＦＰＫを持つチャンク（圧縮チャンク）が格納されているＰＡ及びその長さを特定する。以下においては、このチャンクを重複候補チャンクと呼び、重複候補チャンクのＰＡを「ＰＡ１」と呼ぶ。続いて、圧縮・重複排除プログラム５２は、追書き空間マッピングテーブル４３（図７）を参照することにより、重複候補チャンクが格納されている物理ページのページ番号を特定し、さらにページ管理テーブル４０（図４）を参照することにより、重複候補チャンクが格納されている物理ページを提供する記憶デバイス２０と、その記憶デバイス２０内におけるその物理ページのアドレスとを特定する。そして圧縮・重複排除プログラム５２は、このようにして特定した記憶デバイス２０から重複候補チャンクを読み出す。
【０１４３】
次いで、圧縮・重複排除プログラム５２は、ステップＳ２１で読み出したチャンク（圧縮チャンク）の内容と、選択チャンクの内容とを比較し、両者が一致する否かを判定する（Ｓ２２）。なお、比較の際、選択チャンクが圧縮されていない場合には、その選択チャンクを圧縮し又はステップＳ２１で読み出したチャンクを伸長した上で、これらのチャンク同士をバイト単位で比較する。
【０１４４】
この判定で肯定結果を得ることは、選択チャンクと同じ内容のチャンクが既にＦＰＭＱ４５に登録されていることを意味する。この場合、圧縮・重複排除プログラム５２は、まず、選択チャンクのＬＡと、その選択チャンクのＦＰＫとを対応付けてＦＰＭＱ４５に登録する。また圧縮・重複排除プログラム５２は、ＬＰ変換テーブル４４（図８）のレコードのうち、ＬＡ欄４４Ａ（図８）に格納されたＬＡが選択チャンクのＬＡと一致するレコードのＦＰＭＱ登録欄４４Ｅ（図８）に「１」を格納する（Ｓ２３）。
【０１４５】
続いて、圧縮・重複排除プログラム５２は、ＬＰ変換テーブル４４のレコードのうち、ＬＡ欄４４Ａに格納されたＬＡが選択チャンクのＬＡと一致するレコードのＰＡ欄４４Ｃに、重複候補チャンクのＰＡ（つまり「ＰＡ１」）を格納し、そのレコードの長さ欄４４Ｄに重複候補チャンクのデータ長を格納する（Ｓ２４）。この場合、選択チャンクの圧縮チャンクは追書き空間に格納はされない。
【０１４６】
次いで、圧縮・重複排除プログラム５２は、選択チャンクが圧縮・重複排除処理（図１４）のステップＳ１４で圧縮処理されており、かつ追書き空間に格納されている更新前の選択チャンク又はその圧縮チャンクがガベージとなったか否かを判断する（Ｓ２５）。この判断は、選択チャンクの圧縮チャンクが存在し、かつ更新前の選択チャンクの圧縮チャンクが格納された追書き空間の領域のＰＡが、ＬＰ変換テーブル４４において他のＬＡと対応付けられて登録されているか否かを判断することにより行われる。具体的に、圧縮・重複排除プログラム５２は、ＬＰ変換テーブル４４のレコードのうち、選択チャンクのＬＡがＬＡ欄４４Ａに格納されたレコードを特定し、そのレコードのＰＡ欄４４Ｃに格納されているＰＡを取得する。そして圧縮・重複排除プログラム５２は、取得したＰＡがＬＰ変換テーブル４４における上述のように特定したレコード以外のレコードのＰＡ欄４４Ｃに格納されているか否かを判断する。
【０１４７】
ここで、この判断で否定結果を得ることは、追書き空間に格納されている更新前の選択チャンクの圧縮チャンクが重複排除処理により削除された他の圧縮チャンクと同一内容であり、当該更新前の選択チャンクの圧縮チャンクが他のＬＡとも対応付けられているため、その選択チャンクの圧縮チャンクを削除することはできないことを意味する。かくして、このとき圧縮・重複排除プログラム５２はこの重複排除処理を終了する。
【０１４８】
これに対して、ステップＳ２５の判断で肯定結果を得ることは、追書き空間に格納されている更新前の選択チャンクの圧縮チャンクが選択チャンクのＬＡ以外のいずれのＬＡとも対応付けられておらず、ガベージとなっていることを意味する。かくして、このとき圧縮・重複排除プログラム５２は、かかる更新前の選択チャンクの圧縮チャンクが格納されているＰＡと、ＬＰ変換テーブル４４における選択チャンクに対応するレコードの長さ欄４４Ｄに格納されている更新前の選択チャンクの圧縮チャンクのデータ長とを対応付けてガベージ管理テーブル４７（図１０）に登録する（Ｓ２６）。
【０１４９】
続いて、圧縮・重複排除プログラム５２は、追書き上書き条件管理テーブル４８（図１１）のレコードの中から、更新前の選択チャンクの圧縮チャンクが格納された物理ページを含むプールに対応するレコードのガベージ量欄４８Ｄ（図１１）に格納されている値を、更新前の選択チャンクの圧縮チャンクのデータサイズを加算した値に更新する（Ｓ２７）。
【０１５０】
また圧縮・重複排除プログラム５２は、追書き上書き条件管理テーブル４８のかかるレコードの圧縮・重複排除総データ量欄４８Ｃに格納されている値を、更新前の選択チャンクの圧縮チャンクのデータサイズを減算した値に更新し（Ｓ２８）、この後、この重複排除処理を終了する。
【０１５１】
一方、圧縮・重複排除プログラム５２は、ステップＳ２０又はステップＳ２２の判断で否定結果を得ると、ステップＳ２３と同様にして、選択チャンクのＬＡと、その選択チャンクのＦＰＫとを対応付けてＦＰＭＱ４５（図９）に登録する。また圧縮・重複排除プログラム５２は、ＬＰ変換テーブル４４のレコードのうち、ＬＡ欄４４Ａに選択チャンクのＬＡが格納されたレコードのＦＰＭＱ登録欄４４Ｅに「１」を格納する（Ｓ２９）。
【０１５２】
続いて、圧縮・重複排除プログラム５２は、ＬＰ変換テーブル４４のレコードのうち、ＬＡ欄４４Ａに選択チャンクのＬＡが格納されたレコードのＰＡ欄４４ＣにＰＡが格納されているか否か（つまり更新前の選択チャンクの圧縮チャンクが追書き空間に格納されているか否か）を判断する（Ｓ３０）。
【０１５３】
なお、上書き空間のチャンクへの初回のデータライトの場合、図１３のステップＳ４で否定結果が得られ、ステップＳ６で呼び出された圧縮・重複排除プログラム５２により図１４の圧縮・重複排除処理及び図１５Ａ及び図１５Ｂの重複排除処理が実行されるため、このステップＳ３０の判断では必ず否定結果が得られることになる。これに対して、上書き空間のチャンクへの２回目以降のデータライトの場合には、図１８について後述するデステージ処理において実行されるこの図１５Ａ及び図１５Ｂに示す重複排除処理のステップＳ３０において必ず肯定結果が得られる。
【０１５４】
かくして圧縮・重複排除プログラム５２は、このステップＳ３０の判断で否定結果を得ると、図１６について後述するＰＡ決定及び書込み処理を実行することにより、バッファ５４（図１２）に格納されている選択チャンクの圧縮チャンクを追書き空間に移動させた上で、その選択チャンクの圧縮チャンクを記憶デバイス２０に書き込む（Ｓ３４）。なお、ＰＡ決定及び書込み処理の詳細については後述する。
【０１５５】
次いで、圧縮・重複排除プログラム５２は、ＬＰ変換テーブル４４（図８）のレコードのうち、ＬＡ欄４４Ａに選択チャンクのＬＡが格納されたレコードのＰＡ欄４４Ｃに、ステップＳ３４のＰＡ決定及び書込み処理において選択チャンクの圧縮チャンクを書き込んだ追書き空間上のＰＡを格納する（Ｓ３５）。また圧縮・重複排除プログラム５２は、追書き上書き条件管理テーブル４８（図１１）のレコードのうち、対応するプールのプール番号がプール番号欄４８Ａに格納されたレコードの圧縮・重複排除総データ量欄４８Ｃに格納されている値を、選択チャンクの圧縮チャンクのデータサイズを加算した値に更新する（Ｓ３６）。
【０１５６】
さらに圧縮・重複排除プログラム５２は、ステップＳ２５と同様にして、更新前の選択チャンクの圧縮チャンクが格納された追書き空間の領域のＰＡが、ＬＰ変換テーブルにおいて他のＬＡと対応付けられて登録されているか否かを判断する（Ｓ３７）。なおステップＳ３０で否定結果を得た上で、ステップＳ３４〜ステップＳ３６を経由してこのステップＳ３８に至った場合には、当該に更新前のその選択チャンクの圧縮チャンクが追書き空間に格納されていないため、この判断では否定結果が得られる。そして圧縮・重複排除プログラム５２は、このステップＳ３７で否定結果を得ると、この重複排除処理を終了する。
【０１５７】
これに対して、ステップＳ３２で否定結果を得た上で、ステップＳ３４〜ステップＳ３６を経由してこのステップＳ３８に至った場合には、このステップＳ３７で肯定結果を得る場合がある。かくして、このとき圧縮・重複排除プログラム５２は、ステップＳ３８〜ステップＳ４０を上述したステップＳ２６〜ステップＳ２８と同様に処理し、この後、この重複排除処理を終了する。
【０１５８】
一方、圧縮・重複排除プログラム５２は、ステップＳ３０の判断で肯定結果を得た場合には、追書き空間に格納されている更新前の選択チャンクの圧縮チャンク上に更新後の選択チャンクの圧縮チャンクを上書きする必要があるか否かを判定する追書き上書き要否判定処理を実行する（Ｓ３１）。追書き上書き要否判定処理の詳細については後述する。
【０１５９】
また圧縮・重複排除プログラム５２は、ステップＳ３０の追書き上書き要否判定処理の結果として、追書き空間に格納されている更新前の選択チャンクの圧縮チャンク上に更新後の選択チャンクの圧縮チャンクを上書きする必要があるとの判定が得られたか否かを判断する（Ｓ３２）。そして圧縮・重複排除プログラム５２は、この判断で否定結果を得ると、上述と同様にしてステップＳ３４〜ステップＳ４０を実行し、この後、この重複排除処理を終了する。
【０１６０】
これに対して、圧縮・重複排除プログラム５２は、ステップＳ３２の判断で肯定結果を得ると、ＬＰ変換テーブル４４（図８）のレコードのうち、ＬＡ欄４４Ａ（図８）に選択チャンクのＬＡが格納されているレコードのＰＡ欄４４Ｃ（図８）に格納されているＰＡを取得し、取得したＰＡで示される物理アドレス（対応する記憶デバイス内の対応する領域）にそのときバッファ５４（図１２）に格納されている更新後の選択チャンク又はその圧縮チャンクを格納する（Ｓ３３）。これにより、追書き空間に格納されている更新前の選択チャンクの圧縮チャンク上に、更新後の選択チャンクの圧縮チャンクが上書きされる。そして圧縮・重複排除プログラム５２は、この後、この重複排除処理を終了する。
【０１６１】
（４−４）ＰＡ決定及び書込み処理
図１６は、図１５Ａ及び図１５Ｂについて上述した重複排除処理のステップＳ３４において圧縮・重複排除プログラム５２により実行されるＰＡ決定及び書込み処理の具体的な処理手順を示す。圧縮・重複排除プログラム５２は、この図１６に示す処理手順に従って、バッファ５４（図１２）に格納されている選択チャンクの圧縮チャンクの格納先とすべき追書き空間上のＰＡを決定すると共に、そのＰＡに更新後の選択チャンクの圧縮チャンクを書き込む。
【０１６２】
実際上、圧縮・重複排除プログラム５２は、重複排除処理のステップＳ３４に進むと、この図１６に示すＰＡ決定及び書込み処理を開始し、まず、圧縮・重複排除処理（図１４）のステップＳ１３について上述した手法と同様の手法により、追書き空間における最後にチャンクの圧縮チャンクを書き込んだ位置の次のＰＡを算出する（Ｓ５０）。このＰＡが選択チャンクの圧縮チャンクを書き込むべき追書き空間上のアドレスである。
【０１６３】
具体的に、圧縮・重複排除プログラム５２は、プール管理テーブル４１（図５）における対応するレコードの最終書込み位置欄４１Ｃ（図５）を参照することにより、対応する仮想ボリュームに対応する追書き空間における最後に書き込みが行われた追書きページの追書きページ番号を特定する。ここでは、特定した追書きページ番号が「ＡＰ１」であったものとする。また圧縮・重複排除プログラム５２は、追書き空間マッピングテーブル４３（図７）のレコードの中から、上述のようにして特定した追書きページ番号が追書きページ番号欄４３Ａ（図７）に格納されたレコードを特定し、そのレコードのページ内最終書込み位置欄４３Ｄ（図７）に格納された最終書込み位置を取得する。ここでは、取得した最終書込み位置が「ＡＲ１」であったものとする。
【０１６４】
そして圧縮・重複排除プログラム５２は、このようにして得られたＡＰ１及びＡＲ１を用いて、上述の（２）式により、追書き空間上の選択チャンクの圧縮チャンクを書き込むべきＰＡを求める。以下においては、選択チャンクの圧縮チャンクの書込み先のＰＡが「ＰＡ２」に決定され、また圧縮チャンクの長さが「Ｌ２」であったものとする。
【０１６５】
続いて、圧縮・重複排除プログラム５２は、ステップＳ５０で算出したＰＡ（ＰＡ２）を含む追書きページに物理ページが割り当てられているか否かを判断する（Ｓ５１）。具体的に、圧縮・重複排除プログラム５２は、「ＰＡ２」をページサイズ（42ＭＢ）で割ることにより「ＰＡ２」を含む追書きページの追書きページ番号を求める。ここでは、求められた追書きページ番号が「ＡＰ２」であったものとする。また圧縮・重複排除プログラム５２は、追書き空間マッピングテーブル４３（図７）を参照することにより、追書きページ番号欄４３Ａ（図７）に「ＡＰ２」が格納されたレコードの物理ページ番号欄４３Ｂ（図７）に有効な値（null以外の値）が格納されているか否かを判断する。かかる物理ページ番号欄４３Ｂに有効な値が格納されている場合、「ＰＡ２」を含む追書きページには、物理ページが割り当てられている。そして圧縮・重複排除プログラム５２は、この判断で肯定結果を得るとステップＳ５３に進む。
【０１６６】
これに対して圧縮・重複排除プログラム５２は、ステップＳ５１の判断で否定結果を得ると、その追書きページに物理ページを割り当てる（Ｓ５２）。具体的に、圧縮・重複排除プログラム５２は、ページ管理テーブル４０（図４）から未使用の物理ページに対応するレコード（使用状況欄４０Ｄに「０」が格納されたレコード）を１つ選択する。この際、圧縮・重複排除プログラム５２は、図１４について上述した圧縮・重複排除処理からの続きでこのＰＡ決定及び書込み処理を実行している場合には、圧縮・重複排除処理のステップＳ１３で上述のように仮に選択した物理ページを選択する。
【０１６７】
そして圧縮・重複排除プログラム５２は、そのレコードの物理ページ番号欄４０Ａ（図４）に格納されているその物理ページの物理ページ番号と、その物理ページの属するプールのプール番号とを、それぞれ追書き空間マッピングテーブル４３（図７）におけるその追書きページに対応するレコードの物理ページ番号欄４３Ｂ（図７）とプール番号欄４３Ｃ（図７）とにそれぞれ格納する。また圧縮・重複排除プログラム５２は、ページ管理テーブル４０における上述のように選択したレコードの使用状況欄４０Ｄ（図４）に「１」を格納する。
【０１６８】
次いで、圧縮・重複排除プログラム５２は、追書き空間マッピングテーブル４３及びページ管理テーブル４０を参照することにより、選択チャンクの圧縮チャンクの書込み先の記憶デバイス２０が提供する記憶領域上のアドレスを算出する（Ｓ５３）。そして圧縮・重複排除プログラム５２は、ステップＳ５３で算出したアドレスに、選択チャンクの圧縮チャンクを書き込む（Ｓ５４）。
【０１６９】
さらに圧縮・重複排除プログラム５２は、今回選択チャンクの圧縮チャンクを書き込んだ追書きページの追書きページ番号をプール管理テーブル４１（図５）における対応するレコードの最終書込み位置欄４１Ｃ（図５）に格納すると共に、最後に書き込みを行った追書きページ内の相対アドレスを追書き空間マッピングテーブル４３（図７）における対応するレコードのページ内最終書込み位置欄４３Ｄ（図７）に格納する（Ｓ５５）。そして圧縮・重複排除プログラム５２は、この後、このＰＡ決定及び書込み処理を終了する。
【０１７０】
（４−５）追書き上書き要否判定処理
本実施形態のストレージ装置１において、ホスト２から書き込まれたデータが上書き空間から圧縮されて追書き空間に書き込まれた後に、そのデータが更新された場合、更新前の圧縮されたデータは基本的にガベージとなる（ただし、重複排除処理により唯一残されたデータである場合を除く）。このため本実施形態のストレージ装置１では、追書き空間内やプール内に存在するガベージを破棄する後述のガベージコレクション処理（図１８）を定期的に実行することにより、ガベージの蓄積に起因する追書き空間やプール容量の枯渇を防止している。
【０１７１】
しかしながら、データ更新が急増した場合や、ガベージコレクション処理の実行周期に対してデータ更新の頻度が多い場合には、ガベージコレクション処理によるガベージの破棄量よりもデータ更新に起因して発生するガベージの発生量のほうが多くなり、プールが枯渇するおそれがある。
【０１７２】
このような事態の発生を防止すべく、本実施形態のストレージ装置１においては、プールの使用量が予め設定された閾値（以下、これをプール使用量閾値と呼ぶ）を超えた場合に、ホスト２からのＩ／Ｏに対して受付を制限する機能が搭載されているものの、このようなＩ／Ｏの受付制限を行った場合、ホスト２から見たストレージ装置１の応答性能が低下するという問題がある。
【０１７３】
そこで、本実施形態のストレージ装置１では、ホスト２からのＩ／Ｏによりデータが更新される場合であって、ホスト２からのＩ／Ｏの受付が制限されているときや、プールが枯渇しそうなときには、そのデータの更新後の圧縮データを追書き空間に存在するそのデータの更新前の圧縮データ上に上書きする追書き上書き機能が搭載されている。
【０１７４】
具体的には、データの圧縮処理や重複排除処理はチャンク単位で行われるため、更新されるチャンクごとに以下の（条件１）及び（条件２）の２つの条件（以下、これらを追書き上書き条件と呼ぶ）のうちのいずれかを満たすか否かをそれぞれ判定（追書き上書き要否判定）し、少なくとも一方の追書き上書き条件を満たすチャンクについては、追書き空間に存在するその更新前のチャンク又はその圧縮チャンク上に更新後のそのチャンク又はその圧縮チャンクを上書きする。
【０１７５】
（条件１）対象となるチャンクの更新後の圧縮チャンクのデータサイズが当該チャンクの更新前の圧縮チャンクのデータサイズ以下であり、かつ当該チャンクを格納すべきプール（以下、これを対象プールと呼ぶ）におけるガベージ量（ガベージのデータ量）が多い場合。
本実施形態においては、「ガベージ量が多い」と判断する基準として、次式
【数３】
2019128906.tif 000005
が成り立つ場合。なお、この条件は、プールにおけるガベージ量が、プールに格納された各データの圧縮・重複排除処理前の総データ量と、当該プールに格納された各データの圧縮・重複排除後の総データ量との差分以上であることを意味する。
【０１７６】
（条件２）対象となるチャンクの更新後の圧縮チャンクのデータサイズが当該チャンクの更新前の圧縮チャンクのデータサイズ以下であり、かつ対象プールの使用量が一定以上。
本実施形態においては、次式
【数４】
2019128906.tif 000006
が成り立つ場合。
【０１７７】
図１７は、このような追書き上書き機能に関連して図１５Ａ及び図１５Ｂについて上述した重複排除処理のステップＳ３１において圧縮・重複排除プログラム５２により実行される追書き上書き要否判定処理の処理手順を示す。
【０１７８】
圧縮・重複排除プログラム５２は、重複排除処理のステップＳ３１に進むと、この図１７に示す追書き上書き判定処理を開始し、まず、追書き上書き条件管理テーブル４８（図１１）を参照して、対応するプールの総データ量を取得する（Ｓ６０）。具体的に、圧縮・重複排除プログラム５２は、追書き上書き条件管理テーブル４８のレコードの中から、そのとき対象としているチャンク（以下、これを対象チャンク）のライト先の仮想ボリュームが属するプール（以下、これを対象プールと呼ぶ）のプール番号がプール番号欄４８Ａ（図１１）に格納されたレコードを特定し、そのレコードの総データ量欄４８Ｂ（図１１）に格納されている値を取得する。
【０１７９】
続いて、圧縮・重複排除プログラム５２は、プール管理テーブル４１（図５）のレコードの中から、対象プールのプール番号がプール番号欄４１Ａ（図５）に格納されているレコードを特定し、そのレコードのプールサイズ欄４１Ｄ（図５）に格納されている対象プールのプールサイズ（容量）を取得する（Ｓ６１）。
【０１８０】
次いで、圧縮・重複排除プログラム５２は、ステップＳ６１で取得した対象プールの総データ量が上述のプール使用量閾値を超えているか否かを判断する（Ｓ６２）。このプール使用量閾値は、ユーザが任意に設定することができる。例えば、プール使用量閾値をそのプールのプールサイズ（全容量）の80％と予め定め、そのプールのプールサイズに80％を乗算することにより得られた値をプール使用量閾値として設定するようにしてもよい。
【０１８１】
この判断で肯定結果を得ることは、上述した追書き上書き条件の（条件２）における「対象プールの使用量が一定以上」という条件を満たすことを意味する。かくして、このとき圧縮・重複排除プログラム５２は、ステップＳ６６に進む。
【０１８２】
これに対して、ステップＳ６２の判断で否定結果を得ることは、対象プールの使用量がまだ多いという状態には至っていないことを意味する。かくして、このとき圧縮・重複排除プログラム５２は、追書き上書き条件管理テーブル４８から、対象プールに格納されている圧縮・重複排除後の総データ量（以下、これを圧縮・重複排除後総データ量と呼ぶ）と、当該対象プールに格納されているガベージのデータ量とをそれぞれ取得する（Ｓ６３，Ｓ６４）。
【０１８３】
具体的に、圧縮・重複排除プログラム５２は、ステップＳ６３において、追書き上書き条件管理テーブル４８のレコードのうち、対象プールに対応するレコードの圧縮・重複排除総データ量欄４８Ｃ（図１１）に格納されている圧縮・重複排除後総データ量を取得し、ステップＳ６４において、そのレコードのガベージ量欄４８Ｄ（図１１）に格納されている値（以下、これをガベージ量と呼ぶ）を取得する。
【０１８４】
そして圧縮・重複排除プログラム５２は、ステップＳ６０で取得した総データ量の値が、ステップＳ６３で取得した圧縮・重複排除後総データ量と、ステップＳ６４で取得したガベージ量との合計以下であるか否かを判断する（Ｓ６５）。
【０１８５】
この判断で肯定結果を得ることは、上述した追書き上書き条件の（条件１）における「対象プールのガベージ量が多い」という条件を満たすことを意味する。かくして、このとき圧縮・重複排除プログラム５２は、更新後の選択チャンクの圧縮チャンクのデータサイズが更新前の選択チャンクの圧縮チャンクのデータサイズ以下であるか否かを判断する（Ｓ６６）。
【０１８６】
この判断で肯定結果を得ることは、上述した追書き上書き条件の（条件１）及び（条件２）における「対象となるチャンクの更新後の圧縮チャンクのデータサイズが当該チャンクの更新前の圧縮チャンクのデータサイズ以下」という条件を満たし、結果として選択チャンクの圧縮チャンクがこれら追書き上書き条件の（条件１）及び（条件２）のうちのいずれか一方を満たすことを意味する。かくして、このとき圧縮・重複排除プログラム５２は、更新後の選択チャンクの圧縮チャンクを、追書き空間に格納されている更新前の選択チャンクの圧縮チャンクに上書きする必要があると判定し（Ｓ６８）、この後、この追書き上書き要否判定処理を終了する。
【０１８７】
これに対して、ステップＳ６５又はステップＳ６６の判断で否定結果を得ることは、選択チャンクの圧縮チャンクが上述の追書き上書き条件の（条件１）及び（条件２）のうちのいずれも満たさないことを意味する。かくして、このとき圧縮・重複排除プログラム５２は、更新後の選択チャンクの圧縮チャンクを、追書き空間に格納されている更新前の選択チャンクの圧縮チャンクに上書きする必要がないと判定し（Ｓ６７）、この後、この追書き上書き要否判定処理を終了する。
【０１８８】
（４−６）デステージ処理
図１８は、Ｉ／Ｏプログラム５０により定期的に実行されるデステージ処理の処理手順を示す。上述のように本実施形態のストレージ装置１では、仮想ボリュームのある領域（上書き空間上のあるＬＡ）に対する最初のデータライトの場合には、インライン方式によりホストＩ／Ｏと同期してデータが記憶デバイス２０に格納される。
【０１８９】
しかしながら、仮想ボリュームの同じ領域に対する２回目以降のデータライト（つまりデータの更新時）の場合には、ポストプロセス方式が適用されるため、ライト対象のデータが圧縮・重複排除されることなくキャッシュメモリ１５（図１）に残留することになる。そこでストレージ装置１では、Ｉ／Ｏプログラム５０がこの図１８に示すデステージ処理を定期的に実行することにより、キャッシュメモリ１５に残留するデータを、重複排除処理及び必要に応じて圧縮処理（格納先の記憶デバイス２０が圧縮機能を有さない場合）を施しながら記憶デバイス２０にデステージする。
【０１９０】
実際上、Ｉ／Ｏプログラム５０は、このデステージ処理を開始すると、まず、キャッシュメモリ１５に格納されているデステージ対象のデータ（更新データ）の中から処理対象のデータ（以下、これを処理対象データと呼ぶ）を選択する（Ｓ７０）。処理対象データの選択方法としては、様々な方法を適用できる。例えば、ホスト２からライトされた時刻が最も古いデータを選択する方法がある。その場合、ストレージコントローラ１０（図１）は、キャッシュメモリ１５に格納された各データについて、ホスト２からライトされた時刻を記憶しておく必要がある。以下では、ここで１チャンク分のデータが選択された場合の例を説明する。ただし別の実施形態として、複数のチャンク、例えば仮想ボリューム上で連続している複数のチャンクを選択するようにしてもよい。
【０１９１】
続いて、Ｉ／Ｏプログラム５０は、ステップＳ７０で選択した処理対象データのライト先の仮想ページ（以下、これをライト先仮想ボリュームと呼ぶ）を特定する。そしてＩ／Ｏプログラム５０は、仮想ボリューム管理テーブル４２（図６）のレコードのうち、ライト先仮想ボリュームの仮想ボリューム番号が仮想ページ番号欄４２Ａ（図６）に格納されているレコードのページ種別欄４２Ｃ（図６）に格納された値が「０」であるか否かを判断する（Ｓ７１）。
【０１９２】
この判断で肯定結果を得ることは、処理対象データが既に圧縮・重複排除されて上書き空間に移動されていることを意味する。かくして、このときＩ／Ｏプログラム５０は、このデータを再び上書き空間に戻すか否かを判断する（Ｓ７２）。例えば、ライト先仮想ページ内のほぼすべてのチャンクが更新されている場合、そのライト先仮想ページに格納されたデータが今後も頻繁に更新される可能性があり、デステージのたびにデータを圧縮して格納すると、ライト処理のオーバヘッドが大きくなる。そこで、このような場合にＩ／Ｏプログラム５０は、追書き空間に移動されている当該仮想ページのデータを、再び上書き空間に戻すと決定する。ただし、この判定方法は一例であり、これ以外の判定方法によって、追書き空間に移動されているかかる仮想ページのデータを再び上書き空間に戻すか否かを判定するようにしてもよい。
【０１９３】
そしてＩ／Ｏプログラム５０は、ステップＳ７２の判断で否定結果を得ると、処理対象データの格納先の記憶デバイス２０が圧縮機能を有さない場合に限り、その処理対象データを圧縮する（Ｓ７３）。このステップＳ７３におけるＩ／Ｏプログラム５０の処理内容は、図１４のステップＳ１１〜ステップＳ１４と同様である。従って、この際、Ｉ／Ｏプログラム５０は、処理対象データのＦＰＫも算出する。
【０１９４】
またＩ／Ｏプログラム５０は、圧縮した処理対象データ（圧縮チャンク）を追書き空間に格納する（Ｓ７４）。この処理は、図１４のステップＳ１５（図１５Ａ及び図１５Ｂ）と同様な処理である。なお、この際、Ｉ／Ｏプログラム５０は、図１５ＡのステップＳ３０に進んだ場合、処理対象データの格納先が圧縮機能を備える記憶デバイス２０でないときには、このステップＳ３０の判断で必ず肯定結果を得てステップＳ３１以降の処理を実行することになる。そしてＩ／Ｏプログラム５０は、この後、このデステージ処理を終了する。
【０１９５】
これに対して、Ｉ／Ｏプログラム５０は、ステップＳ７２の判断で肯定結果を得ると、追書き空間に移動されているライト先仮想ページのすべてのデータを記憶デバイス２０から読み出し、読み出したデータを、伸長した上で一旦キャッシュメモリ１５（図１）に格納する（Ｓ７５）。
【０１９６】
この後、Ｉ／Ｏプログラム５０は、ライト先仮想ページに物理ページを割り当てる（Ｓ７６）。具体的に、Ｉ／Ｏプログラム５０は、ページ管理テーブル４０（図４）から未使用の物理ページを１つ選択し、その物理ページの物理ページ番号及び当該物理ページが属するプールのプール番号を、それぞれ仮想ボリューム管理テーブル４２（図６）のレコードのうち、仮想ページ番号欄４２Ａ（図６）にライト先仮想ボリュームの仮想ボリューム番号が格納されたレコードの物理ページ番号欄４２Ｄ（図６）及びプール番号欄４２Ｅ（図６）に格納する。またＩ／Ｏプログラム５０は、ページ管理テーブル４０のレコードのうち、上述のように選択した物理ページの物理ページ番号が物理ページ番号欄４０Ａ（図４）に格納されたレコードの使用状況欄４０Ｄ（図４）に「１」を格納する。
【０１９７】
続いて、Ｉ／Ｏプログラム５０は、ライト先仮想ページに割り当てられた物理ページに、ステップＳ７５で読み出したデータを格納する（Ｓ７７）。具体的に、Ｉ／Ｏプログラム５０は、ページ管理テーブル４０のレコードのうち、ライト先仮想ページに割り当てられた物理ページに対応するレコード（物理ページ番号欄４０Ａにその物理ページの物理ページ番号が格納されているレコード）のデバイス番号欄４０Ｂ（図４）及びアドレス欄４０Ｃ（図４）にそれぞれ格納されているデバイス番号及びアドレスを取得する。そしてＩ／Ｏプログラム５０は、そのデバイス番号が付与された記憶デバイス２０のそのアドレス位置に、ステップＳ７５で読み出したデータを格納する。
【０１９８】
次いで、Ｉ／Ｏプログラム５０は、ライト先仮想ページに割り当てられた物理ページに、処理対象データを上書きし（Ｓ７８）、この後、このデステージ処理を終了する。
【０１９９】
これに対して、Ｉ／Ｏプログラム５０は、ステップＳ７１の判断で否定結果を得た場合であって、ライト先仮想ページに物理ページが割り当てられていないときには、ステップＳ７６と同様にして、そのライト先仮想ページに物理ページを割り当てる（Ｓ７９）。ただし、かかるライト先仮想ページに既に物理ページが割り当てられている場合には、物理ページを再度割り当てる必要はない。
【０２００】
続いて、Ｉ／Ｏプログラム５０は、ステップＳ７８と同様にして、処理対象データをライト先仮想ページに割り当てられた物理ページ（対応する記憶デバイス２０）に上書きし（Ｓ８０）、この後、このデステージ処理を終了する。
【０２０１】
（４−７）ガベージコレクション処理
他方、図１９は、ガベージコレクションプログラム５３により定期的に実行されるガベージコレクション処理の処理手順を示す。ガベージコレクションプログラム５３は、この処理手順に従って、プールに格納されたガベージを定期的に廃棄し、ガベージに使用されていた記憶領域を回収する。
【０２０２】
実際上、ガベージコレクションプログラム５３は、この図１９に示すガベージコレクション処理を開始すると、まず、ガベージ管理テーブル４７（図１０）を参照して、ガベージの登録があるか否かを判断する（Ｓ９０）。そしてガベージコレクションプログラム５３は、この判断で肯定結果を得るとガベージ管理テーブル４７に登録されたガベージを１つ選択する（Ｓ９１）。
【０２０３】
続いて、ガベージコレクションプログラム５３は、ガベージ管理テーブル４７におけるステップＳ９１で選択したガベージが格納されている物理ページの物理ページ番号及びその物理ページが属するプールのプール番号をそれぞれ特定する（Ｓ９２）。
【０２０４】
具体的に、ガベージコレクションプログラム５３は、ガベージ管理テーブル４７を参照して、ステップＳ９１で選択したガベージに対応するレコードのＰＡ欄４７Ａに格納されたＰＡ及び長さ欄４７Ｂに格納されたデータ長を取得する。ここでは、かかるＰＡとして「ＰＡ２」という値が得られたものとして説明する。そしてガベージコレクションプログラム５３は、次式
【数５】
2019128906.tif 000007
で与えられる演算を実行し、その演算結果に基づいて、そのガベージが格納されている追書きページのページ番号（追書きページ番号）を算出する。またガベージコレクションプログラム５３は、追書き空間マッピングテーブル４３（図７）のレコードのうち、このとき算出した追書きページ番号が追書きページ番号欄に格納されているレコードの物理ページ番号欄４３Ｂ及びプール番号欄４３Ｃにそれぞれ格納されている物理ページ番号及びプール番号を取得する。この物理ページ番号がステップＳ９１で選択したガベージが格納されている物理ページの物理ページ番号であり、このプール番号がその物理ページが属するプールのプール番号である。
【０２０５】
続いて、ガベージコレクションプログラム５３は、ステップＳ９２で特定した物理ページ番号及びプール番号に基づいて、ステップＳ９１で選択したガベージが格納されている記憶デバイス２０のデバイス番号と、その記憶デバイス２０内のそのガベージが格納されている記憶領域のアドレスとをページ管理テーブル４０（図４）から取得する（Ｓ９３）。具体的に、ガベージコレクションプログラム５３は、ページ管理テーブル４０のレコードの中から、ステップＳ９２で特定した物理ページ番号が物理ページ番号欄４０Ａ（図４）に格納されているレコードを特定し、そのレコードのデバイス番号欄４０Ｂ（図４）に格納されているデバイス番号と、そのレコードのアドレス欄４０Ｃ（図４）に格納されているアドレスとを取得する。
【０２０６】
次いで、ガベージコレクションプログラム５３は、ステップＳ９３で取得したデバイス番号が付与された記憶デバイス２０内の、ステップＳ９３で取得したアドレスに格納されたデータ（ガベージ）を削除するようその記憶デバイス２０を制御する（Ｓ９４）。なお、このとき削除されるデータ（ガベージ）のデータ長は、ガベージ管理テーブル４７（図１０）におけるステップＳ９１で選択したガベージに対応するレコードの長さ欄４７Ｂ（図１０）に格納されているデータ長である。
【０２０７】
またガベージコレクションプログラム５３は、ガベージ管理テーブル４７におけるステップＳ９１で選択したガベージに対応するレコードの情報を削除すると共に（Ｓ９５）、追書き上書き条件管理テーブル４８（図１１）における対応するプールのレコードのガベージ量欄４８Ｄ（図１１）に格納されている値を、そのときステップＳ９１で選択したガベージのデータ量を減算した値に更新する（Ｓ９６）。
【０２０８】
そしてガベージコレクションプログラム５３は、この後、ステップＳ９０に戻って、ステップＳ９０において否定結果を得るまでステップＳ９０〜ステップＳ９６の処理を繰り返す。そしてガベージコレクションプログラム５３は、やがてガベージ管理テーブル４７（図１０）に登録されたすべてのガベージについてステップＳ９２〜ステップＳ９６の処理を実行し終えることによりステップＳ９０で肯定結果を得ると、このガベージコレクション処理を終了する。
【０２０９】
（５）本実施形態の効果
以上のように本ストレージ装置１では、対象となるチャンクの更新後の圧縮チャンクのデータサイズが当該チャンクの更新前の圧縮チャンクのデータサイズ以下であり、かつ、対象プールにおけるガベージ量が多い場合（追書き上書き条件の「条件１」）や、対象となるチャンクの更新後の圧縮チャンクのデータサイズが当該チャンクの更新前の圧縮チャンクのデータサイズ以下であり、かつ、対象プールの使用量が一定以上の場合（追書き上書き条件の「条件２」）には、更新後のそのチャンクの圧縮チャンクが追書き空間に格納されている更新前のそのチャンクの圧縮チャンクに上書きする。
【０２１０】
従って、本ストレージ装置１によれば、データ更新時のガベージの発生を抑制することができ、その結果としてガベージの増加に起因するプールの枯渇を抑制することができる。かくするにつき、ガベージコレクション処理の実行周期に対してデータ更新の頻度が多い場合においてもホスト２からのＩ／Ｏが受付制限される事態の発生を抑制することができ、かくしてガベージの発生に起因するプールの枯渇を防止しながら、ホストから見たストレージ装置の応答性能の低下をも防止することができる。
【０２１１】
なお、対象となるチャンクの更新後の圧縮チャンクのデータサイズが当該チャンクの更新前の圧縮チャンクのデータサイズ以下である場合には、常に、更新後のデータの圧縮チャンクを追書き空間に移動された更新前の当該データの圧縮チャンクに上書きする方法も考えられる。
【０２１２】
しかしながら、このような方法によると、更新前のデータの圧縮チャンク上に上書きされた更新後のデータの圧縮チャンクが追書き空間上に点在することとなり、追書き空間上のデータをシーケンシャルに記憶デバイス２０に格納できなくなるおそれがある。そして、このような場合、追書き空間に格納されたデータについてはシーケンシャルに記憶デバイス２０に格納することにより、記憶デバイス２０に対するデータのリード／ライト速度を向上させ得るという、追書き空間を導入したことにより得られる効果を得難くなる。
【０２１３】
そこで、本実施形態においては、上述したように上記の追書き上書き条件を満たす場合に限り追書き空間上での上書きを許容しており、これにより追書き空間に格納されたデータの記憶デバイス２０へのリード／ライト速度が低下するのを可能な限り抑制することができる。
【０２１４】
また本ストレージ装置１では、仮想ボリューム上の領域に対する最初のデータライトの際にはインライン方式（同期方式）でデータのライト処理を行い、その領域に対する２回目以降のデータライトの際にはポストプロセス方式（非同期方式）でデータのライト処理を行う。従って、本ストレージ装置１によれば、基本的にストレージ装置１に用意すべき記憶容量が圧縮・重複排除処理後のデータ量だけでよく、例えば、ストレージ装置の切り替え時などにおいて、新たなストレージ装置１に事前に用意しておくべき記憶容量を少なくすることができるため、新たなストレージ装置１の導入コストを抑制できるという効果をも得ることができる。
【０２１５】
さらに本ストレージ装置１では、圧縮機能付きの記憶デバイス２０を搭載しており、圧縮機能付きの記憶デバイス２０に格納されるデータであって追書き空間に移動されたデータ（圧縮されていないデータ）が常に上述した追書き上書き条件の（条件１）及び（条件２）における「対象となるチャンクの更新後の圧縮チャンクのデータサイズが当該チャンクの更新前の圧縮チャンクのデータサイズ以下」という条件を満たすことになるため、当該データが追書き上書き条件を満たす可能性が高くなり、その分更新後のそのデータが追書き空間において更新前のそのデータに上書きされる可能性が高くなる。かくするにつき、追書き空間内及びプール内の更新前のそのデータがガベージとなるのを抑制することができ、その分、より一層とガベージの発生に起因するプールの枯渇を防止しながら、ホストから見たストレージ装置の応答性能の低下を防止することができる。
【０２１６】
（６）他の実施形態
以上、本発明の実施形態を説明したが、これらは本発明の説明のための例示であって、本発明の範囲を本実施形態に飲み限定する趣旨ではない。すなわち、本発明は、他の種々の形態でも実施することが可能である。例えば、上述の実施形態においては、ローカルメモリ１４及びキャッシュメモリ１５という２種類のメモリを有する場合について述べたが、本発明はこれに限らず、ローカルメモリ１４及びキャッシュメモリ１５のうち、いずれか一方だけを有するようにストレージ装置１を構成するようにしてもよい。その場合、すべての情報がそのローカルメモリ又はキャッシュメモリに格納される。
【０２１７】
また上述の実施形態においては、ストレージ装置１が使用する幾つかの情報をテーブル構造（図４〜図１１参照）で管理するようにした場合について述べたが、本発明はこれに限らず、テーブル以外のデータ構造、例えばリスト構造などを用いて情報を管理するようにしてもよい。
【０２１８】
さらに上述の実施形態においては、本発明を圧縮機能及び重複排除機能の双方が搭載されたストレージ装置１に適用するようにした場合について述べたが、本発明はこれに限らず、圧縮機能のみを搭載するストレージ装置にも適用することができる。
【０２１９】
さらに上述の実施形態においては、プール使用量閾値をプールの全容量の一定割合（例えば80％）とするようにした場合について述べたが、本発明はこれに限らず、例えば、プールの容量に係わりなく一定容量をプール使用量閾値として設定するようにしてもよく、プール使用量閾値の設定方法としては、この他種々の設定方法を広く適用することができる。
【産業上の利用可能性】
【０２２０】
本発明はストレージ装置及びその制御方法に関し、データの圧縮・重複排除機能が搭載された種々の構成のストレージ装置に広く適用することができる。
【符号の説明】
【０２２１】
１……ストレージ装置、２……ホスト、１０……ストレージコントローラ、１３……ＣＰＵ、１４……ローカルメモリ、１５……キャッシュメモリ、２０……記憶デバイス、４０……ページ管理テーブル、４１……プール管理テーブル、４２……仮想ボリューム管理テーブル、４３……追書き空間マッピングテーブル、４４……ＬＰ変換テーブル、４７……ガベージ管理テーブル、４８……追書き上書き条件管理テーブル。
【図１】
2019128906.tif 000008
【図２】
2019128906.tif 000009
【図３】
2019128906.tif 000010
【図４】
2019128906.tif 000011
【図５】
2019128906.tif 000012
【図６】
2019128906.tif 000013
【図７】
2019128906.tif 000014
【図８】
2019128906.tif 000015
【図９】
2019128906.tif 000016
【図１０】
2019128906.tif 000017
【図１１】
2019128906.tif 000018
【図１２】
2019128906.tif 000019
【図１３】
2019128906.tif 000020
【図１４】
2019128906.tif 000021
【図１５Ａ】
2019128906.tif 000022
【図１５Ｂ】
2019128906.tif 000023
【図１６】
2019128906.tif 000024
【図１７】
2019128906.tif 000025
【図１８】
2019128906.tif 000026
【図１９】
2019128906.tif 000027