(57)【要約】  本発明の一観点に係るストレージ装置は、ホストからのライトデータの重複排除処理を行うよう構成されている。ストレージ装置は重複排除処理のために、ライトデータの特徴量を算出し、この特徴量とライトデータの格納位置情報の組であるメタデータを管理領域に記録している。ただし、ストレージ装置は管理領域に格納されるメタデータの量が多くなることを防ぐために、ライトデータがあらかじめ定められた条件に該当する場合、重複排除処理を行わず、そのライトデータに係るメタデータの作成を抑制する。
2017141315.tif 000002
【特許請求の範囲】
【請求項１】
ホストから書き込み要求のあったライトデータを格納するための１以上の記憶デバイスと、ストレージコントローラと、を有するストレージ装置において、
前記ストレージコントローラは、前記ホストから前記ライトデータを受領すると、前記ライトデータと同一のデータが前記記憶デバイスに格納済みの場合、前記ライトデータを前記記憶デバイスに格納しないように構成されており、
前記ストレージコントローラはまた、前記ライトデータの特徴量を算出し、前記ライトデータの特徴量と前記ライトデータの格納位置情報の組であるメタデータを管理領域に記録し、前記ライトデータと同一のデータが前記記憶デバイスに格納済みか判定するために、前記メタデータを用いるように構成されており、
前記ストレージコントローラは、前記ライトデータがあらかじめ定められた条件に該当する場合、前記メタデータを前記管理領域に記録しない、
ことを特徴とする、ストレージ装置。
【請求項２】
前記ストレージコントローラは、
前記管理領域に記録された前記メタデータの量が規定値を超過した場合、前記メタデータのうち、前記メタデータに含まれる前記特徴量が他のメタデータと重複しないメタデータを、前記管理領域から削除する、
ことを特徴とする、請求項１に記載のストレージ装置。
【請求項３】
前記ストレージコントローラは所定の条件を満たした時、
前記管理領域に前記メタデータが記録されなかった前記ライトデータあるいは前記メタデータの削除が行われた前記ライトデータについて、前記メタデータの作成を行う、
ことを特徴とする、請求項２に記載のストレージ装置。
【請求項４】
前記ストレージコントローラは、前記管理領域から前記メタデータを削除した回数及び前記管理領域に前記メタデータを記録しなかった回数の和と、前記管理領域に前記メタデータを記録した回数と、を管理しており、
前記ストレージコントローラは、前記管理領域に前記メタデータを記録した回数が、前記メタデータを削除した回数と前記メタデータを記録しなかった回数の和を超過したことを契機に、前記管理領域に前記メタデータが記録されなかった前記ライトデータあるいは前記メタデータの削除が行われた前記ライトデータについて、前記メタデータの作成を行って前記管理領域に記録する、
ことを特徴とする、請求項３に記載のストレージ装置。
【請求項５】
前記ストレージコントローラは、前記ライトデータを圧縮して、前記記憶デバイスに格納する、
ことを特徴とする、請求項１に記載のストレージ装置。
【請求項６】
前記ストレージコントローラは、前記ホストに対してボリュームを提供し、前記ホストからの前記ライトデータの書き込み要求で指定された前記ボリューム上の前記格納位置に動的に前記記憶デバイスの第１記憶領域を割り当て、前記第１記憶領域に前記ライトデータを格納し、
前記ストレージコントローラはさらに、前記第１記憶領域から前記ライトデータを読み出して圧縮することで圧縮データを生成し、前記圧縮データを前記記憶デバイスの第２記憶領域に格納した後、前記ボリューム上の前記格納位置を、前記第１記憶領域の割り当てられていない状態に変更する、
ことを特徴とする、請求項５に記載のストレージ装置。
【請求項７】
前記ストレージコントローラは、前記第１記憶領域から前記ライトデータを読み出した際に、前記ライトデータの特徴量を算出し、
前記管理領域に、前記算出された特徴量が記録されていない場合、前記圧縮データを前記第２記憶領域に格納し、
前記ライトデータが、前記圧縮データの格納された前記第２記憶領域上位置に格納されていることを示す情報を、マッピング情報に記録する、
ことを特徴とする、請求項６に記載のストレージ装置。
【請求項８】
前記管理領域に、前記算出された特徴量が記録されている場合、前記ライトデータと前記第２記憶領域に格納されているデータとの比較を行い、
前記ライトデータと同一のデータが前記第２記憶領域に格納されている場合、前記マッピング情報に、前記ライトデータが、前記同一のデータの格納された前記第２記憶領域上位置に格納されている旨の情報を記録する、
ことを特徴とする、請求項７に記載のストレージ装置。
【請求項９】
前記あらかじめ定められた条件は、前記ライトデータの圧縮率が所定値よりも大きいことである、
ことを特徴とする、請求項５に記載のストレージ装置。
【請求項１０】
ホストから書き込み要求のあったライトデータを格納するための１以上の記憶デバイスと、ストレージコントローラと、を有するストレージ装置において、
前記ストレージコントローラは、前記ホストから前記ライトデータを受領すると、前記ライトデータと同一のデータが前記記憶デバイスに格納済みの場合、前記ライトデータを前記記憶デバイスに格納しないように構成されており、
前記ストレージコントローラはまた、前記ライトデータの特徴量を算出し、前記ライトデータの特徴量と前記ライトデータの格納位置情報の組であるメタデータを管理領域に記録し、前記ライトデータと同一のデータが前記記憶デバイスに格納済みか判定するために、前記メタデータを用いるように構成されており、
前記ストレージコントローラは、前記管理領域に記録された前記メタデータの量が規定値を超過した場合、前記メタデータのうち、前記メタデータに含まれる前記特徴量が他のメタデータと重複しないメタデータを、前記管理領域から削除する、
ことを特徴とする、ストレージ装置。
【請求項１１】
前記ストレージコントローラは所定の条件を満たした時、
前記メタデータの削除が行われた前記ライトデータについて、前記メタデータの再作成を行う、
ことを特徴とする、請求項１０に記載のストレージ装置。
【請求項１２】
前記ストレージコントローラは、前記管理領域から前記メタデータを削除した回数と、前記管理領域に前記メタデータを記録した回数と、を管理しており、
前記ストレージコントローラは、前記管理領域に前記メタデータを記録した回数が、前記メタデータを削除した回数を超過したことを契機に、前記メタデータの削除が行われた前記ライトデータの前記メタデータを作成し、前記管理領域に記録する、
ことを特徴とする、請求項１１に記載のストレージ装置。
【請求項１３】
プロセッサとメモリと記憶デバイスを有するコンピュータの前記プロセッサに、
ライトデータの書き込み要求を受領すると、前記ライトデータと同一のデータが前記記憶デバイスに格納済みの場合、前記ライトデータを前記記憶デバイスに格納しない処理と、
前記ライトデータの特徴量を算出し、前記ライトデータの特徴量と前記ライトデータの格納位置情報の組であるメタデータを前記メモリ内の管理領域に記録し、前記メタデータを用いて、前記ライトデータと同一のデータが前記記憶デバイスに格納済みか判定する処理を実行させ、
さらに前記プロセッサに、前記ライトデータがあらかじめ定められた条件に該当する場合、前記メタデータを前記管理領域に記録しないと決定させる、
プログラムが記録された記憶媒体。
【請求項１４】
前記プロセッサに、
前記管理領域に記録された前記メタデータの量が規定値を超過した場合、前記メタデータのうち、前記メタデータに含まれる前記特徴量が他のメタデータと重複しないメタデータを、前記管理領域から削除させる、
請求項１３に記載のプログラムが記録された記憶媒体。
【請求項１５】
前記プロセッサに、
所定の条件を満たした場合に、前記管理領域に前記メタデータが記録されなかった前記ライトデータあるいは前記メタデータの削除が行われた前記ライトデータについて、前記メタデータの作成を行わせる、
請求項１４に記載のプログラムが記録された記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージ装置に関する。
【背景技術】
【０００２】
ストレージ装置は、データを格納する複数の記憶デバイスと、記憶デバイスを制御するストレージコントローラとを有しており、ホスト計算機に大容量のデータ格納空間を提供することを目的としている。【０００３】
ストレージ装置には、低コストで大量のデータを保存することが求められる。こうした要求を満たすために、データを可逆圧縮（以降、単に圧縮と記す）して記録する技術が知られている。圧縮によりデータサイズを縮小してから記憶デバイスに記録すると、データを圧縮せずに記憶デバイスに記録するよりも多くのデータをストレージ装置に格納できる。そのため、データの保持コスト（記憶媒体のビットコスト、ストレージ装置の消費電力コスト等）を削減できる。【０００４】
格納すべきデータ量を削減するもう一つの技術として、重複排除技術がある。たとえばストレージ装置に同内容のデータが複数個存在していることをストレージ装置が検出した時、そのうちの１つだけをストレージ装置内の記憶デバイスに残し、残りのデータは記憶デバイスに格納しないようにする技術である。【０００５】
圧縮技術と重複排除技術は併用可能である。たとえば特許文献１には、上位装置から転送されてきたデータの中で重複しているデータについては重複排除処理を行い、重複排除の行われなかったデータを圧縮するストレージ装置が開示されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特許５２１６９１５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
同一データの有無を判定するために、複数のデータをバイトあるいはビットごとに比較すると処理時間が長くなる。そのため、重複排除技術では、ハッシュ関数などを用いてデータの特徴量（ハッシュ値等）を算出し、算出されたハッシュ値を同一データの有無の判定に用いることがある。これは、データから算出される特徴量（ハッシュ値等）は、数バイト程度のサイズなので、特徴量同士を比較するほうが、より高速に異同の判定ができるからである。そのため、特許文献１に開示されているストレージ装置においても、重複判定にハッシュ値が用いられている。【０００８】
具体的には、ストレージ装置は、記憶デバイスに格納済みのデータの格納位置（アドレス）と、そのデータのハッシュ値をハッシュテーブル等の管理情報に格納して保持している。新たなデータがストレージ装置に書き込まれると、ストレージ装置はこのデータのハッシュ値を算出し、算出されたハッシュ値が既にハッシュテーブルに存在するかを判定する。【０００９】
ハッシュテーブルのような管理情報の量（サイズ）は、ストレージ装置に格納されるデータ量に比例して大きくなる。ストレージ装置のアクセス性能の観点から、管理情報はたとえばキャッシュメモリ等の、アクセス性能の高い記憶領域に格納されることが望ましい。ただし管理情報の量が増加すると、管理情報をアクセス性能の高い記憶領域に保持することが難しくなる。
【課題を解決するための手段】
【００１０】
本発明の一観点に係るストレージ装置は、ホストからのライトデータの重複排除処理を行うよう構成されており、重複排除処理のために、ライトデータの特徴量とこのライトデータの格納位置情報の組であるメタデータを管理領域に記録している。ただしライトデータがあらかじめ定められた条件に該当する場合、そのライトデータに係るメタデータの作成を行わない。
【発明の効果】
【００１１】
本発明の一観点に係るストレージ装置によれば、重複排除処理で必要となる管理情報のサイズを抑制することができる。
【図面の簡単な説明】
【００１２】
【図１】実施例に係るストレージ装置を含む、計算機システムの構成例である。
【図２】仮想ボリュームとページの関係を表した図である。
【図３】管理情報の一覧である。
【図４】ページ管理テーブルの構成例である。
【図５】プール管理情報の構成例である。
【図６】仮想ボリューム管理テーブルの構成例である。
【図７】追書き空間マッピングテーブルの構成例である。
【図８】論理物理変換テーブルの構成例である。
【図９】ＦｉｎｇｅｒＰｒｉｎｔ  Ｍａｔｃｈ  Ｑｕｅｕｅ及びＦｉｎｇｅｒＰｒｉｎｔ  Ｔａｂｌｅ  Ｄｉｒｅｃｔｏｒｙの構成例である。
【図１０】ストレージ装置の有するプログラムの一覧である。
【図１１】リード処理のフローチャートである。
【図１２】ライト処理のフローチャートである。
【図１３】バッファ更新プログラムのフローチャートである。
【図１４】重複排除プログラムのフローチャート（１）である。
【図１５】重複排除プログラムのフローチャート（２）である。
【図１６】追書き空間に追記する処理のフローチャートである。
【図１７】デステージ処理のフローチャートである。
【図１８】メタデータ削減プログラム２０００のフローチャート（１）である。
【図１９】メタデータ削減プログラム２０００のフローチャート（２）である。
【図２０】メタデータ再作成プログラム３０００のフローチャート（１）である。
【図２１】メタデータ再作成プログラム３０００のフローチャート（２）である。
【発明を実施するための形態】
【００１３】
以下、幾つかの実施例について、図面を用いて説明する。
【００１４】
なお、以下の実施例において、ストレージ装置内で実行される処理について、「プログラム」を主語として説明を行う場合がある。実際には、ストレージ装置が有するプロセッサ（ＣＰＵ）がプログラムを実行することによって、プログラムに記述された処理が行われるため、処理の主体はプロセッサ（ＣＰＵ）であるが、説明が冗長になることを防ぐため、プログラムを主語にして処理の内容を説明することがある。また、プログラムの一部または全ては専用ハードウェアによって実現されてもよい。また、以下で説明される各種プログラムは、プログラム配布サーバや計算機が読み取り可能な記憶メディアによって提供され、プログラムを実行する各装置にインストールされてもよい。計算機が読み取り可能な記憶メディアとは、非一時的なコンピュータ可読媒体で、例えばＩＣカード、ＳＤカード、ＤＶＤ等の不揮発性記憶媒体である。
【００１５】
実施例の説明に入る前に、実施例で用いられる各種用語について説明する。
【００１６】
本明細書において、「圧縮」とはＬＺＷアルゴリズム等の可逆圧縮アルゴリズムを用いて、データの意味を保ったままデータサイズを縮小する処理のことを意味する。本実施例に係るストレージ装置では、ホストからストレージ装置に対して書き込まれるデータの圧縮を行うことがある。ストレージ装置で圧縮処理が行われたことによりサイズの縮小されたデータのことを、「圧縮データ」と呼び、ストレージ装置で圧縮処理が施されていないデータの事を「非圧縮データ」と呼ぶ。また可逆圧縮アルゴリズムを用いて、圧縮データを元のデータサイズに戻す処理のことを、「伸長」と呼ぶ。
【００１７】
また以下で説明する実施例では、データ圧縮によるデータの縮小効率の指標として、「圧縮率」を用いる。実施例における圧縮率は、以下の計算式により定義されるものである。
圧縮率＝（非圧縮データのサイズ−圧縮データのサイズ）÷非圧縮データのサイズ
【００１８】
以下の実施例では、「圧縮率が低い」、「圧縮率が高い」等の表現が用いられるが、その場合の圧縮率は、上の計算式により定義されるものである。そのため圧縮後のデータについて、「圧縮率が低い」または「圧縮率が小さい」と表現される場合、圧縮によりデータがあまり縮小されなかったことを意味する。一例として圧縮処理の結果、データサイズが全く変化しなかった場合には、圧縮率は０となる。逆に「圧縮率が高い」とは、圧縮によるデータ縮小量が多いことを意味する。
【００１９】
「ボリューム」とは、ストレージ装置や記憶デバイス等のターゲットデバイスが、ホスト計算機等のイニシエータデバイスに提供する記憶空間のことを意味する。イニシエータデバイスが記憶空間上のある位置（アドレス）に対するデータの書き込み要求を発行すると、そのアドレスに割り当てられている記憶領域にデータが格納される。本実施例に係るストレージ装置はボリュームとして、いわゆるＴｈｉｎ  Ｐｒｏｖｉｓｉｏｎｉｎｇ技術により形成される仮想ボリュームをホストに提供する。仮想ボリュームは、その初期状態（仮想ボリュームが定義された直後）では、仮想ボリューム上の各アドレスに記憶領域が割り当てられていない。ストレージ装置は、イニシエータデバイス（ホスト）から記憶空間上のアドレスに対するデータ書き込み要求を受領した時点で、そのアドレスに割り当てられるべき記憶領域を動的に決定する。
【００２０】
「ブロック」とは、ボリューム上の領域を意味する。また、以下で説明する実施例では、ブロックはイニシエータデバイスがボリュームにアクセスする時の最小アクセス単位と等しいサイズの領域で、固定長である。ブロックのサイズは一例として５１２バイトである。イニシエータデバイスがボリューム上の領域にアクセスする際には、各ブロックにアサインされているアドレスを指定することでアクセスする。このアドレスは、「Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓ（ＬＢＡ）」と呼ばれる。ボリュームの先頭ブロックのＬＢＡが０で、それ以降のブロックには順に１，２，．．．の連続番号が付される。また、以下の実施例では、ストレージ装置はボリューム上の領域を特定するアドレスとして、ＬＢＡ以外のアドレスを用いることがある。これについては、実施例中で説明する。
【００２１】
「重複排除処理」とは、ストレージ装置内に同内容のデータが複数存在する場合、１つだけをストレージ装置に残し、それ以外のデータをストレージ装置から削除する処理である。ストレージ装置内に同内容のデータが存在するか判定する処理のことを、「重複判定」処理と呼ぶ。なお、特に断りのない限り、重複排除処理は重複判定処理を含む処理である。
【００２２】
以下で説明する実施例に係るストレージ装置では、チャンクと呼ばれる所定サイズのデータ毎に重複判定を行う。以下の実施例では、チャンクのサイズが８ＫＢの例について説明されるが、チャンクのサイズは８ＫＢ以外のサイズであってもよい。同内容のデータ（またはチャンク）のことを「重複データ（または重複チャンク）」と呼ぶ。
【００２３】
重複判定の際、２つのデータをビット単位あるいはバイト単位で比較すると、判定処理に長時間を要することになる。そのため一般的には重複判定を行う装置は、比較対象のデータに所定の演算（たとえばハッシュ関数を用いた演算等）を行うことで、小サイズ（たとえば８バイト程度）の特徴量を生成し、それを用いて重複判定を行う。以下の実施例では、データから生成される特徴量のことを、「ＦｉｎｇｅｒＰｒｉｎｔ  Ｋｅｙ」と呼ぶ。ＦｉｎｇｅｒＰｒｉｎｔ  Ｋｅｙは、ＦＰＫと略記されることもある。
【００２４】
以下で説明する実施例では、データＡから算出されたＦＰＫの値がＨであった場合、値ＨはデータＡのＦＰＫと呼ばれる。逆にデータＡのことを、「ＦＰＫ  Ｈを持つデータ」と呼ぶことがある。
【００２５】
「重複排除の範囲」とは、重複データの有無を判定する時のデータの探索範囲のことを意味する。たとえば重複排除の範囲が「ストレージ装置」の場合、ストレージ装置はデータＡと同一のデータが存在するか判定する際に、データＡとストレージ装置内の全データとを比較する。一方、重複排除の範囲がストレージ装置内の一部の記憶デバイス（ここではこれを「記憶グループ」と呼ぶ）に限定されている場合、ストレージ装置は重複データの有無を判定する際に、記憶グループ内のデータのみの中から重複データの有無を検索する。
【００２６】
記憶領域の「更新」とは、記憶領域に格納されているデータの内容を新しい内容に書き換える（上書きする）ことを意味する。ある記憶領域が更新される前に、その記憶領域に格納されていたデータは、「更新前データ」と呼ばれる。一方その記憶領域に新たに書き込まれるデータのことは、「更新データ」または「更新後データ」と呼ばれる。
【００２７】
「追書き（ａｐｐｅｎｄ  ｗｒｉｔｅ）」または「追記（ａｐｐｅｎｄ）」とは、データを記憶領域の未使用領域に対してシーケンシャルに書き込む動作のことを意味する。以下の実施例におけるストレージ装置では、追書き用の記憶領域が設けられる。ストレージ装置が追書き処理を行う場合、追書き用の記憶領域の先頭から順にデータを書き込んでいく。ストレージ装置は、直前に行われた追書き処理でデータが書き込まれた終端アドレスを記憶しており、追書き処理を行う際には、この終端アドレスの次のアドレスから、データを書き込む。
【実施例１】
【００２８】
（１）システム構成
図１は、第１の実施例に係るストレージ装置１を含む計算機システムの構成例を示している。ストレージ装置１は、ストレージコントローラ１０と、ストレージコントローラ１０に接続された複数の記憶デバイス２０を有する。【００２９】
記憶デバイス２０は、ストレージ装置１がホスト２などの上位装置からのライトデータを記憶するために用いられる。記憶デバイスとしては、たとえば磁気ディスクを記憶媒体として用いるＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）２２や、フラッシュメモリ等の不揮発性半導体メモリを記憶媒体として採用したＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）２１が用いられる。記憶デバイス２０は一例として、ＳＡＳ（Ｓｅｒｉａｌ  Ａｔｔａｃｈｅｄ  ＳＣＳＩ）規格に従う伝送線（ＳＡＳリンク）や、ＰＣＩ（Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ）規格に従う伝送線（ＰＣＩリンク）などによって、ストレージコントローラ１０と接続される。【００３０】
ストレージコントローラ１０には、１以上のホスト２が接続される。またストレージコントローラ１０には、管理ホスト５が接続される。ストレージコントローラ１０とホスト２とは、一例としてファイバチャネルを用いて形成されるＳＡＮ（Ｓｔｏｒａｇｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）３を介して接続される。ストレージコントローラ１０と管理ホスト５とは、一例としてイーサネットを用いて形成されるＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）６を介して接続される【００３１】
ストレージコントローラ１０は少なくとも、プロセッサ（ＣＰＵとも呼ばれる）１１、ホストインタフェース（「ホストＩ／Ｆ」とも呼ばれる）１２、デバイスインタフェース（「デバイスＩ／Ｆ」とも呼ばれる）１３、キャッシュメモリ１４、管理用Ｉ／Ｆ１５、ローカルメモリ１６を有する。そしてＣＰＵ１１、ホストＩ／Ｆ１２、デバイスＩ／Ｆ１３、キャッシュメモリ１４、管理用Ｉ／Ｆ１５は、内部スイッチ（内部ＳＷとも呼ばれる）１７を介して相互接続されている。図１ではこれらの構成要素がそれぞれ１つだけ示されているが、高性能化及び高可用性の確保のため、これらの構成要素のそれぞれがストレージコントローラ１０内に複数搭載されていてもよい。また内部ＳＷ１７ではなく、共通バスを介して各構成要素が相互接続された構成にしてもよい。【００３２】
デバイスＩ／Ｆ１３は少なくとも、インタフェースコントローラと転送回路を有する。インタフェースコントローラは、記憶デバイス２０で用いられているプロトコル（一例ではＳＡＳ）をストレージコントローラ１０内部で用いられている通信プロトコル（一例としてＰＣＩ−Ｅｘｐｒｅｓｓ）に変換するためのコンポーネントである。転送回路は、ストレージコントローラ１０が、記憶デバイス２０に対してデータの転送（リード、ライト）を行う際に用いられる。【００３３】
ホストＩ／Ｆ１２は、デバイスＩ／Ｆ１３と同様に、少なくともインタフェースコントローラと転送回路を有する。ホストＩ／Ｆ１２が有するインタフェースコントローラは、ホスト２とストレージコントローラ１０間のデータ転送経路で用いられている通信プロトコル（たとえばファイバチャネル）と、ストレージコントローラ１０内部で用いられている通信プロトコルを変換するためのものである。【００３４】
ＣＰＵ１１は、ストレージ装置１の各種制御を行う。ローカルメモリ１６には、ＣＰＵ１１が実行するプログラム（ストレージ制御プログラムと呼ぶ）が格納される。またＣＰＵ１１は、データの圧縮処理を行う際に、ローカルメモリ１６上の記憶領域の一部を、一種の作業用領域として使用する。ローカルメモリ１６には、ＤＲＡＭ、ＳＲＡＭ等の揮発性記憶媒体が用いられるが、別の実施形態として、不揮発性メモリが用いられてもよい。【００３５】
キャッシュメモリ１４は、記憶デバイス２０に対するＩ／Ｏ対象データを一時的に記憶するために用いられる。またＣＰＵ１１が使用する、ストレージ装置１の各種管理情報を記憶するために用いられる。キャッシュメモリ１４には、ＤＲＡＭ、ＳＲＡＭ等の揮発性記憶媒体が用いられるが、別の実施形態として、不揮発性メモリを用いてキャッシュメモリ１４を構成してもよい。また、キャッシュメモリ１４に揮発性記憶媒体が用いられる場合、ストレージ装置１にバッテリ等の補助電源を搭載し、停電時にキャッシュメモリ１４の記憶内容を維持できるように構成されていてもよい。【００３６】
本実施例に係るストレージ装置１において、ＣＰＵ１１は、ローカルメモリ１６とキャッシュメモリ１４の何れにもアクセス可能に構成されている。ただしＣＰＵ１１がキャッシュメモリ１４にアクセスする際、内部スイッチ１７を経由してアクセスすることになる。そのため、ＣＰＵ１１がキャッシュメモリ１４にアクセスした時の応答時間は、ＣＰＵ１１がローカルメモリ１６にアクセスした時の応答時間よりも長くなる。【００３７】
管理ホスト５は、ストレージ装置１の管理操作を行うための計算機である。管理ホスト５は、キーボードやディスプレイ等の入出力デバイス（非図示）を備え、ユーザ（管理者）は入出力デバイスを用いてストレージ装置１に対する設定指示を行うことができる。また管理ホスト５は、ストレージ装置１の状態等の情報をディスプレイ等の出力デバイスに表示することもできる。【００３８】
本実施例に係るストレージ装置１は、記憶デバイス２０に格納されるデータを圧縮することができる。データの圧縮は、ＣＰＵ１１が実行する（ＣＰＵ１１でデータ圧縮を行うためのプログラムコードが実行されることで、圧縮が行われる）。ただし別の実施形態として、ストレージコントローラ１０にデータ圧縮を行う専用のハードウェアを設け、ストレージコントローラ１０がこのハードウェアを用いてデータ圧縮を行うように構成されていてもよい。【００３９】
（２）記憶領域の管理
続いて、本実施例に係るストレージ装置１が管理する記憶領域について説明する。本実施例に係るストレージ装置１が有する１以上の記憶デバイス２０は、所定サイズの記憶空間をストレージコントローラ１０に提供する。ただしストレージコントローラ１０は、記憶デバイス２０の提供する記憶空間を直接ホスト２には提供しない。ストレージコントローラ１０はホスト２に、記憶デバイス２０の提供する記憶空間とは異なる、１以上の仮想的な記憶空間を提供する。この仮想的な記憶空間を「仮想ボリューム」と呼ぶ。また、仮想ボリューム（ホスト２に提供される記憶空間）のことを、「上書き空間」と呼ぶこともある。【００４０】
仮想ボリュームは、公知のＴｈｉｎ  Ｐｒｏｖｉｓｉｏｎｉｎｇ技術を用いて形成されるボリュームである。ストレージ装置１は、ホスト２から仮想ボリューム上の領域に対するアクセス要求を受け付けた時点で、その領域に記憶デバイス２０の記憶領域を割り当てる（マップする）。【００４１】
本実施例では、ストレージ装置１が有する複数の記憶デバイス２０のうち、仮想ボリュームに割り当てることができる記憶デバイス２０を「プール」という管理単位に所属させる。ストレージ装置１は、プールに所属する記憶デバイス２０の記憶空間を、所定サイズ（一例として４２ＭＢ）の部分領域に分割して管理する。本実施例では、この部分領域のことを「ページ」または「物理ページ」と呼ぶ。なお、ストレージ装置１内にプールは複数設けられて良い。各プールにはストレージ装置１内で一意な識別番号が付されており、この識別番号はプール番号（プール＃）と呼ばれる。またプール＃がｋのプールは、「プール＃ｋ」と表記される。【００４２】
ストレージ装置１が仮想ボリュームに記憶デバイス２０の記憶領域を割り当てる時、ページ毎に割り当てる。そのためストレージ装置１は、仮想ボリュームもページと同サイズの領域に分割して管理する。仮想ボリューム上の、ページと同サイズの領域のことは、「仮想ページ」または「上書きページ」と呼ばれる。なお、本実施例では仮想ページのサイズが４２ＭＢの場合の例を説明するが、仮想ページのサイズはこれ以外のサイズでもよい。【００４３】
ホスト２が仮想ボリュームにアクセスする時、ホスト２はストレージ装置１にアクセス要求（リード要求、ライト要求等）を発行する。リード要求やライト要求には、アクセス対象の仮想ボリュームを特定するための識別子（Ｌｏｇｉｃａｌ  Ｕｎｉｔ  Ｎｕｍｂｅｒ（ＬＵＮ）等）と、仮想ボリューム上の領域を特定する情報が含まれる。仮想ボリューム上の領域を特定する情報には、Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓ（ＬＢＡ）と領域の長さの情報が含まれる。ストレージ装置１がホスト２からライト要求を受信すると、ストレージ装置１はライト要求に含まれる、仮想ボリューム上の領域を特定する情報（ＬＢＡと領域の長さ）から、アクセス対象の仮想ページを特定する。アクセス対象の仮想ページにまだページが割り当てられていない場合、ストレージ装置１はプールに属するページのうち未使用のページ（まだ仮想ページに割り当てられていないページ）を選択し、アクセス対象の仮想ページに、選択されたページを割り当てる（マップする）。ホスト２からのライトデータは、このアクセス対象仮想ページにマップされたページに格納される。【００４４】
またストレージ装置１は、仮想ページと、仮想ページに割り当てられたページとの対応関係（マッピング）をマッピングテーブル（後述する仮想ボリューム管理テーブル３００など）に記憶している。仮想ページに対するリード要求を受け付けた時には、ストレージ装置１はマッピングテーブルを参照することで、仮想ページに割り当てられたページを特定し、特定されたページからデータを読み出す。【００４５】
図２は、仮想ボリュームと、仮想ボリュームに割り当てられる記憶領域（ページ）の関係を表した概念図である。図２に示されている長方形状のオブジェクト４０は、仮想ボリューム（上書き空間）を表す。一方、円柱状のオブジェクト５０はプールを表している。【００４６】
さらにストレージ装置１は、仮想ボリューム（上書き空間）４０とは異なる記憶空間を有する。この記憶空間は「追書き空間」と呼ばれる。図２に示されている長方形状のオブジェクト６０が追書き空間を表している。追書き空間６０は、ホスト２がアクセスできる記憶空間ではなく、ストレージコントローラ１０だけが使用可能な記憶空間である。追書き空間６０は、ストレージコントローラ１０のＣＰＵ１１が圧縮データを記憶デバイスに格納するために用いられる。【００４７】
まず、上書き空間の仮想ページと物理ページの関係について説明する。各仮想ページには、仮想ページ番号（ＶＰ＃と表記されることもある）と呼ばれる、一意な識別番号（識別番号には非負の整数値が用いられる）が付される。以下では、仮想ページ番号がｎ（ｎは非負の整数値）の仮想ページのことを、「ＶＰ＃ｎ」と表記する。同様に各物理ページには、物理ページ番号（またはページ＃）と呼ばれる、ストレージ装置１内で一意な識別番号が付される（この識別番号も非負の整数値である）。以下では、物理ページ番号がｎ（ｎは非負の整数値）の物理ページのことを、「ページ＃ｎ」と表記する。図２の例では、ＶＰ＃０にページ＃０がマップされた例が示されている。ＶＰ＃１，ＶＰ＃２については後述する。【００４８】
ストレージ装置１がホスト２から、仮想ページ内の領域（１または複数のブロック）に対するライト要求（及びライトデータ）を受け付けた場合、仮想ページにマップされている物理ページ内のブロックにライトデータが格納される。ストレージ装置１は、仮想ページと物理ページの対応関係（マッピング）を、後述する仮想ボリューム管理テーブル３００に格納して管理する。【００４９】
本実施例に係るストレージ装置１は原則として（後述する、圧縮データ格納のケースを除いて）、仮想ページの先頭からｎ番目のブロックへのデータライト要求を受領すると、データは仮想ページにマップされている物理ページの先頭からｎ番目のブロックに格納される。なお、説明が冗長になることを避けるため、以下では、ストレージ装置１が仮想ページに割り当てられている物理ページにデータを格納することを、「仮想ページ（または上書き空間）にデータを格納する」と表現する。【００５０】
追書き空間も上書き空間と同じく、いわゆるＴｈｉｎ  Ｐｒｏｖｉｓｉｏｎｉｎｇ技術により形成される記憶空間である。ストレージコントローラ１０は、追書き空間上の領域に、動的にページ（物理ページ）を割り当て、データは追書き空間に割り当てられた物理ページに書き込まれる。上書き空間と同じく、ストレージ装置１は追書き空間を物理ページと同サイズの領域に分割して管理する。この領域は「追書きページ」と呼ばれる。また追書きページにも追書きページ番号と呼ばれる一意な識別番号が付される。追書きページ番号は、追書きページ＃と表記されることもある。ストレージ装置１は、追書きページと物理ページの対応関係（マッピング）を、後述する追書き空間マッピングテーブル３５０に格納して管理する。また、説明が冗長になることを避けるため、以下では、ストレージ装置１が追書きページに割り当てられている物理ページにデータを書き込む処理を、「追書きページ（または追書き空間）にデータを書き込む」と表現する。【００５１】
先にも述べたが、追書き空間に書き込まれるデータは、圧縮データである。また追書き空間はプールごとに設けられ、プールがｎ個ある場合には追書き空間はｎ個存在する。追書き空間に割り当てられる物理ページは、仮想ページに割り当てられる物理ページと同じく、プールから未使用の物理ページが選択される。プール＃ｋの物理ページが割り当てられる仮想ボリュームのチャンクが追書き空間に移動される時、その追書き空間に割り当てられる物理ページは、プール＃ｋの物理ページである。【００５２】
ストレージ装置１は、ホスト２から仮想ページに書き込まれたデータ（非圧縮データ）について、必要に応じて圧縮処理を行う。圧縮処理により生成された圧縮データは、非圧縮データの格納された物理ページとは異なる場所、具体的には追書き空間に移動される。またこの時、重複データの有無の判定なども行われる。【００５３】
本実施例に係るストレージ装置１は、仮想ページ内の領域を、仮想ページの先頭から順に８ＫＢの部分領域に区分し、この部分領域ごとにデータ圧縮を行う。本実施例では、この８ＫＢの部分領域（あるいはこの部分領域に格納されているデータ）のことを「チャンク」と呼ぶ。なお、チャンクの大きさには、８ＫＢ以外の大きさが採用されてもよい。また、チャンクを圧縮することで生成されたデータのことを「圧縮チャンク」と呼ぶ。圧縮チャンクの大きさはデータの内容に依存して変動するが、最小で５１２バイト、最大で８ＫＢである。また本実施例に係るストレージ装置１は、５１２バイトの整数倍のサイズの圧縮チャンクを生成する。【００５４】
ストレージコントローラ１０（のＣＰＵ１１）が圧縮チャンクを生成すると、ストレージコントローラ１０は圧縮チャンクを追書き空間に追記する。ある仮想ページのチャンクがすべて圧縮されて、圧縮チャンクが全て追書き空間に書き込まれると、仮想ページに割り当てられていたページは破棄される。具体的には、その仮想ページに割り当てられていたページは、未使用状態（仮想ページに割り当てられていない状態）に変更される。これにより、上書き空間に対して書き込まれたデータが、追書き空間に移動されたことになる。なお、追書き空間に割り当てられた物理ページには、複数の仮想ページのチャンク（圧縮チャンク）が格納されることもある。圧縮によりチャンクのサイズは小さくなり、複数の仮想ページのデータが１物理ページに収容可能になることもあるからである。またストレージ装置１は、上書き空間上のチャンクと追書き空間上の圧縮チャンクの対応関係（マッピング）を、後述するＬＰ変換テーブル５００に格納して管理する。【００５５】
ホスト２から書き込まれたデータが追書き空間に移動された仮想ページに対して、ホスト２から更新データの書き込み要求（つまり更新要求）があった場合、更新データは圧縮され、追書き空間に追記される。ただし別の実施形態として、ストレージ装置１は再び上書き空間の仮想ページに物理ページを割り当て、追書き空間に移動されたデータを伸長して、仮想ページに割り当てられた物理ページに伸長されたデータを書き戻し、そしてこの物理ページ上のデータを更新（上書き）するようにしてもよい。【００５６】
ストレージ装置１が、上書き空間上のチャンクを特定するために使用するアドレスをＬＡと呼ぶ。ＬＡはチャンクごとに付されるアドレスで、
ＬＡ＝ＬＢＡ÷１６
の関係にある。【００５７】
そのため、上書き空間上の先頭に位置するチャンクのＬＡは０で、後続のチャンクのＬＡは順に、１，２，．．．の連続番号になる。【００５８】
一方追書き空間上の圧縮チャンクは可変長で、最小５１２バイトのサイズであるので、追書き空間上の５１２バイトの領域（ブロック）ごとにアドレスが付される。このアドレスをＰＡと呼ぶ。追書き空間上の先頭に位置する５１２バイト領域のＰＡが０で、後続の領域のＰＡには、順に１，２，．．．の連続番号が用いられる。【００５９】
（３）管理情報
続いて、上で述べたプール、仮想ボリューム（上書き空間）、追書き空間の管理に用いられる管理情報の内容について説明する。なお、本明細書や図面で、数値の先頭に文字列“０ｘ”が付されているものがあるが、これはその数値が１６進数で表記されていることを意味する。【００６０】
図３にストレージ装置１が有する管理情報を示す。ストレージ装置１は、キャッシュメモリ１４上にページ管理テーブル２００、仮想ボリューム管理テーブル３００、追書き空間マッピングテーブル３５０、論理物理変換テーブル（ＬＰ変換テーブル）５００、ＦｉｎｇｅｒＰｒｉｎｔ  Ｍａｔｃｈ  Ｑｕｅｕｅ（ＦＰＭＱ）４００、ＦｉｎｇｅｒＰｒｉｎｔ  Ｔａｂｌｅ  Ｄｉｒｅｃｔｏｒｙ（ＦＰＴＤ）４５０、プール管理情報６００を有する。【００６１】
図４はプールに属するページを管理するための情報である、ページ管理テーブル２００の例を示している。ページ管理テーブル２００はプールごとに設けられるテーブルで、プールがｎ個設けられている場合には、ストレージ装置１はｎ個のページ管理テーブル２００を有する。【００６２】
ページ管理テーブル２００の各行（レコード）には、プール内の物理ページの情報が格納される。各レコードは、ページ＃（２０１）、ＤＥＶ＃（２０２）、Ａｄｄｒ（２０３）、ｕｓｅ（２０４）の欄を有する。ページ＃（２０１）には、物理ページのページ番号が格納される。つまりページ＃（２０１）がｎのレコードは、ページ＃ｎの情報を管理するレコードである。【００６３】
先に述べたが、ページ（物理ページ）は記憶デバイス２０上の領域である。ＤＥＶ＃（２０２）とＡｄｄｒ（２０３）には、物理ページの存在する記憶デバイス２０の識別番号及び記憶デバイス内のアドレスが格納される。図４の場合、ページ＃１の情報を管理するレコードには、ＤＥＶ＃（２０２）に０、Ａｄｄｒ（２０３）に０ｘ１５０００が格納されている。そのため、ページ＃１は、識別番号が０の記憶デバイス２０の、アドレス０ｘ１５０００から始まる４２ＭＢの領域（１物理ページのサイズに等しい領域）に相当することを表している。【００６４】
ｕｓｅ（２０４）には、物理ページの使用状況を表す情報が格納される。物理ページが仮想ボリュームまたは追書き空間にマップされている場合、ｕｓｅ（２０４）には“１”が格納される。逆に物理ページが仮想ボリュームまたは追書き空間にマップされていない場合、ｕｓｅ（２０４）には“０”が格納される。ｕｓｅ（２０４）が“１”であるページは、使用中のページと呼ばれ、逆にｕｓｅ（２０４）が“０”のページは、未使用のページと呼ばれる。【００６５】
なお、本実施例では、ページ管理テーブル２００に、記憶デバイス２０（たとえばＨＤＤ）の識別番号とアドレスが登録され、各ページが１つの記憶デバイス２０内の記憶領域に相当する例が説明されている。ただし、これ以外のプール（またはページ）の構成方法が採用されてもよい。たとえばストレージ装置１がＲＡＩＤ（Ｒｅｄｕｎｄａｎｔ  Ａｒｒａｙｓ  ｏｆ  Ｉｎｄｅｐｅｎｄｅｎｔ  （ｏｒ  Ｉｎｅｘｐｅｎｓｉｖｅ）  Ｄｉｓｋｓ）技術を用いて、複数の記憶デバイス２０から１つの論理的な記憶デバイス（論理デバイスと呼ぶ）を形成する場合、論理デバイス上の所定サイズ（たとえば４２ＭＢ）の記憶領域をページとして扱ってよい。その場合、ページ管理テーブル２００のＤＥＶ＃（２０２）とＡｄｄｒ（２０３）には、論理デバイスの識別番号と、論理デバイス内のアドレスが格納されるとよい。【００６６】
図５にプール管理情報６００の例を示す。プール管理情報６００は、各プールに属する仮想ボリュームの情報と、重複排除処理に関する情報を格納するためのテーブルである。プールが複数存在する場合、ストレージ装置１は各仮想ボリュームを、いずれか１つのプールに所属させる。ストレージ装置１は、仮想ボリュームの仮想ページに物理ページを割り当てる際、仮想ボリュームが属しているプール内の未使用物理ページを選択して、仮想ページに物理ページを割り当てる。【００６７】
プール管理情報６００の各レコードには、プール番号（６０１）、仮想ボリューム＃（６０５）、最終書き込み位置（６０４）、累積重複排除対象チャンク数（６０２）、メタデータ削除チャンク数（６０３）の情報が格納される。プール番号（６０１）は、プール番号が格納される。仮想ボリューム＃（６０５）には、プールに属する仮想ボリュームの識別番号（仮想ボリューム番号と呼ぶ）が格納される。プールに属する仮想ボリュームが複数存在する場合には、仮想ボリューム＃（６０５）には複数の仮想ボリューム番号が格納される。【００６８】
最終書き込み位置（６０４）には、最後に圧縮チャンクが書き込まれた追書きページの、追書きページ番号が格納される。ストレージコントローラ１０が追書きページに圧縮チャンクを書き込む際、最終書き込み位置（６０４）を参照することで、最後に書き込みが行われた追書きページを特定する。【００６９】
累積重複排除対象チャンク数（６０２）、メタデータ削除チャンク数（６０３）は重複排除処理に用いられる情報で、詳細は後述する。【００７０】
図６は、仮想ボリューム管理テーブル３００の例を示している。仮想ボリューム管理テーブル３００もキャッシュメモリ１４に格納されている。仮想ボリューム管理テーブル３００の各レコードには、仮想ボリューム内の仮想ページについての情報が格納される。具体的には各レコードには、仮想ページ＃（３０１）、シーケンシャルＷＲ数（３０２）、ランダムＷＲ数（３０３）、最終更新時刻（３０４）、ページ種別（３０５）、ページ＃（３０６）、プール＃（３０７）、メタデータ削減チャンク数（３０８）の情報が格納される。【００７１】
仮想ページ＃（１０１）には、仮想ページの仮想ページ番号が格納される。一方ページ＃（３０６）には、仮想ページに割り当てられた物理ページのページ＃が格納される。プール＃（３０７）は、仮想ページに割り当てられた物理ページが属するプールのプール番号である。【００７２】
シーケンシャルＷＲ数（３０２）とランダムＷＲ数（３０３）には、仮想ページに対してホスト２から受け付けたライト要求の数が格納される。具体的には、シーケンシャルＷＲ数（３０２）には、シーケンシャルライト要求の数が、ランダムＷＲ数（３０３）にはランダムライト要求の数が格納される。【００７３】
なお、ホスト２から受け付けたライト要求が、シーケンシャルライト要求であるかランダムライト要求であるかを判別する方法には、任意の方法が用いられて良い。たとえばストレージ装置１が、ある仮想ページに対して複数のライト要求を受け付けた時、各ライト要求で指定されているアドレス（ＬＢＡ）が連続している場合、それらのライト要求はシーケンシャルライト要求であると判定するとよい。逆にそうでないライト要求は、ランダムライト要求であると判断されるとよい。【００７４】
最終更新時刻（３０４）には、最後に仮想ページに対してライト要求を受け付けた時刻が格納される。ストレージ装置１はある仮想ページに対してライト要求を受け付けるたびに、その仮想ページの最終更新時刻（３０４）にライト要求を受け付けた時刻を格納する。【００７５】
ページ種別（３０５）には、１または０が格納される。初期状態では、全仮想ページのページ種別（３０５）は１に設定されている。【００７６】
ページ種別（３０５）に０が格納されている場合、仮想ページに対して書き込まれたデータは圧縮されて、追書き空間に移動されたことを表す。この場合には、ページ＃（３０６）とプール＃（３０７）には無効値（ｎｕｌｌと呼ぶ。具体的には“−１”などの、ページ＃やプール＃に用いられない値である）が格納される。また移動されたデータ（圧縮チャンク）の格納場所は、後述するＬＰ変換テーブル５００等に記録される。【００７７】
一方ページ種別（３０５）に１が格納されている場合、仮想ページに対して書き込まれたデータはまだ追書き空間に移動されていないか、あるいはその仮想ページに対してまだホスト２からの書き込み要求が発生していないことを表す。ページ種別（３０５）が１で、ページ＃（３０６）とプール＃（３０７）に有効な値（ｎｕｌｌでない値）が格納されている場合、その仮想ページに対して物理ページが割り当てられており、その物理ページにホスト２からのライトデータが格納されていることを示す。逆にページ種別（３０５）が１で、ページ＃（３０６）とプール＃（３０７）がｎｕｌｌの場合、その仮想ページに対してまだホスト２からの書き込み要求が発生しておらず、物理ページが割り当てられていないことを表す。【００７８】
メタデータ削減チャンク数（３０８）は、重複排除処理に関係する情報であり、詳細は後述する。【００７９】
なお、仮想ボリューム管理テーブル３００は仮想ボリューム毎に作成されるため、仮想ボリュームが複数存在する場合、仮想ボリューム管理テーブル３００は複数存在する。また仮想ボリュームが複数存在する場合、仮想ボリューム管理テーブル３００の各レコードには、上で説明した仮想ページ＃（３０１）等の情報に加えて、仮想ボリュームを特定するための情報（たとえば仮想ボリューム番号）が含まれてもよい。【００８０】
図７は、追書き空間マッピングテーブル３５０の例を示している。追書き空間マッピングテーブル３５０は、追書き空間にマッピングされる物理ページを管理するための管理情報である。追書き空間はプールごとに設けられるので、追書き空間マッピングテーブル３５０もプールごとに存在する。各行の追書きページ＃（３５１）には、追書きページ番号が昇順に格納されている。追書き空間マッピングテーブル３５０の各レコードは、追書きページ＃（３５１）で特定される追書きページに、ページ＃（３５２）とプール＃（３５３）で特定されるページが割り当てられていることを表している。追書きページにページが割り当てられていない場合、その追書きページのページ＃（３５２）とプール＃（３５３）にはｎｕｌｌが格納される。【００８１】
ページ内最終書き込み位置（３５４）は、追書きページ内のブロックのうち、最後に圧縮チャンクが書き込まれたブロックの相対アドレスが格納される。相対アドレスとは具体的には、ページ内の先頭ブロックのアドレスを０と定めた時の、ブロックのアドレスである。図７の例では、追書きページ＃（３５１）が“２”のレコードのページ内最終書き込み位置（３５４）は“０ｘ０５”であるので、この追書きページ＃が“２”の追書きページに割り当てられているページには、ページ先頭から６番目のブロックまで圧縮チャンクが書き込まれていることを表している。ストレージ装置１は追書き空間に圧縮チャンクを追記する際に、このページ内最終書き込み位置（３５４）とプール管理情報６００の最終書き込み位置（６０４）とを参照することで、圧縮チャンクを書き込むべき位置を特定する。【００８２】
続いて論理物理変換テーブル５００について説明する。論理物理変換テーブル５００は、上書き空間上のチャンクが圧縮されて追書き空間に移動された場合、各チャンクの移動先を管理するためのテーブルである。図８に論理物理変換テーブル５００の例を示す。論理物理変換テーブル５００はＬＰ変換テーブル５００と表記されることもある。【００８３】
ＬＰ変換テーブル５００のレコードは、仮想ボリューム上のチャンクと圧縮チャンクの記録位置との対応関係（マッピング）についての情報を表す。各レコードは、レコードのＬＡ（５０１）で特定される８ＫＢの領域（チャンク）が圧縮された後、ＰＡ（５０３）で特定されるアドレスから始まる、長さがＬｅｎｇｔｈ（５０４）の領域に格納されたことを表す。ＦＰＫ上位３２ｂｉｔ（５０２）、ＦＰＭＱ登録（５０５）については、重複排除処理の概要を述べた後、説明する。【００８４】
先に述べたとおり、本実施例に係るストレージ装置１は重複排除処理を行うので、原則として、同内容の複数のチャンクが追書き空間に格納されないように制御される。再び図２を用いて重複排除処理の概略を説明する。仮想ボリュームのＶＰ＃２のチャンクＡ、チャンクＢのそれぞれが、圧縮チャンクａ、圧縮チャンクｂとして追書き空間上に格納されている状態にあるとき、ストレージ装置１がＶＰ＃３のチャンクを追書き空間に移動する処理を開始した場合を想定する。もしチャンクＤの内容がチャンクＢと同一だった場合、チャンクＤの圧縮チャンクは追書き空間に書き込まれない。代わりにストレージ装置１は、ＬＰ変換テーブル５００のチャンクＢの情報を格納しているレコードのＰＡ（５０３）と同一の値を、ＬＰ変換テーブル５００のチャンクＤの情報を格納しているレコードのＰＡ（５０３）に格納する。【００８５】
また、ストレージ装置１が重複排除処理を行う時、チャンクに所定の演算（たとえばハッシュ関数を用いた演算等）を施すことで、値を生成する。本実施例では、この生成された値をＦＰＫ（ＦｉｎｇｅｒＰｒｉｎｔ  Ｋｅｙ）と呼ぶ。本実施例では、ＦＫＰは６４ｂｉｔのサイズの情報である。ただしＦＫＰは６４ｂｉｔ以外のサイズであってもよい。【００８６】
ストレージ装置１は、チャンクから生成されるＦＰＫとチャンクのＬＡの対応関係を管理情報に記録する。この管理情報はＦｉｎｇｅｒＰｒｉｎｔ  Ｍａｔｃｈ  Ｑｕｅｕｅ（以下では“ＦＰＭＱ”と呼ばれる）と呼ぶ。図９にＦＰＭＱ４００の例を示す。ＦＰＭＱ４００は、ＦＰＫ（４０１）とＬＡ（４０２）のカラムを有するテーブルで、ＬＡ（４０２）から始まる８ＫＢの領域（チャンク）から生成されたＦＰＫが、ＦＰＫ（４０１）に格納される。ＦＰＭＱ４００に格納される各行（レコード）は、ＦＰＫ（４０１）の昇順にソートされている。以下では、ＦＰＭＱ４００のレコード、つまりＦＰＫ（４０１）とＬＡ（４０２）のセットのことを、「チャンクのメタデータ」（あるいは単に「メタデータ」）と呼ぶことがある。【００８７】
ＦＰＭＱ４００はプールごとに設けられる。ストレージ装置１は、たとえばプール＃ｎに属する仮想ボリューム（上書き空間）のチャンクを追書き空間に移動する時（仮にこのチャンクを“チャンクＡ”と呼ぶ）、プール＃ｎ用のＦＰＭＱ４００を参照する事で、チャンクＡと同一のチャンク（圧縮チャンク）が既に追書き空間に存在するか判定する。チャンクＡのＦＰＫと同一のＦＰＫが、プール＃ｎ用のＦＰＭＱ４００に存在しない場合、チャンクＡと同一のチャンク（圧縮チャンク）はプール＃ｎ用の追書き空間に存在しないと判定できる。本実施例に係るストレージ装置１では、重複排除の範囲はプールである。そのためチャンクＡと同一のチャンク（圧縮チャンク）がプール＃ｎにはないが、プール＃ｎ以外のプールに存在した場合、チャンクＡ（の圧縮チャンク）はプール＃ｎに書き込まれる。【００８８】
また、ＦＰＭＱ４００内の情報の検索を効率的に行えるようにするために、ストレージ装置１はＦＰＭＱ４００内のいくつかのレコードが格納されているアドレス（キャッシュメモリ１４上アドレス）を記録した管理情報を有する。この管理情報は、ＦｉｎｇｅｒＰｒｉｎｔ  Ｔａｂｌｅ  Ｄｉｒｅｃｔｏｒｙと呼ばれる。また以下ではこれを、“ＦＰＴＤ”と呼ぶこともある。【００８９】
図９にＦＰＴＤ４５０の例を示す。ＦＰＴＤ４５０もＦＰＭＱ４００と同様に、プールごとに設けられる。ＦＰＭＱ格納アドレス（４５２）には、ＦＰＭＱ４００のレコードのうち、ＦＰＫ４０１に格納されているＦＰＫの上位３２ｂｉｔが、ＦＰＫ先頭３２ｂｉｔ（４５１）と等しいレコードの中で、ＦＰＫ４０１が最も小さいレコードが格納されているアドレス（キャッシュメモリ１４上アドレス）が格納される。【００９０】
たとえばＦＰＭＱ４００内で、ＦＰＫ４０１の上位３２ｂｉｔが“０ｘ０００００００１”であるレコードのうち、値が最小のレコードのＦＰＫ４０１が“０ｘ０００００００１０００００００１”だった場合を想定する。この時ＦＰＫ４０１が“０ｘ０００００００１０００００００１”のレコードが格納されているアドレスが“ＡＤＲ２”だった場合には、ＦＰＴＤ４５０には、ＦＰＫ先頭３２ｂｉｔ（４５１）が“０ｘ０００００００１”、ＦＰＭＱ格納アドレス４５２が“ＡＤＲ２”のレコードが記録される。【００９１】
後述する重複排除プログラム１０００では、チャンクのＦＰＫを算出してから、そのＦＰＫと同じ値がＦＰＭＱ４００のＦＰＫ（４０１）に格納されているか判定する処理が行われる。ＦＰＭＱ４００に格納されているレコード数が非常に多い場合、検索に時間がかかるため、ＦＰＴＤ４５０が用いられる。【００９２】
たとえば、“０ｘ０００００００１０００００００１”の格納されているレコードを検索する場合、重複排除プログラム１０００はＦＰＴＤ４５０を参照することで、ＦＰＫ先頭３２ｂｉｔ（４５１）が“０ｘ０００００００１”のＦＰＭＱ格納アドレス（４５２）が“ＡＤＲ２”であることを認識する。続いて重複排除プログラム１０００は、ＦＰＭＱ４００内のレコードのうち、アドレス“ＡＤＲ２”（これはキャッシュメモリ１４上のアドレスである）のレコードから順に、“０ｘ０００００００１０００００００１”の格納されているレコードを探索する。なお、ＦＰＴＤ４５０は、ＦＰＭＱ４００内の情報の検索速度を向上させるための情報であるから、ＦＰＴＤ４５０は必須の情報ではない。【００９３】
ＦＰＭＱ４００には、チャンクごとに、チャンクのメタデータが格納される。ＦＰＫを生成したチャンクが多いと、ＦＰＭＱ４００のサイズが増大し、キャッシュメモリ１４の記憶領域を多く消費することになる。キャッシュメモリ１４の記憶領域を過剰に消費することを避けるために、本実施例に係るストレージ装置１は、所定の条件に該当するチャンクについては、ＦＰＭＱ４００にチャンクのメタデータを格納しない制御を行う。この制御の詳細は後述する。【００９４】
図８のＦＰＫ上位３２ｂｉｔ（５０２）とＦＰＭＱ登録（５０５）について説明する。ＬＰ変換テーブル５００のＦＰＫ上位３２ｂｉｔ（５０２）には、チャンクのＦＰＫの上位３２ビットが格納される。ＦＰＭＱ登録（５０５）は、チャンクのメタデータがＦＰＭＱ４００に登録されているかいないかを表す情報である。ストレージ装置１がＬＡ（５０１）で特定されるチャンクのメタデータをＦＰＭＱ４００に登録した場合、ＦＰＭＱ登録（５０５）に“１”が記録され、そうでない場合にはＦＰＭＱ登録（５０５）に“０”が記録される。また、チャンクから生成されたＦＰＫ（及びそのチャンクのＬＡ）をＦＰＭＱ４００に登録した後、ＦＰＭＱ４００からＦＰＫ及びそのチャンクのＬＡを削除することもある。その場合にもストレージ装置１はＦＰＭＱ登録（５０５）に“０”を記録する。【００９５】
ストレージ装置１は、ＦＰＭＱ４００にチャンクのメタデータを登録または削除した回数を、プールごとに計数し、プール管理情報６００に記憶している。再び図５を参照しながら、プール管理情報６００の累積重複排除対象チャンク数（６０２）とメタデータ削除チャンク数（６０３）について説明する。【００９６】
累積重複排除対象チャンク数（６０２）は、ＦＰＭＱ４００にチャンクのメタデータ（チャンクのＬＡ及びＦＰＫ）を登録した回数が記録される。一方メタデータ削除チャンク数（６０３）は、ＦＰＭＱ４００からチャンクのメタデータを削除した（または登録しなかった）回数が記録される。なお、ストレージ装置１はこれらの回数をプールごとに管理している。そのため、プール番号がｎのプール内のチャンクについて、メタデータをＦＰＭＱ４００に登録すると、ストレージ装置１はプール番号（６０１）がｎの行（レコード）の累積重複排除対象チャンク数（６０２）に１を加算する。またプール番号がｎのプール内のチャンクについて、メタデータをＦＰＭＱ４００から削除した時は、ストレージ装置１はプール番号（６０１）がｎの行（レコード）のメタデータ削除チャンク数（６０３）から１を減算する。【００９７】
（４）処理の流れ
続いて、本実施例に係るストレージ装置１が実施する処理の流れの説明を行う。図１０に示されているように、本実施例に係るストレージ装置１のローカルメモリ１６には少なくとも、Ｉ／Ｏプログラム１００、バッファ更新プログラム１５０、重複排除プログラム１０００が格納されており、ＣＰＵ１１がこれらのプログラムを実行する。またローカルメモリ１６には、稼働情報３００’、バッファ７００が設けられる。バッファ７００は、ＣＰＵ１１が圧縮処理または伸長処理を行う時に使用するメモリ領域である。【００９８】
稼働情報３００’は、仮想ボリューム管理テーブル３００に格納される情報のうち、一部の情報が格納された情報である。具体的には稼働情報３００’は、仮想ボリューム管理テーブル３００の各レコードのうち、仮想ページ＃（３０１）、シーケンシャルＷＲ数（３０２）、ランダムＷＲ数（３０３）、最終更新時刻（３０４）のみを有する。そのため、本明細書では稼働情報３００’の図示は略す。【００９９】
まず、Ｉ／Ｏプログラム１００が実行する処理の流れを説明する。なお、以下で説明される各図において、参照番号の前に付されているアルファベットの“Ｓ”は、「ステップ」を意味する。【０１００】
ストレージ装置１がホスト２からＩ／Ｏ要求を受領すると、Ｉ／Ｏプログラム１００の実行が開始される。図１１では、ホスト２からのリード要求をストレージ装置１が受領した時に、Ｉ／Ｏプログラム１００が実行する処理の流れを説明する。なお、図１１では、リード要求で指定された領域のデータがキャッシュメモリ１４に存在しなかった場合（キャッシュミスのケース）の例を説明する。【０１０１】
ステップ１１：Ｉ／Ｏプログラム１００は、ホスト２からリード要求を受領すると、リード要求に含まれている、リード先のアドレス（ＬＢＡ）を、仮想ページ番号に変換する。以下ではリード先の領域の仮想ページ番号がｐであった場合の例を説明する。また以下では、リード要求で指定されているリード先の領域が、複数の仮想ページに跨っていない場合の例を説明する。【０１０２】
ステップ１２：Ｉ／Ｏプログラム１００は仮想ボリューム管理テーブル３００を参照し、ステップ１１で求められた仮想ページ番号（ｐ）のページ種別（３０５）が“１”か判定する。ページ種別（３０５）が“１”の場合（ステップ１２：Ｙｅｓ）、次にステップ１３が行われ、そうでない場合には（ステップ１２：Ｎｏ）、次にステップ１５が行われる。【０１０３】
ステップ１３：Ｉ／Ｏプログラム１００は仮想ボリューム管理テーブル３００を参照し、仮想ページ（ＶＰ＃ｐ）に割り当てられている物理ページのページ番号（３０６）を特定する。さらにＩ／Ｏプログラム１００はページ管理テーブル２００を参照することで、その物理ページの存在する記憶デバイス２０のＤＥＶ＃（２０２）、Ａｄｄｒ（２０３）を特定する。【０１０４】
ステップ１４：Ｉ／Ｏプログラム１００は、ステップ１３で特定された記憶デバイス２０からデータを読み出し、ホスト２に読み出されたデータを返送し、処理を終了する。なお、ここで読み出されたデータは、キャッシュメモリ１４に格納しておいてもよい。そうすると、後でそのデータに対するリード要求を再び受領した際、Ｉ／Ｏプログラム１００は記憶デバイス２０にアクセスすることなく、ホスト２にデータを返却できる。【０１０５】
ステップ１５：ステップ１５が実行される場合、リード要求で指定されている領域のデータは追書き空間に移動されているので、Ｉ／Ｏプログラム１００は、リード対象データ（圧縮チャンク）の格納されている、追書き空間上のアドレス（ＰＡ）を算出する必要がある。なお、以下では、リード要求で指定されている領域のサイズが１チャンク（８ＫＢ）と同じで、かつこの領域がチャンク境界に一致している場合の例を説明する。ステップ１５ではチャンクＩ／Ｏプログラム１００は、リード要求に含まれているリード先のアドレス（ＬＢＡ）を、ＬＡに変換する。【０１０６】
ステップ１６：Ｉ／Ｏプログラム１００はＬＰ変換テーブル５００を参照し、ＬＡ（５０１）がステップ１５で特定されたＬＡに等しいレコードを特定し、そのレコードのＰＡ（５０３）及びＬｅｎｇｔｈ（５０４）を特定する。さらにＩ／Ｏプログラム１００は、特定されたＰＡから追書きページ番号を算出し、そして追書き空間マッピングテーブル３５０を参照することで、特定された追書きページに割り当てられている物理ページのページ＃（３５２）、プール＃（３５３）を特定する。さらにＩ／Ｏプログラム１００はページ管理テーブル２００を参照することで、その物理ページの存在する記憶デバイス２０のＤＥＶ＃（２０２）、Ａｄｄｒ（２０３）を特定する。【０１０７】
ステップ１７：Ｉ／Ｏプログラム１００は、ステップ１６で特定された記憶デバイス２０からデータ（圧縮チャンク）を読み出し、バッファ７００に格納する。さらにＩ／Ｏプログラム１００は、バッファ７００に格納された圧縮チャンクを伸長する。そしてＩ／Ｏプログラム１００は、伸長されたデータをホスト２に返却し、処理を終了する。なお、ここで読み出されたデータは、キャッシュメモリ１４に格納しておいてもよい。【０１０８】
図１２では、ホスト２からライト要求が発行された時に、Ｉ／Ｏプログラム１００が実行する処理の流れを説明する。【０１０９】
ステップ１０１：Ｉ／Ｏプログラム１００は、ホスト２からライト要求を受領すると、ライト要求でライト対象となっているデータを受領するために、キャッシュメモリ１４上の領域を確保する。そしてＩ／Ｏプログラム１００は、確保された領域にライト対象のデータを格納する。これは公知のストレージ装置でも行われる処理のため、詳細の説明は略す。なおステップ１０１でＩ／Ｏプログラム１００は、ライト要求で指定されている、ライト先の領域のアドレス（ＬＢＡ）を、仮想ページ＃に変換する。以下ではライト先の領域の仮想ページ＃がｐであった場合の例を説明する。【０１１０】
ステップ１０２：Ｉ／Ｏプログラム１００は、ホスト２に対し、ライト処理が完了した旨を応答する。【０１１１】
ステップ１０３：Ｉ／Ｏプログラム１００は、稼働情報３００’のレコードのうち、仮想ページ＃（３０１）がｐのレコードの最終更新時刻（３０４）に、現在時刻（ステップ１０３が実行される時点の時刻）を格納する。またＩ／Ｏプログラム１００は、今回受領したライト要求がシーケンシャルライト要求かランダムライト要求かを判別する。今回受領したライト要求がシーケンシャルライト要求の場合、Ｉ／Ｏプログラム１００は稼働情報３００’内の、仮想ページ＃（３０１）がｐのレコードのシーケンシャルＷＲ数（３０２）に１を加算する。今回受領したライト要求がランダムライト要求の場合、Ｉ／Ｏプログラム１００は稼働情報３００’内の、仮想ページ＃（３０１）がｐのレコードのランダムＷＲ数（３０３）に１を加算する。【０１１２】
ステップ１０３の後、Ｉ／Ｏプログラム１００は所定の契機でキャッシュメモリ１４に格納したデータを、記憶デバイス２０に書き込む（ステップ１１０）。この処理はデステージと呼ばれる。仮想ページ（仮にこれをＶＰ＃ｐとする）に書き込まれたデータをデステージする時、仮想ページに物理ページが割り当てられている場合、割り当てられた物理ページの存在する記憶デバイス２９にデータをデステージする。また物理ページが割り当てられていない場合には、デステージ前に仮想ページに物理ページが割り当てられる。またＶＰ＃ｐのチャンクが追書き空間に移動されている場合、Ｉ／Ｏプログラム１００は追書き空間にデータを追記する。この処理の詳細は後述する。【０１１３】
また、ステップ１１０は、ステップ１０３の直後に行われる必要はなく、任意の時刻に行われてよい。たとえばストレージ装置１のＣＰＵ１１の負荷が低い時、或いはキャッシュメモリ１４に格納されたデータ量が所定の閾値を超過した時などに実行されるとよい。【０１１４】
ステップ１０３で稼働情報３００’に記録された情報は、バッファ更新プログラム１５０によって、キャッシュメモリ１４上の仮想ボリューム管理テーブル３００に反映される。バッファ更新プログラム１５０は定期的に実行されるプログラムである。【０１１５】
バッファ更新プログラム１５０の実行が開始されると、バッファ更新プログラム１５０は稼働情報３００’の内容を、仮想ボリューム管理テーブル３００に反映する。図１３を用いて処理の流れを説明する。【０１１６】
ステップ１５１：バッファ更新プログラム１５０は稼働情報３００’のレコードを１つ選択する。以下では、このレコードの仮想ページ＃（１０１）の値がｐの場合を例にとって説明する。【０１１７】
ステップ１５２：バッファ更新プログラム１５０は、ステップ１５１で選択された稼働情報３００’のレコードのシーケンシャルＷＲ数（３０２）とランダムＷＲ数（３０３）の値をそれぞれ、仮想ボリューム管理テーブル３００のレコードのうち、仮想ページ＃（１０１）がｐのレコードのシーケンシャルＷＲ数（３０２）とランダムＷＲ数（３０３）に加算する。また、仮想ページ＃（１０１）がｐのレコードの最終更新時刻（３０４）に、選択された稼働情報３００’のレコードの最終更新時刻（３０４）を記録する。【０１１８】
ステップ１５３：バッファ更新プログラム１５０は、ローカルメモリ１６からステップ１５１で選択された稼働情報３００’のレコードを削除する。【０１１９】
ステップ１５４：稼働情報３００’の全レコードに対してステップ１５３までの処理が終了した場合（ステップ１５４：Ｙｅｓ）、処理を終了する。まだローカルメモリ１６に稼働情報３００’のレコードが残っている場合（ステップ１５４：Ｎｏ）、バッファ更新プログラム１５０はステップ１５１から処理を繰り返す。【０１２０】
本実施例に係るストレージ装置１は、ＣＰＵ１１がキャッシュメモリ１４にアクセスする時、内部スイッチ１７を経由したアクセスを行うため、アクセス性能（応答時間）が、ＣＰＵ１１がローカルメモリ１６にアクセスするときの性能に比べて良くない（長くなる）。そのため本実施例に係るストレージ装置１は、シーケンシャルＷＲ数（３０２）、ランダムＷＲ数（３０３）、最終更新時刻（３０４）の情報をローカルメモリ１６上の稼働情報３００’に一時記録し、定期的にその内容をキャッシュメモリ１４上の仮想ボリューム管理テーブル３００に反映する制御を行う。【０１２１】
ただし別の実施形態として、ストレージ装置１がローカルメモリ１６のみを有し、仮想ボリューム管理テーブル３００がローカルメモリ１６上に格納される構成の場合、このような制御を行う必要がなく、Ｉ／Ｏプログラム１００はステップ１０３で直接仮想ボリューム管理テーブル３００のシーケンシャルＷＲ数（３０２）、ランダムＷＲ数（３０３）、最終更新時刻（３０４）の更新を行ってもよい。またストレージ装置１がキャッシュメモリ１４のみを有し、全ての情報がキャッシュメモリ１４上に格納される構成の場合も、上で説明した制御を行う必要がなく、Ｉ／Ｏプログラム１００はステップ１０３で、キャッシュメモリ１４上の仮想ボリューム管理テーブル３００の更新を行ってもよい。【０１２２】
続いて、重複排除プログラム１０００の処理について、図１４、図１５を用いて説明する。重複排除プログラム１０００は、ホスト２から上書き空間に書き込まれたデータ（このデータは一旦上書き空間に割り当てられた物理ページに格納される）を、追書き空間に割り当てられたページに移動する処理を行うプログラムである。先に述べたとおり、追書き空間に割り当てられたページにデータ（チャンク）が移動される時、チャンクは圧縮される。そして重複排除処理が行われることもある。【０１２３】
ステップ１０１０：重複排除プログラム１０００は、仮想ボリューム管理テーブル３００を参照し、追書き空間にデータを移動する仮想ページを選択する。仮想ページの選択基準は任意で良い。一例として、ページ種別（３０５）が“１”の仮想ページのうち、現在時刻と最終更新時刻（３０４）の差が所定の閾値以上で、かつ最終更新時刻（３０４）が最も古いものが選ばれるとよい。追書き空間に格納されるデータ（チャンク）は圧縮されているため、アクセス時の応答時間が長くなる。そのため、アクセス頻度の高いデータよりも、アクセス頻度の低いデータが追書き空間に配置される方が好ましいからである。また重複排除プログラム１０００は、変数Ｄを用意し、Ｄを初期化する（０を代入する）。【０１２４】
ステップ１０２０：重複排除プログラム１０００は、ステップ１０１０で選択された仮想ページのデータを、記憶デバイス２０からキャッシュメモリ１４上に読み出す。もし既に仮想ページのデータがキャッシュメモリ１４上に存在する場合には、このステップ１０２０は実行される必要がない。【０１２５】
ステップ１０３０：重複排除プログラム１０００は、ステップ１０２０でキャッシュメモリ上に読み出されたデータの中から、チャンクを選択する。チャンクの選択方法は任意である。たとえばＬＡが小さいチャンクから順に選択されてもよい。【０１２６】
ステップ１０４０：重複排除プログラム１０００は、ステップ１０３０（または後述するステップ１０８０）で選択されたチャンクを、バッファ７００に転送する。【０１２７】
ステップ１０５０：重複排除プログラム１０００は、バッファ７００に転送されたデータからＦＰＫを算出する。【０１２８】
ステップ１０６０：重複排除プログラム１０００は、バッファ７００に転送されたデータを圧縮することで、圧縮チャンクを生成する。同時に重複排除プログラム１０００は、このチャンクの圧縮率を求める。圧縮率の定義は上で述べたとおりである。ここで生成された圧縮チャンクは、一旦バッファ７００に保存される。【０１２９】
ステップ１０７０：このステップで重複排除プログラム１０００は、圧縮チャンクを追書き空間に格納する。また、必要に応じて重複排除処理も行われる。この処理の詳細は後述する。【０１３０】
ステップ１０８０：重複排除プログラム１０００は、ステップ１０２０でキャッシュメモリ上に読み出されたデータの中から、次のチャンク（ステップ１０７０の処理がまだ行われてないチャンク）を選択する。【０１３１】
ステップ１０９０：もしステップ１０８０で、次のチャンクが選択できなかった場合、つまりすべてのチャンクについてステップ１０７０の処理が行われた場合（ステップ１０９０：Ｙｅｓ）、次にステップ１１００が行われる。ステップ１０８０で、次のチャンクが選択できた場合（ステップ１０９０：Ｎｏ）、重複排除プログラム１０００は再びステップ１０４０からの処理を行う。【０１３２】
ステップ１１００：重複排除プログラム１０００は、上書き空間のデータを破棄する。具体的には重複排除プログラム１０００は、ステップ１０１０で選択された仮想ページに割り当てられているページが、仮想ページに割り当てられていない状態になるよう、仮想ボリューム管理テーブル３００の内容を更新する（この仮想ページのページ種別（３０５）は“０”に、そしてページ＃（３０６）とプール＃（３０７）には“ｎｕｌｌ”が格納される）。また重複排除プログラム１０００は、割り当てられていた物理ページを未使用の状態にするために、この物理ページについて、ページ管理テーブル２００のレコードのうち、割り当てられていた物理ページのｕｓｅ（２０４）の値を“０”に更新する。【０１３３】
ステップ１１１０：ステップ１０７０では原則として、重複排除プログラム１０００はチャンクのメタデータをＦＰＭＱ４００に登録する。ただしチャンクが所定の条件に該当する場合、チャンクのメタデータはＦＰＭＱ４００に登録されない。重複排除プログラム１０００は、変数Ｄに、メタデータがＦＰＭＱ４００に登録されなかったチャンクの数を保持している。ステップ１１１０で重複排除プログラム１０００は、仮想ボリューム管理テーブル３００のメタデータ削減チャンク数（３０８）にＤの値を加算し、処理を終了する。【０１３４】
続いて、ステップ１０７０で行われる処理の詳細を、図１５を参照しながら説明する。【０１３５】
ステップ６０１０：重複排除プログラム１０００はステップ１０６０で求められた圧縮率が、所定の閾値より大きいか否か判定する。圧縮率が所定の閾値以下の場合（ステップ６０１０：Ｎｏ）、次にステップ６０２０が行われる。圧縮率が所定の閾値より大きい場合、次にステップ６２１０が行われる。【０１３６】
ステップ６０２０：重複排除プログラム１０００は、ステップ１０４０で求められたＦＰＫと同じＦＰＫが、ＦＰＭＱ４００に格納されているか探索する。先に述べたとおり、重複排除プログラム１０００はＦＰＴＤ４５０とＦＰＭＱ４００を参照することで、ステップ１０４０で求められたＦＰＫと同じＦＰＫの格納されている、ＦＰＭＱ４００のレコードを探索する。【０１３７】
ステップ６０３０：もし、ステップ１０４０で求められたＦＰＫと同じＦＰＫが、ＦＰＭＱ４００に格納されている場合（ステップ６０３０：Ｙｅｓ）、重複排除プログラム１０００は次にステップ６０４０を行う。ステップ１０４０で求められたＦＰＫと同じＦＰＫが、ＦＰＭＱ４００に格納されていない場合（ステップ６０３０：Ｎｏ）、次にステップ６１１０が行われる。【０１３８】
ステップ６０４０：重複排除プログラム１０００は、ＦＰＭＱ４００、ＬＰ変換テーブル５００、追書き空間マッピングテーブル３５０、ページ管理テーブル２００を参照することで、ステップ１０４０で求められたＦＰＫと同じＦＰＫを持つチャンク（圧縮チャンク）を記憶デバイス２０から読み出す。【０１３９】
具体的には重複排除プログラム１０００は、まずＦＰＭＱ４００とＬＰ変換テーブル５００を参照することで、ステップ１０４０で求められたＦＰＫと同じＦＰＫを持つチャンク（圧縮チャンク）の格納されているＰＡ及びその長さを特定する。以下、このチャンクを“重複候補チャンク”と呼び、重複候補チャンクのＰＡを“ＰＡ１”と呼ぶ。続いて重複排除プログラム１０００は追書き空間マッピングテーブル３５０を参照することで、重複候補チャンクが格納されているページ（物理ページ）のページ番号を特定し、さらにページ管理テーブル２００を参照することで、重複候補チャンクが格納されているページの存在する記憶デバイス及びアドレスを特定する。これはＩ／Ｏプログラム１００が行うステップ１６と同様の処理である。そして重複排除プログラム１０００は特定された記憶デバイス２０から、重複候補チャンクを読み出す。【０１４０】
ステップ６０５０：重複排除プログラム１０００は、ステップ６０４０で読み出されたチャンク（圧縮チャンク）とステップ１０５０で圧縮されたチャンクの内容を比較し、両者が同一か否か判定する。比較の際、両者はいずれも圧縮された状態にあるが、重複排除プログラム１０００は圧縮されたチャンク同士をバイト単位で比較する。ただし別の実施形態として、重複排除プログラム１０００は圧縮されたチャンクを一旦伸長し、伸長されたデータの比較を行ってもよい。比較の結果、両者が一致している場合（ステップ６０５０：Ｙｅｓ）、次にステップ６０６０が行われる。両者が異なる場合（ステップ６０５０：Ｎｏ）、次にステップ６１１０が行われる。【０１４１】
ステップ６０６０：重複排除プログラム１０００は、ＦＰＭＱ４００にチャンクのＦＰＫとチャンクのＬＡを登録する。また重複排除プログラム１０００は、ＬＰ変換テーブル５００のレコードのうち、ＬＡ（５０１）が処理対象チャンクのＬＡに一致するレコードのＦＰＭＱ登録（５０５）に“１”を格納する。【０１４２】
ステップ６０７０：重複排除プログラム１０００は、プール管理情報６００の累積重複排除対象チャンク数（６０２）に１を加算する。【０１４３】
ステップ６０８０：重複排除プログラム１０００は、ＬＰ変換テーブル５００のレコードのうち、ＬＡ（５０１）が処理対象チャンクのＬＡに一致するレコードのＰＡ（５０３）に、重複候補チャンクのＰＡ（つまりＰＡ１）を格納し、Ｌｅｎｇｔｈ（５０４）に重複候補チャンクの長さを格納する。この場合、追書き空間への圧縮チャンク格納は行われない。その後重複排除プログラム１０００は、ステップ１０８０以降の処理を行う。【０１４４】
ステップ６１１０：このステップは、ステップ６０３０の判定が否定的だった場合またはステップ６０５０の判定が否定的だった場合、つまり対象チャンクと同一のチャンクが追書き空間に格納されていない場合に行われる。ステップ６１１０で重複排除プログラム１０００は、ＦＰＭＱ４００にチャンクのメタデータを登録するか否か判定する。【０１４５】
具体的には、重複排除プログラム１０００は、ＦＰＭＱ４００の合計サイズが所定の規定値を超過している場合、かつ処理対象チャンクの属する仮想ページのランダムライト比率が所定値以上の場合（ステップ６１１０：Ｎｏ）、ＦＰＭＱ４００にチャンクのメタデータを登録しないと決定し、次にステップ６２１０が行われる。一方、ＦＰＭＱ４００の合計サイズが所定の規定値を超過していない場合、または処理対象チャンクの属する仮想ページのランダムライト比率が所定値未満の場合（ステップ６１１０：Ｙｅｓ）、重複排除プログラム１０００はＦＰＭＱ４００にチャンクのメタデータを登録すると決定し、次にステップ６１２０が行われる。【０１４６】
なお、ここでの「所定の規定値」は、キャッシュメモリ１４の容量に基づいて定められるとよい。たとえばＦＰＭＱ４００の合計サイズが、キャッシュメモリ１４の容量のｘ％を超過している場合（かつ仮想ページのランダムライト比率が所定値以上の場合）に、ＦＰＭＱ４００にチャンクのメタデータを登録しないようにするとよい。ＦＰＭＱ４００の合計サイズが過剰に大きくなり、キャッシュメモリ１４の消費量が増加すると、ホスト２からのライトデータなどをキャッシュメモリ１４に格納できる量が減少し、ストレージ装置１の性能に悪影響を及ぼすからである。【０１４７】
また、ここでのランダムライト比率とは、仮想ボリューム管理テーブル３００に格納されているランダムＷＲ数（３０３）とシーケンシャルＷＲ数（３０２）を用いて算出される値である。判定対象のチャンクが属する仮想ページのランダムＷＲ数（３０３）がｒ、シーケンシャルＷＲ数（３０２）がｓの場合、ランダムライト比率は以下の式で求められる。
ｒ÷（ｒ＋ｓ）【０１４８】
ステップ６１２０，ステップ６１３０：これらのステップはステップ６０６０，ステップ６０７０と同じである。【０１４９】
ステップ６１４０：重複排除プログラム１０００は、バッファ７００に一時保存されている圧縮チャンクを追書き空間に書き込み、バッファ７００内の圧縮チャンクを削除する。先に述べたとおり、重複排除プログラム１０００は追書き空間に圧縮チャンクを書き込むとき、追書き空間に追記する。ここで圧縮チャンクを追書き空間に追記する処理の流れを、図１６を用いて説明する。【０１５０】
まず、重複排除プログラム１０００は、圧縮チャンクを追記すべき追書き空間上のアドレス（ＰＡ）を決定する（ステップ５１）。ストレージ装置１は、プール管理情報６００と追書き空間マッピングテーブル３５０に、追書き空間の最終書き込み位置の情報を保持している。重複排除プログラム１０００は、プール管理情報６００の最終書き込み位置（６０４）を参照することで、最後に書き込みが行われた追書きページの追書きページ＃を特定する。以下、これをＡＰ１と表記する。続いて重複排除プログラム１０００は追書き空間マッピングテーブル３５０を参照することで、追書きページ＃（３５１）がＡＰ１のレコードのページ内最終書き込み位置（３５４）を特定する。以下ではこれをＲＡ１と表記する。そして重複排除プログラム１０００は、“ＡＰ１×ページのサイズ（４２ＭＢ）÷５１２＋ＲＡ１＋１”を算出することで、圧縮チャンクを書き込むべき追書き空間上のアドレス（ＰＡ）を求める。以下では、圧縮チャンク書き込み先のＰＡが“ＰＡ２”と決定され、また圧縮チャンクの長さが“Ｌ２”であった場合について説明する。【０１５１】
続いて重複排除プログラム１０００は、ステップ５１で決定されたＰＡ（ＰＡ２）を含む追書きページに物理ページが割り当てられているか判定する（ステップ５２）。このために重複排除プログラム１０００は、ＰＡ２をページのサイズ（４２ＭＢ）で割ることで、ＰＡ２を含む追書きページの追書きページ＃を求める（以下、ここで求められた追書きページ＃は、“ＡＰ２”と表記する）。さらに重複排除プログラム１０００は追書き空間マッピングテーブル３５０を参照することで、追書きページ＃（３５１）がＡＰ２のレコードのページ＃（３５２）に有効な値（ｎｕｌｌ以外の値）が格納されているか判定する。ページ＃（３５２）に有効な値が格納されている場合、ＰＡ２を含む追書きページには物理ページが割り当てられている。【０１５２】
ＰＡ２を含む追書きページに物理ページが割り当てられていない場合（ステップ５２：Ｎｏ）、重複排除プログラム１０００は、追書きページに物理ページを割り当てる（ステップ５３）。具体的には重複排除プログラム１０００は、ページ管理テーブル２００から未使用の物理ページを１つ選択し、そのページ＃及びそのページの属するプールのプール＃をそれぞれ、追書きページ＃（３５１）がＡＰ２のレコードのページ＃（３５２）とプール＃（３５３）に格納する。また重複排除プログラム１０００は、ページ管理テーブル２００から選択された物理ページのｕｓｅ（２０４）に“１”を格納する。逆に、ＰＡ２に物理ページが割り当てられている場合（ステップ５２：Ｙｅｓ）は、ステップ５３は行われない。【０１５３】
ステップ５４では、重複排除プログラム１０００は追書き空間マッピングテーブル３５０とページ管理テーブル２００を参照することで、圧縮チャンクの書き込み先の記憶デバイス２０のアドレスを算出する。続いて重複排除プログラム１０００は、ステップ５４で算出されたアドレスに、圧縮チャンクを書き込む（ステップ５５）。ステップ５６で重複排除プログラム１０００は、今回圧縮チャンクを書き込んだ追書きページの追書きページ＃をプール管理情報６００の最終書き込み位置（６０４）に代入し、また最後に書き込みを行った追書きページ内の相対アドレスを最終書き込み位置（６０４）に代入し、処理を終了する。【０１５４】
以上が、ステップ６１４０で行われる処理である。再び図１５の説明に戻る。【０１５５】
ステップ６１５０：重複排除プログラム１０００は、ＬＰ変換テーブル５００のレコードのうち、ＬＡ（５０１）が処理対象チャンクのＬＡに一致するレコードのＰＡ（５０３）に、圧縮チャンクのＰＡ（つまりＰＡ２）を格納し、Ｌｅｎｇｔｈ（５０４）に圧縮チャンクの長さ（Ｌ２）を格納する。その後重複排除プログラム１０００は、ステップ１０８０以降の処理を行う。【０１５６】
ステップ６２１０：重複排除プログラム１０００は、変数Ｄに１を加算する。またステップ６２１０が実行される場合、重複排除プログラム１０００は図１５の処理で処理対象となっているチャンク（圧縮チャンク）について、重複排除判定を行わず、またＦＰＭＱ４００にチャンクのメタデータを登録しない。【０１５７】
ステップ６２２０：重複排除プログラム１０００は、プール管理情報６００のメタデータ削除チャンク数（６０３）に１を加算する。その後重複排除プログラム１０００は、ステップ６１４０を行う。【０１５８】
最後に、ステップ１１０でＩ／Ｏプログラム１００が実行するデステージ処理の流れを、図１７を用いて説明する。【０１５９】
ステップ５０１０：Ｉ／Ｏプログラム１００は、キャッシュメモリ１４に格納された各データの中から、処理対象のデータを選択する。データの選択方法は、様々な方法がありえる。一例として、ホスト２からライトされた時刻が最も古いデータを選択する方法がある。その場合、ストレージコントローラ１０は、キャッシュメモリ１４に格納された各データについて、ホスト２からライトされた時刻を記憶しておく必要がある。以下では、ここで１チャンク分のデータが選択された場合の例を説明する。ただし別の実施形態として、複数のチャンク、たとえば仮想ボリューム上で連続している複数のチャンクが選択されてもよい。【０１６０】
ステップ５０２０：Ｉ／Ｏプログラム１００は、ステップ５０１０で選択されたデータの書き込み先仮想ページを特定する。以下では、ステップ５０２０でＶＰ＃ｐが特定された場合の例を説明する。そしてＩ／Ｏプログラム１００は仮想ボリューム管理テーブル３００を参照し、仮想ページ＃（３０１）が“ｐ”のレコードについて、ページ種別（３０５）が“０”か“１”かを判定する。ページ種別（３０５）が“１”の場合（ステップ５０２０：Ｎｏ）、データの書き込み先は上書き空間であるので、次にステップ５１１０が実行される。ページ種別（３０５）が“０”の場合（ステップ５０２０：Ｎｏ）、次にステップ５０３０が行われる。【０１６１】
ステップ５０３０：このステップが実行される場合、ＶＰ＃ｐに書き込まれたデータは追書き空間に移動されていることを意味する。この場合Ｉ／Ｏプログラム１００は、追書き空間に移動されているＶＰ＃ｐのデータを、再び上書き空間に戻すか否かを判定する。【０１６２】
たとえばＶＰ＃ｐ内のほぼ全てのチャンクが更新された場合、Ｉ／Ｏプログラム１００は、追書き空間に移動されているＶＰ＃ｐのデータを再び上書き空間に戻すと決定する。この場合、ＶＰ＃ｐが今後も頻繁に更新される可能性があるため、デステージのたびにデータを圧縮して格納すると、ライト処理のオーバヘッドが大きくなるためである。ただしこの判定方法は一例であり、これ以外の判定方法によって、追書き空間に移動されているＶＰ＃ｐのデータを、再び上書き空間に戻すか否かが判定されてもよい。ステップ５０３０の判定が否定的な場合、次にステップ５０４０が行われ、ステップ５０３０の判定が肯定的な場合、次にステップ５２１０が行われる。【０１６３】
ステップ５０４０：Ｉ／Ｏプログラム１００は、処理対象データを圧縮する。これはステップ１０４０〜ステップ１０６０で行われる処理と同じである。ステップ１０４０〜ステップ１０６０と同様に、Ｉ／Ｏプログラム１００はＦＰＫの算出も行う。【０１６４】
ステップ５０５０：Ｉ／Ｏプログラム１００は、処理対象データ（圧縮チャンク）を追書き空間に格納する。この処理はステップ１０７０と同様な処理である。つまり図１５のステップ６０１０〜ステップ６１５０の処理が行われる。図１５で説明した処理との違いは、Ｉ／Ｏプログラム１００はステップ６２１０で、変数Ｄに１を加算する代わりに、仮想ボリューム管理テーブル３００のメタデータ削減チャンク数（３０８）に１を加算する。それ以外の点は、先に説明した処理と同じ処理が行われる。ステップ５０５０の後、キャッシュメモリ１４から処理対象データを削除し、またバッファ７００から処理対象データ及びその圧縮チャンクを削除し、デステージ処理は終了する。【０１６５】
ステップ５２１０：追書き空間に移動されているＶＰ＃ｐのデータを、再び上書き空間に戻すと決定された場合、Ｉ／Ｏプログラム１００は、追書き空間に移動されているＶＰ＃ｐのデータを全て、記憶デバイス２０から読み出し、データを伸長し、一旦キャッシュメモリ１４に格納する。これは図１１を用いて説明した処理と同様の処理が行われればよい。【０１６６】
ステップ５２２０：Ｉ／Ｏプログラム１００は、ＶＰ＃ｐに物理ページを割り当てる。具体的には、Ｉ／Ｏプログラム１００はページ管理テーブル２００から未使用の物理ページを１つ選択し、そのページ＃及びそのページの属するプールのプール＃をそれぞれ、仮想ボリューム管理テーブル３００内の、仮想ページ＃（３０１）がｐのレコードのページ＃（３０６）とプール＃（３０７）に格納する。またＩ／Ｏプログラム１００は、ページ管理テーブル２００から選択された物理ページのｕｓｅ（２０４）に“１”を格納する。【０１６７】
ステップ５２３０：Ｉ／Ｏプログラム１００は、ＶＰ＃ｐに割り当てられた物理ページに、ステップ５２１０で読み出されたデータを格納する。具体的にはＩ／Ｏプログラム１００は、図１１のステップ１３と同様に、ページ管理テーブル２００を参照することでＶＰ＃ｐに割り当てられた物理ページの存在する記憶デバイス２０のＤＥＶ＃（２０２）、Ａｄｄｒ（２０３）を特定する。そしてＩ／Ｏプログラム１００は、特定された記憶デバイスに、ステップ５２１０で読み出されたデータを格納する。【０１６８】
ステップ５２４０：Ｉ／Ｏプログラム１００は、ＶＰ＃ｐに割り当てられた物理ページに、処理対象データを上書きし、デステージ処理を終了する。【０１６９】
ステップ５１１０：Ｉ／Ｏプログラム１００は、ＶＰ＃ｐに物理ページが割り当てられていない場合、物理ページを割り当てる。これはステップ５２２０と同様の処理である。ただしＶＰ＃ｐに既に物理ページが割り当てられている場合には、物理ページの割り当ては必要ない。【０１７０】
ステップ５１２０：ステップ５２４０と同様に、Ｉ／Ｏプログラム１００はＶＰ＃ｐに割り当てられた物理ページに、処理対象データを上書きし、デステージ処理を終了する。【０１７１】
なお、ここで説明したデステージ処理は一例であり、上で説明した処理と異なる処理が行われてもよい。たとえば、ＶＰ＃ｐのデータが追書き空間に移動されている場合、ステップ５０３０の判定を行わずに、必ず追書き空間に追記するようにしてもよい。【０１７２】
あるいは、追書き空間から上書き空間にデータを戻す場合、戻すデータの量が少なくなるような制御が行われてもよい。たとえばホスト２からＶＰ＃ｐのページ全体を更新する要求を受け付けた場合、キャッシュメモリ１４にはＶＰ＃ｐの１ページ分のデータが格納される。この状態の場合、追書き空間から上書き空間にデータを戻しても、キャッシュメモリ１４に格納されたデータをデステージすると、追書き空間から上書き空間に書き戻されたデータは上書きされてしまう。そのため、このような場合には、追書き空間から上書き空間にデータを戻さないようにする方が、効率がよい。【０１７３】
以上述べたように、実施例１に係るストレージ装置１は、ホスト２からのライトデータを圧縮し、さらに重複排除処理を行って、記憶デバイスに格納する。これにより、圧縮のみを行う場合、あるいは重複排除処理のみを行う場合に比べ、記憶領域をより節約することができる。【０１７４】
また実施例１に係るストレージ装置１は、圧縮率が高いチャンク（ステップ６０１０：Ｙｅｓ）、あるいはランダムライト比率が高い仮想ページに属するチャンク（ステップ６１１０：Ｙｅｓ）等の、所定条件に該当するチャンクのメタデータをＦＰＭＱ４００に登録しない。所定条件を満たすチャンクのメタデータがＦＰＭＱ４００に登録されない理由は、キャッシュメモリ１４の消費量を抑制するためである。ストレージ装置１がＦＰＭＱ４００に全チャンクのメタデータを登録すると、ＦＰＭＱ４００のサイズが過大になる。そのため実施例１に係るストレージ装置１は、ＦＰＭＱ４００に登録するチャンクのメタデータの量を抑制し、ＦＰＭＱ４００がキャッシュメモリ１４を過剰に占有することを防いでいる。【０１７５】
また、圧縮率が高いチャンクのメタデータがＦＰＭＱ４００に登録されない理由は、圧縮率が高いチャンク（つまり圧縮チャンクのサイズが小さい）について重複排除処理が行われても、圧縮率が低いチャンクの重複排除処理が行われる場合に比べて、重複排除処理による記憶領域の節約の効果が小さいためである。【０１７６】
またランダムライト比率が高い仮想ページに属するチャンクのメタデータがＦＰＭＱ４００に登録されない理由は、ランダムライト比率が高い仮想ページ（チャンク）は、ランダムライト比率が低い（シーケンシャルライト比率が高い）仮想ページに比べて、重複データが存在する可能性が低いという推定に基づく。シーケンシャルライト比率が高い仮想ページ（またはその仮想ページを含む仮想ボリューム）は、例えばデータのバックアップ用途で用いられている可能性が高い。特に複数世代のバックアップデータを仮想ページ（仮想ボリューム）に記憶している場合、同一データが存在する可能性が高いことが期待できる。一方ランダムライト比率が高い仮想ページ（またはその仮想ページを含む仮想ボリューム）は、そのようなデータが含まれていることが期待できないため、本実施例に係るストレージ装置１は、ランダムライト比率が高い仮想ページに属するチャンクのメタデータをＦＰＭＱ４００に登録しない制御を行っている。ただしこれらの条件は一例であり、チャンクのメタデータをＦＰＭＱ４００に登録しないチャンクは、別の条件によって選定されてもよい。
【実施例２】
【０１７７】
続いて実施例２に係るストレージ装置の説明を行う。実施例２に係るストレージ装置１のハードウェア構成は実施例１で説明したものと同じである。また実施例２に係るストレージ装置は、ローカルメモリ１６に実施例１で説明したプログラムと同じプログラムを有するとともに、キャッシュメモリ１４に実施例１で説明した管理情報と同じ管理情報を有する。【０１７８】
また実施例２に係るストレージ装置１は、実施例１で説明したプログラムに加えて、メタデータ削減プログラム２０００を有する。メタデータ削減プログラム２０００は、重複排除プログラム１０００がＦＰＭＱ４００に作成したチャンクのメタデータの削除の要否を判定し、必要に応じて一部のメタデータを削除するためのプログラムである。【０１７９】
図１８と図１９を用いて、メタデータ削減プログラム２０００の処理の流れを説明する。メタデータ削減プログラム２０００は定期的に実行される。また、実施例２に係るストレージ装置１は、プールごとにメタデータ削減プログラム２０００を実行する。以下では、ストレージ装置１が特定の１つのプールに対してメタデータ削減プログラム２０００を実行する例を説明する。【０１８０】
ステップ２０１０：メタデータ削減プログラム２０００は、ＦＰＭＱ４００の合計サイズが所定の規定値を超過しているか判定する。この判定は、実施例１で説明した重複排除プログラム１０００がステップ６１１０で行う処理、つまりＦＰＭＱ４００の合計サイズが所定の規定値を超過しているか判定する処理と同じである。ＦＰＭＱ４００の合計サイズが所定の規定値を超過している場合（ステップ２０１０：Ｙｅｓ）、次にステップ２０２０が行われる。ＦＰＭＱ４００の合計サイズが所定の規定値を超過していない場合（ステップ２０１０：Ｎｏ）、処理は終了する。【０１８１】
ステップ２０２０：ここでメタデータ削減プログラム２０００は変数Ｄ１を用意し、Ｄ１を初期化する（０を代入する）。またメタデータ削減プログラム２０００は、プール管理情報６００を参照することで、処理対象のプールに所属する仮想ボリュームを特定する。【０１８２】
さらにメタデータ削減プログラム２０００は、仮想ボリューム管理テーブル３００を参照し、特定された仮想ボリュームの中から、処理対象となる仮想ページを１つ選択する。具体的にはメタデータ削減プログラム２０００は、ページ種別（３０５）が“０”でステップ２０３０以降の処理が行われていない仮想ページの中から、最終更新時刻（３０４）が最も古いものを選択する。ページ種別（３０５）が“１”の仮想ページは、チャンクが上書き空間に割り当てられている物理ページに存在しており、チャンクのメタデータが作成されていないからである。また最終更新時刻（３０４）が最も古い仮想ページは、長時間ホスト２から更新されていないことを意味し、そのような仮想ページ内のチャンクのうち、他のチャンクと重複していないチャンクのメタデータは優先的に削除されてもよいからである。【０１８３】
ステップ２０３０：メタデータ削減プログラム２０００は、ステップ２０２０で選択された仮想ページについて、現在時刻と最終更新時刻（３０４）の差を算出し、この差が所定の閾値を超過しているか判定する。差が所定の閾値以上の場合（つまり所定の閾値以上の間更新されなかった仮想ページである場合）、次にステップ２０４０が行われる。差が所定の閾値未満の場合（ステップ２０２０：Ｎｏ）、処理対象のプール内に、所定の閾値以上の間更新されなかった仮想ページがないことを意味する。その場合メタデータ削減プログラム２０００は処理を終了する。【０１８４】
ステップ２０４０：メタデータ削減プログラム２０００は、ステップ２０２０で選択された仮想ページから、ステップ２０４０以降の処理が行われていないチャンク（のＬＡ）を１つ選択する。チャンクの選択方法は任意である。たとえばＬＡが小さいチャンクから順に選択されてもよい。なお、以下では、ここで選択されたチャンクのＬＡが“Ｌ”である前提で説明する。【０１８５】
ステップ２０５０：メタデータ削減プログラム２０００は、ＬＰ変換テーブル５００を参照することで、ステップ２０４０で選択されたチャンクのＦＰＭＱ登録（５０５）が“１”か“０”か判定する。ＦＰＭＱ登録（５０５）が“１”の場合（ステップ２０５０：Ｙｅｓ）、次にステップ２０６０が行われる。一方ＦＰＭＱ登録（５０５）が“０”の場合（ステップ２０５０：Ｎｏ）、ステップ２０６０〜ステップ２０９０はスキップされる。【０１８６】
ステップ２０６０：メタデータ削減プログラム２０００は、ステップ２０４０で選択されたチャンク（の圧縮チャンク）を記憶デバイス２０から読み出し、圧縮チャンクを伸長することでチャンクを生成し、チャンクのＦＰＫを算出する。ただし別の実施形態として、ストレージ装置１が圧縮チャンクからＦＰＫを生成するように構成されている場合、メタデータ削減プログラム２０００は記憶デバイス２０から読み出された圧縮チャンクを用いてＦＰＫを生成する。【０１８７】
ステップ２０７０，ステップ２０８０：メタデータ削減プログラム２０００は、ステップ２０６０で算出されたＦＰＫと同じＦＰＫが、ＦＰＭＱ４００に格納されているか判定する。この判定はステップ６０２０と同様だが、ステップ２０７０では、ＦＰＭＱ４００のレコードのうち、ＬＡ（４０２）が“Ｌ”のレコードは判定から除外される。ＬＡ（４０２）が“Ｌ”のレコードは、処理対象チャンクのメタデータだからである。ステップ２０６０で算出されたＦＰＫと同じＦＰＫが、ＦＰＭＱ４００に格納されている場合（ステップ２０８０：Ｙｅｓ）、ステップ２０９０はスキップされる。ステップ２０６０で算出されたＦＰＫと同じＦＰＫがＦＰＭＱ４００に存在しない場合（ステップ２０８０：Ｎｏ）、次にステップ２０９０が行われる。【０１８８】
ステップ２０９０：メタデータ削減プログラム２０００は、ＦＰＭＱ４００から処理対象チャンクのメタデータを削除する。また、メタデータ削減プログラム２０００はＤ１に１を加算する【０１８９】
ステップ２１００：すべてのチャンクについてステップ２０５０〜ステップ２０９０の処理が完了している場合（ステップ２１００：Ｙｅｓ）、次にステップ２１１０が行われる。まだステップ２０５０〜ステップ２０９０の処理が行われていないチャンクが残っている場合（ステップ２１００：Ｎｏ）、メタデータ削減プログラム２０００は再びステップ２０４０から処理を行う。【０１９０】
ステップ２１１０：メタデータ削減プログラム２０００は、仮想ボリューム管理テーブル３００のメタデータ削減チャンク数（３０８）に、変数Ｄ１の値を加算する。【０１９１】
ステップ２１２０：メタデータ削減プログラム２０００は、プール管理情報６００のメタデータ削除チャンク数（６０３）に、変数Ｄ１の値を加算する。【０１９２】
ステップ２１３０：メタデータ削減プログラム２０００は、次に処理対象とする仮想ページがあるか判定する。具体的には、ページ種別（３０５）が“０”で、まだステップ２１２０までの処理が行われていない仮想ページが残っているか、判定される。もし次に処理対象とする仮想ページが残っている場合には（ステップ２１３０：Ｎｏ）、メタデータ削減プログラム２０００は再びステップ２０１０から処理を繰り返す。処理対象となる仮想ページが残っていない場合（ステップ２１３０：Ｙｅｓ）、メタデータ削減プログラム２０００は処理を終了する。【０１９３】
このように、メタデータ削減プログラム２０００は、ＦＰＭＱ４００の合計サイズが所定の規定値を超過した場合、長時間更新されていないチャンクのうち、重複チャンクでないチャンクのメタデータをＦＰＭＱ４００から削除する。これにより、チャンクのメタデータが過剰に増加することを防ぐことができる。【０１９４】
なお、上で説明した実施例２では、メタデータ削減プログラム２０００の処理を除き、ストレージ装置１は実施例１で説明した処理と同じ処理を実行する例を説明した。つまり、たとえば実施例２における重複排除プログラム１０００も、実施例１で説明した処理（図１４、図１５の処理）を行う。実施例１において説明したように、重複排除プログラム１０００は、チャンクが所定条件を満たす場合（たとえば圧縮率が高い、あるいはランダムライト比率が高い仮想ページに属している）、そのチャンクのメタデータをＦＰＭＱ４００に登録しない。【０１９５】
ただし、実施例２に係るストレージ装置では、メタデータ削減プログラム２０００が行われることにより、必要性の低いチャンクのメタデータがＦＰＭＱ４００から削除される。そのため、実施例２の変形例として、重複排除プログラム１０００が必ずチャンクのメタデータをＦＰＭＱ４００に登録するように構成されていてもよい。つまり重複排除プログラム１０００が、図１５のステップ６０１０の判定、そしてステップ６１１０の判定を行わず、必ずステップ６０６０あるいはステップ６１２０を行うように構成されていてもよい。
【実施例３】
【０１９６】
続いて実施例３に係るストレージ装置の説明を行う。実施例３に係るストレージ装置１のハードウェア構成は実施例１または２で説明したものと同じである。また実施例３に係るストレージ装置１は、少なくとも実施例２で説明したプログラムと同じプログラムをローカルメモリ１６に保持するとともに、キャッシュメモリ１４に実施例２で説明した管理情報と同じ管理情報を有する。【０１９７】
また実施例３に係るストレージ装置１は、実施例２で説明したプログラムに加えて、メタデータ再作成プログラム３０００を有する。メタデータ再作成プログラム３０００は、メタデータ削減プログラム２０００によって削除されたチャンクのメタデータを再び作成するためのプログラムである。【０１９８】
図２０と図２１を用いて、メタデータ再作成プログラム３０００の処理の流れを説明する。メタデータ再作成プログラム３０００は定期的に実行される。また、実施例３に係るストレージ装置１は、プールごとにメタデータ再作成プログラム３０００を実行する。以下では、ストレージ装置１が特定の１つのプール、たとえばプール番号が０のプール（これを「プール＃０」と表記する）に対して、メタデータ再作成プログラム３０００を実行する例を説明する。【０１９９】
ステップ３０１０：メタデータ再作成プログラム３０００は、プール管理情報６００を参照し、プール＃０の累積重複排除対象チャンク数（６０２）が、メタデータ削除チャンク数（６０３）を超過したか判定する。累積重複排除対象チャンク数（６０２）が、メタデータ削除チャンク数（６０３）以下の場合（ステップ３０１０：Ｎｏ）、メタデータ再作成プログラム３０００は処理を終了するが、そうでない場合には次にステップ３０２０が行われる。【０２００】
ステップ３０２０：メタデータ再作成プログラム３０００は、プール管理情報６００を参照することで、処理対象のプールに所属する仮想ボリュームを特定する。さらにメタデータ再作成プログラム３０００は、仮想ボリューム管理テーブル３００を参照し、特定された仮想ボリュームの仮想ページの中から、処理対象となる仮想ページを選択する。また変数Ｐを用意し、Ｐを初期化する（０を代入する）。【０２０１】
ここでメタデータ再作成プログラム３０００は少なくとも、メタデータ削減チャンク数（３０８）が１以上の仮想ページを選択する。メタデータ削減チャンク数（３０８）が０の仮想ページには、これまでにチャンクのメタデータが削除されていないことを意味し、そのような仮想ページにはメタデータを再作成すべきチャンクが存在しないからである。以下では、処理対象のプールに属する仮想ページのうち、メタデータ削減チャンク数（３０８）が１以上の仮想ページのことを、処理候補仮想ページと呼ぶ。【０２０２】
ステップ３０３０：メタデータ再作成プログラム３０００は、ＬＰ変換テーブル５００を参照し、ステップ３０４０以降の処理がまだ行われていないチャンクのうち、ＦＰＭＱ登録（５０５）が“０”のチャンク（メタデータがＦＰＭＱ４００に登録されていないチャンク）を１つ選択する。以下、ここで選択されたチャンクを「処理対象チャンク」と呼ぶ。チャンクの選択方法は任意である。たとえばＬＡが小さいチャンクから順に選択されてもよい。【０２０３】
ステップ３０４０：ステップ３０３０で選択されたチャンク（処理対象チャンク）は、実際には圧縮チャンクとして追書き空間に格納されている。メタデータ再作成プログラム３０００は、処理対象チャンクの圧縮率を算出する。チャンクのサイズは固定（たとえば８ＫＢ）であり、またチャンクの圧縮後のサイズは、ＬＰ変換テーブル５００のＬｅｎｇｔｈ（５０４）に記録されているので、メタデータ再作成プログラム３０００は、チャンクのサイズと処理対象チャンクのＬｅｎｇｔｈ（５０４）を用いて圧縮率を算出する。算出された圧縮率が、ある閾値よりも小さい場合、次にステップ３０５０が行われる。一方算出された圧縮率が、ある閾値以上の場合には、ステップ３０５０〜ステップ３１１０はスキップされる。なお、この閾値はメタデータを作成するか否かを判定するための閾値であり、実施例１で説明したステップ６０１０の処理で用いられる閾値と同じ値である。ただし別の実施形態として、ステップ６０１０で用いられる閾値と異なる値の閾値が用いられるようにしてもよい。【０２０４】
ステップ３０５０：メタデータ再作成プログラム３０００は、処理対象チャンク（の圧縮チャンク）を記憶デバイス２０から読み出して、ＦＰＫを算出する。この処理はステップ２０５０と同じである。【０２０５】
ステップ３０６０：メタデータ再作成プログラム３０００は、ステップ３０５０で算出されたＦＰＫと同じＦＰＫが、ＦＰＭＱ４００に格納されているか判定する。これはステップ６０２０等と同じ処理である。【０２０６】
ステップ３０７０：ステップ３０６０の結果、ステップ３０５０で算出されたＦＰＫと同じＦＰＫがＦＰＭＱ４００に格納されている場合、次にステップ３０８０が行われる。一方、ステップ３０５０で算出されたＦＰＫと同じＦＰＫがＦＰＭＱ４００に格納されていない場合、ステップ３０８０〜ステップ３１１０はスキップされる。【０２０７】
ステップ３０８０：メタデータ再作成プログラム３０００は、ステップ３０５０で求められたＦＰＫと同じＦＰＫを持つチャンク（圧縮チャンク）を記憶デバイス２０から読み出し、これとステップ３０５０で読み出されたチャンク（圧縮チャンク）の内容を比較し、両者が同一か否か判定する。この処理はステップ６０４０と同様の処理である。ステップ６０４０と同様に、ステップ３０８０ではメタデータ再作成プログラム３０００は、ＦＰＭＱ４００、ＬＰ変換テーブル５００を参照することで、ステップ３０５０で求められたＦＰＫと同じＦＰＫを持つチャンク（圧縮チャンク）の格納されているＰＡ及びその長さを特定する。以下、このチャンクを“重複候補チャンク”と呼ぶ。また以下では、重複候補チャンクのＰＡが“ＰＡ１”だった場合の例を説明する。【０２０８】
ステップ３０９０：ステップ３０８０の結果、処理対象チャンクと重複候補チャンクの内容が同じ場合（ステップ３０９０：Ｙｅｓ）、次にステップ３１００が行われる。両者が異なる場合（ステップ３０９０：Ｎｏ）、ステップ３１００〜ステップ３１１０はスキップされる。【０２０９】
ステップ３１００：メタデータ再作成プログラム３０００は、ＦＰＭＱ４００に、処理対象チャンクのメタデータを登録する。またメタデータ再作成プログラム３０００は、ＬＰ変換テーブル５００のレコードのうち、ＬＡ（５０１）が処理対象チャンクのＬＡに一致するレコードのＦＰＭＱ登録（５０５）に“１”を格納し、変数Ｐに１を加算する。【０２１０】
ステップ３１１０：メタデータ再作成プログラム３０００は、ＬＰ変換テーブル５００のレコードのうち、ＬＡ（５０１）が処理対象チャンクのＬＡに一致するレコードのＰＡ（５０３）に、重複候補チャンクのＰＡ（つまりＰＡ１）を格納し、Ｌｅｎｇｔｈ（５０４）に重複候補チャンクの長さを格納する。【０２１１】
ステップ３１３０：メタデータ再作成プログラム３０００は、ページ内の全てのチャンクについて、ステップ３１１０までの処理が完了したか判定する。ページ内の全てのチャンクについて、ステップ３１１０までの処理が完了している場合（ステップ３１３０：Ｙｅｓ）、次にステップ３１４０が行われる。まだステップ３１１０までの処理が行われていないチャンクが残っている場合、メタデータ再作成プログラム３０００は再びステップ３０３０を実行する。【０２１２】
ステップ３１４０：メタデータ再作成プログラム３０００は、仮想ボリューム管理テーブル３００に記録されている、仮想ページの情報を更新する。具体的には仮想ページの、メタデータ削減チャンク数（３０８）から、変数Ｐの値（メタデータが作成されたチャンクの数である）を削減する。【０２１３】
ステップ３１６０：メタデータ再作成プログラム３０００は、プール内に含まれている処理候補仮想ページの中に、まだステップ３１４０までの処理が完了していない仮想ページがあるかしたか判定する。全ての処理候補仮想ページについてステップ３１４０までの処理が完了している場合（ステップ３１６０：Ｙｅｓ）、メタデータ再作成プログラム３０００は次にステップ３１７０を実行し、処理を終了する。まだステップ３１４０までの処理が行われていない仮想ページが残っている場合、メタデータ再作成プログラム３０００は再びステップ３０２０を実行する。【０２１４】
ステップ３１７０：メタデータ再作成プログラム３０００は、プール管理情報６００の、プール＃０の情報を更新する。具体的には、プール＃０の累積重複排除対象チャンク数（６０２）が初期化される（０にする）。またプール＃０のメタデータ削除チャンク数（６０３）から、変数Ｐの値を削減する。これらの処理が完了すると、メタデータ再作成プログラム３０００は処理を終了する。【０２１５】
このように、実施例３に係るストレージ装置は、メタデータ削減プログラム２０００によって一旦削除されたチャンクのメタデータを再び作成する。実施例２において説明したとおり、実施例２または３に係るストレージ装置は、長時間更新されていないチャンクのうち、重複チャンクでないチャンクのメタデータを削除する。【０２１６】
ただし、メタデータ削除後に、メタデータを削除したチャンクと同内容のチャンクが書き込まれる可能性もある。実施例１（特に図１５）で説明した重複排除プログラム１０００の処理からわかるとおり、チャンクのメタデータが削除されていると、ホストからそのチャンクと同内容のチャンクが書き込まれたとしても重複排除処理が行われない。そのため、実施例３に係るストレージ装置は、一旦メタデータを削除したチャンクについて、チャンクのメタデータの再作成を行うことで、格納データ量が削減されるようにする。【０２１７】
なお、実施例３では累積重複排除対象チャンク数（６０２）がメタデータ削除チャンク数（６０３）を超過した時に、チャンクのメタデータの再作成が行われる例（ステップ３０１０）を説明した。ただしメタデータの再作成要否の判定方法はこれに限られない。所定の条件を満たした場合に、チャンクのメタデータの再作成が行われるようにしてもよい。たとえば新たに追書き空間に書き込まれたチャンクの量が増加すれば、重複データの存在する可能性は上がると考えることもできる。そのため、累積重複排除対象チャンク数（６０２）があらかじめ定められた閾値（固定値）を超過したという条件を満たした場合にメタデータの再作成が行われるようにしてもよい。あるいは、メタデータ削減プログラム２０００が実行されてから所定時間経過した場合に、チャンクのメタデータの再作成が行われるようにしてもよい。【０２１８】
以上、本発明の実施例を説明したが、これらは、本発明の説明のための例示であって、本発明の範囲をこれらの実施例にのみ限定する趣旨ではない。すなわち、本発明は、他の種々の形態でも実施する事が可能である。たとえば上では、ストレージ装置がキャッシュメモリとローカルメモリという２種類のメモリを有する例を説明したが、別の実施形態として、ストレージ装置がキャッシュメモリとローカルメモリのうち、いずれか一方のメモリだけを有する構成でも良い。その場合、全ての情報がキャッシュメモリ（またはローカルメモリ）に格納される。【０２１９】
また、ストレージ装置に階層記憶管理（ＨＳＭ）機能が実装されていてもよい。たとえばＨＳＭ機能が、キャッシュメモリと記憶デバイスから成る記憶階層を管理するように構成されていてよい。これにより、ＦＰＭＱ等の管理情報のサイズが大きくなった場合、ＨＭＳ機能はたとえばＦＰＭＱの一部のレコードを記憶デバイスに移動し、記憶デバイスに移動されたＦＰＭＱ（のレコード）に対するアクセスの必要性が発生した時点で、そのレコードを記憶デバイスからキャッシュメモリにリコールするように構成されてもよい。【０２２０】
また、上では、ストレージ装置が使用するいくつかの情報が、ページ管理テーブル２００等のテーブル構造で管理される例を説明したが、テーブル構造で情報を管理する態様に限定されるわけではない。ストレージ装置はテーブル以外のデータ構造、例えばリスト構造などを用いて、情報を管理してもよい。【０２２１】
また、上で説明した各実施例では、ストレージ装置が累積重複排除対象チャンク数とメタデータ削除チャンク数を計数・管理する例を説明したが、これらの情報は実施例３に係るストレージ装置が使用する情報である。そのため、実施例１または実施例２に係るストレージ装置は、必ずしも累積重複排除対象チャンク数とメタデータ削除チャンク数を保持しなくともよい。【０２２２】
また、上で説明した実施例では、追書き空間に格納されるデータは圧縮データであったが、追書き空間にチャンクを移動する際に圧縮を行わず、重複排除処理だけが行われてもよい。【０２２３】
また、上で説明した実施例に係る計算機システムでは、ホストとストレージ装置が異なるハードウェアとして存在していたが、計算機システムはこれ以外の構成を採用してもよい。たとえば、ホストに１以上の記憶デバイスを搭載し、ホストのＣＰＵで、上の実施例で説明したプログラムを実行させるようにしてもよい。
【符号の説明】
【０２２４】
１：ストレージ装置，  ２：ホスト，  ３：ＳＡＮ，  ５：管理ホスト，  １０：ストレージコントローラ，  １１：ＣＰＵ，  １２ホストＩ／Ｆ，  １３：デバイスＩ／Ｆ，  １４：キャッシュメモリ，  １５：管理用Ｉ／Ｆ，１６：ローカルメモリ，  ２０：記憶デバイス
【図１】
2017141315.tif 000003
【図２】
2017141315.tif 000004
【図３】
2017141315.tif 000005
【図４】
2017141315.tif 000006
【図５】
2017141315.tif 000007
【図６】
2017141315.tif 000008
【図７】
2017141315.tif 000009
【図８】
2017141315.tif 000010
【図９】
2017141315.tif 000011
【図１０】
2017141315.tif 000012
【図１１】
2017141315.tif 000013
【図１２】
2017141315.tif 000014
【図１３】
2017141315.tif 000015
【図１４】
2017141315.tif 000016
【図１５】
2017141315.tif 000017
【図１６】
2017141315.tif 000018
【図１７】
2017141315.tif 000019
【図１８】
2017141315.tif 000020
【図１９】
2017141315.tif 000021
【図２０】
2017141315.tif 000022
【図２１】
2017141315.tif 000023
【国際調査報告】
2017141315.tif 000024
2017141315.tif 000025
2017141315.tif 000026
2017141315.tif 000027