(57)【要約】【課題】単独領域に関して、記憶領域の回収、及び、記憶領域間でのデータセットのコピーを、迅速に行う。【解決手段】データ入出力要求を発行する外部計算機と、データを格納する記憶デバイスと、に接続された計算機システムにおいて、記憶デバイス側の第１のレイヤの論理記憶領域と、外部計算機側の第２のレイヤの論理記憶領域とがある。第１のレイヤの論理記憶領域は、共通領域と単独領域とを有する。共通領域の記憶領域は第２のレイヤの論理記憶領域の一つ又は複数の記憶領域に関係付けられるようになっている。単独領域の記憶領域は、第２のレイヤの論理記憶領域の一つの記憶領域に関係付けられるようになっている。計算機システムは、複数のデータセットの重複判断を行い、重複していると判断した複数のデータセットを共通領域に対応付けることで、共通領域の記憶領域を第２のレイヤの論理記憶領域の複数の記憶領域に関係付ける。【選択図】  図１
2019159605.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサ部と、メモリとを有し、データ入出力要求を発行する外部計算機と、データを格納する記憶デバイスと、に接続された計算機システムにおいて、
前記プロセッサ部は、互いのレイヤの記憶領域が関係付けられた複数のレイヤの論理記憶領域を生成し、
前記複数のレイヤの論理記憶領域は、前記記憶デバイス側の第１のレイヤの論理記憶領域と、前記外部計算機側の第２のレイヤの論理記憶領域と、を有し、
前記第１のレイヤの論理記憶領域は、共通領域と単独領域とを有し、前記共通領域の記憶領域は前記第２のレイヤの論理記憶領域の一つ又は複数の記憶領域に関係付けられるようになっており、前記単独領域の記憶領域は前記第２の論理記憶領域の一つの記憶領域に関係付けられるようになっており、
前記プロセッサ部は、複数のデータセットの重複判断を行い、重複していると判断した複数のデータセットを前記共通領域に対応付けることで、前記共通領域の記憶領域を前記第２の論理記憶領域の複数の記憶領域に関係付ける
計算機システム。
【請求項２】
前記プロセッサ部は、
前記単独領域の記憶領域に対応付けられたデータセットの削除要求を受けた場合に、前記単独領域の記憶領域を解放する第１の削除処理と、
前記共通領域の記憶領域に対応付けられたデータの削除要求を受けた場合に、前記当該データにかかる第１のレイヤの論理記憶領域の記憶領域と、前記第２のレイヤの論理記憶領域の記憶領域との関係付けを解消する第２の削除処理と、
前記共通領域の記憶領域であり、前記第２のレイヤの論理記憶領域と関係付けられていない記憶領域を解放する共通領域解放処理と、
を行う、請求項１に記載の計算機システム。
【請求項３】
前記共通領域に対応付けて格納したデータセットにかかる第１のレイヤの論理記憶領域の記憶領域と、前記第２のレイヤの論理記憶領域の記憶領域との関係情報を記録する重複排除情報を有し、
前記プロセッサ部は、前記共通領域の記憶領域への対応付けを行った場合、及び前記第２の削除処理を行った場合に、前記重複排除情報を更新し、
前記プロセッサ部は、前記共通領域解放処理を、前記重複排除情報を参照して行う
請求項２に記載の計算機システム。
【請求項４】
前記重複判断の対象となる複数のデータセットは、ライト要求にかかるデータセットと、前記単独領域に対応付けられているデータセットと、前記共通領域に対応付けられているデータセットとのうちの少なくとも二つのデータセットを含む
請求項１に記載の計算機システム。
【請求項５】
前記重複判断の対象となる複数のデータセットには、ライト要求にかかるデータセット、前記単独領域に対応付けられているデータセット、及び、前記共通領域に対応付けられているデータセットが該当し、
前記単独領域に対応付けられている複数のデータセットが重複すると判断された場合、前記プロセッサ部は、当該複数のデータセットにかかる第２のレイヤの論理記憶領域を、前記共通領域の記憶領域に関係付けるとともに、当該複数のデータセットにかかる前記単独領域の記憶領域との関係付けを解消する
請求項１に記載の計算機システム。
【請求項６】
前記共通領域の記憶領域は、前記第２のレイヤの論理記憶領域の１または複数の前記記憶領域に関係づけられ、
前記第２の削除処理により、関係付けられた前記第２のレイヤの論理記憶領域の記憶領域が減少し、前記共通領域解放処理により、解放される
請求項２に記載の計算機システム。
【請求項７】
前記第１のレイヤの論理記憶領域及び前記第２のレイヤの論理記憶領域の記憶領域が関係付けられる第３のレイヤの論理記憶領域を有し、
前記第３のレイヤの論理記憶領域は、データの上書きができない追記空間で構成され、それぞれ前記単独領域と前記共通領域に関係付けられる追記単独領域と追記共通領域とを有する
請求項１に記載の計算機システム。
【請求項８】
データ入出力要求を発行する外部計算機と、データを格納する記憶デバイスと、に接続された計算機システムの記憶制御方法であって、
互いのレイヤの記憶領域が関係付けられた複数のレイヤの論理記憶領域を生成し、
前記複数のレイヤの論理記憶領域は、前記記憶デバイス側の第１のレイヤの論理記憶領域と、前記外部計算機側の第２のレイヤの論理記憶領域と、を有し、
前記第１のレイヤの論理記憶領域は、共通領域と単独領域とを有し、前記共通領域の記憶領域は前記第２のレイヤの論理記憶領域の一つ又は複数の記憶領域に関係付けられるようになっており、前記単独領域の記憶領域は前記第２の論理記憶領域の一つの記憶領域に関係付けられるようになっており、
複数のデータセットの重複判断を行い、
重複していると判断した複数のデータセットを前記共通領域に対応付けることで、前記共通領域の記憶領域を前記第２の論理記憶領域の複数の記憶領域に関係付ける
記憶制御方法。
【請求項９】
データ入出力要求を発行する外部計算機と、データを格納する記憶デバイスと、に接続された計算機に、
互いのレイヤの記憶領域が関係付けられた複数のレイヤの論理記憶領域を生成し、
前記複数のレイヤの論理記憶領域は、前記記憶デバイス側の第１のレイヤの論理記憶領域と、前記外部計算機側の第２のレイヤの論理記憶領域と、を有し、
前記第１のレイヤの論理記憶領域は、共通領域と単独領域とを有し、前記共通領域の記憶領域は前記第２のレイヤの論理記憶領域の一つ又は複数の記憶領域に関係付けられるようになっており、前記単独領域の記憶領域は前記第２の論理記憶領域の一つの記憶領域に関係付けられるようになっており、
複数のデータセットの重複判断を行い、
重複していると判断した複数のデータセットを前記共通領域に対応付けることで、前記共通領域の記憶領域を前記第２の論理記憶領域の複数の記憶領域に関係付ける
ことを実行させるコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、概して、データ量削減機能を有する計算機システムでの記憶制御に関する。
【背景技術】
【０００２】
計算機システムの一例として、ストレージシステムがある。データ量削減機能を有するストレージシステムとして、例えば、特許文献１に開示のストレージシステム、すなわち、ガベージコレクション機能を有するストレージシステムが知られている。特許文献１には、次のことが開示されている。
【０００３】
ストレージシステムは、記憶デバイスと、ガベージコレクション機能を有するストレージコントローラとを有する。ストレージコントローラが、仮想アドレスと、記憶デバイスの物理アドレスとのマッピングを管理する。ストレージコントローラは、仮想アドレスに対するライトが発生した場合、その仮想アドレスに対し、既に割り当てられている物理アドレスに代えて新たなライト先の空き物理アドレスをマッピングするというマッピング更新（アドレス変換テーブルの更新）を行う。その結果、無効データ（仮想アドレスに対するマッピングが解除された物理アドレスに従うデータ）が増える。ストレージコントローラは、有効データ（いずれかの仮想アドレスにマッピングされている物理アドレスに従うデータ）をコピーし無効データを削除するガベージコレクションを実行する。これにより、データ量が削減され、空き物理アドレス（空き領域）が増える。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】US 8,527,544
【発明の概要】
【発明が解決しようとする課題】
【０００５】
一般に、ストレージシステムにおいて、論理記憶領域の複数のレイヤがある。以下、複数のレイヤのうちの第１レイヤの論理記憶領域を「第１論理記憶領域」と呼び、複数のレイヤのうちの第２レイヤの論理記憶領域を「第２論理記憶領域」と呼ぶことにする。第２レイヤは第１レイヤよりも上のレイヤである。第１論理記憶領域は、複数の部分領域で構成されている。第２論理記憶領域は、例えば、Thin Provisioningに従う仮想ボリューム（仮想的な論理ボリューム）であり、その場合、第１論理記憶領域は、仮想ボリュームに割り当てられ得る複数のページ（部分領域の一例）で構成されたプールである。
【０００６】
データ量削減機能の１つとして、重複排除機能がある。重複排除機能は、一般に、複数の論理アドレス（２以上の第２論理記憶領域における異なる複数のライト先）にそれぞれ対応した複数のデータセットの重複を検出した場合、複数の論理アドレスの参照先を、複数のデータセットのうちのいずれかのデータセット（重複データセット）が格納される部分領域とし、残りのデータセットを削除する機能である。
【０００７】
部分領域には、重複データセットと単独データセット（いずれのデータセットとも重複しないデータセット）とが混在し得る。
【０００８】
そのため、割り当てられた部分領域を適宜に回収する（未使用の部分領域とする）ことを迅速に行うことが困難である。例えば、部分領域の回収として、削除対象の第２論理記憶領域に割り当てられている部分領域を回収することがあるが、その際には、回収対象の部分領域内のデータセット毎に重複データセットと単独データセットのいずれであるかの判別が必要となる。また、例えば、部分領域の回収として、有効データセット（いずれかの論理アドレスの参照先である領域内のデータセット）を部分領域間でコピーしコピー元の部分領域を回収すること（ガベージコレクション処理）があるが、重複データセットが有効データセットの場合には参照先の更新を複数の論理アドレスについて行うことが必要となる。
【０００９】
また、部分領域間でのデータセットのコピーも迅速に行うことが困難となり得る。コピー対象のデータセットが重複データセットの場合には、上述したように、参照先の更新を複数の論理アドレスについて行うことが必要となるからである。なお、「コピー」は、コピー元にデータセットが残る「レプリケーション」と、コピー元からデータセットが削除されるマイグレーションのいずれであってもよい。
【００１０】
同様の問題は、計算機システムの一例として、データ量削減機能を有するサーバシステム（例えば、ＨＤＤ（Hard Disk Drive）のような補助記憶デバイスを有するサーバ）が採用された場合にもあり得る。
【課題を解決するための手段】
【００１１】
データ入出力要求を発行する外部計算機と、データを格納する記憶デバイスと、に接続された計算機システムにおいて、複数のレイヤの論理記憶領域は、記憶デバイス側の第１のレイヤの論理記憶領域と、外部計算機側の第２のレイヤの論理記憶領域と、を有する。第１のレイヤの論理記憶領域は、共通領域と単独領域とを有する。共通領域の記憶領域は第２のレイヤの論理記憶領域の一つ又は複数の記憶領域に関係付けられるようになっている。単独領域の記憶領域は、第２のレイヤの論理記憶領域の一つの記憶領域に関係付けられるようになっている。計算機システムは、複数のデータセットの重複判断を行い、重複していると判断した複数のデータセットを共通領域に対応付けることで、共通領域の記憶領域を第２のレイヤの論理記憶領域の複数の記憶領域に関係付ける。
【発明の効果】
【００１２】
単独領域に関して、記憶領域の回収、及び、記憶領域間でのデータセットのコピーを、迅速に行うことができる。
【図面の簡単な説明】
【００１３】
【図１】本発明の一実施形態の概要を示す。
【図２】一比較例の概要を示す。
【図３】ストレージシステムを含むシステム全体の構成を示す。
【図４】ストレージコントローラ内のメモリの構成と、そのメモリ内のプログラム及び管理情報とを示す。
【図５】ストレージシステム内の記憶階層を示す。
【図６】追記ページへの追記を模式的に示す。
【図７】重複排除処理を模式的に示す。
【図８】ＶＯＬ管理テーブルの構成を示す。
【図９】アドレス変換テーブルの構成を示す。
【図１０】有効領域管理テーブルの構成を示す。
【図１１】ページ変換テーブルの構成を示す。
【図１２】ページ割当管理テーブルの構成を示す。
【図１３】サブブロック管理テーブルの構成を示す。
【図１４】追記先検索テーブルの構成を示す。
【図１５】重複チェックテーブルの構成を示す。
【図１６】ハッシュ管理テーブルの構成を示す。
【図１７】重複管理テーブルの構成を示す。
【図１８】共通領域割当管理テーブルの構成を示す。
【図１９】共通領域参照元チェックテーブルの構成を示す。
【図２０】フロントエンドライト処理の流れを示す。
【図２１】データ量削減処理の流れを示す。
【図２２】重複排除処理の流れを示す。
【図２３】重複判断処理の流れを示す。
【図２４】追記処理の流れを示す。
【図２５】リード処理の流れを示す。
【図２６】提供ボリューム削除処理の流れを示す。
【図２７】ガベージコレクション処理の流れを示す。
【図２８】共通領域解放処理の流れを示す。
【発明を実施するための形態】
【００１４】
以下の説明では、「インターフェース部」は、１以上のインターフェースでよい。当該１以上のインターフェースは、１以上の同種の通信インターフェースデバイス（例えば１以上のＮＩＣ（Network Interface Card））であってもよいし２以上の異種の通信インターフェースデバイス（例えばＮＩＣとＨＢＡ（Host Bus Adapter））であってもよい。
【００１５】
また、以下の説明では、「メモリ部」は、１以上のメモリであり、典型的には主記憶デバイスでよい。メモリ部における少なくとも１つのメモリは、揮発性メモリであってもよいし不揮発性メモリであってもよい。
【００１６】
また、以下の説明では、「ＰＤＥＶ部」は、１以上のＰＤＥＶであり、典型的には補助記憶デバイスでよい。「ＰＤＥＶ」は、物理的な記憶デバイス（Physical storage DEVice）を意味し、典型的には、不揮発性の記憶デバイス、例えばＨＤＤ（Hard Disk Drive）又はＳＳＤ（Solid State Drive）である。
【００１７】
また、以下の説明では、「記憶部」は、メモリ部とＰＤＥＶ部の少なくとも一部とのうちの少なくとも１つ（典型的には少なくともメモリ部）である。
【００１８】
また、以下の説明では、「プロセッサ部」は、１以上のプロセッサである。少なくとも１つのプロセッサは、典型的には、ＣＰＵ（Central Processing Unit）のようなマイクロプロセッサであるが、ＧＰＵ（Graphics Processing Unit）のような他種のプロセッサでもよい。少なくとも１つのプロセッサは、シングルコアでもよいしマルチコアでもよい。少なくとも１つのプロセッサは、処理の一部又は全部を行うハードウェア回路（例えばＦＰＧＡ（Field-Programmable Gate Array）又はＡＳＩＣ（Application Specific Integrated Circuit））といった広義のプロセッサでもよい。
【００１９】
また、以下の説明では、「ｘｘｘテーブル」といった表現にて、入力に対して出力が得られる情報を説明することがあるが、当該情報は、どのような構造のデータでもよいし、入力に対する出力を発生するニューラルネットワークのような学習モデルでもよい。従って、「ｘｘｘテーブル」を「ｘｘｘ情報」と言うことができる。また、以下の説明において、各テーブルの構成は一例であり、１つのテーブルは、２以上のテーブルに分割されてもよいし、２以上のテーブルの全部又は一部が１つのテーブルであってもよい。
【００２０】
また、以下の説明では、「プログラム」を主語として処理を説明する場合があるが、プログラムは、プロセッサ部によって実行されることで、定められた処理を、適宜に記憶部及び／又はインターフェース部等を用いながら行うため、処理の主語が、プロセッサ部（或いは、そのプロセッサ部を有するコントローラのようなデバイス）とされてもよい。プログラムは、プログラムソースから計算機のような装置にインストールされてもよい。プログラムソースは、例えば、プログラム配布サーバ又は計算機が読み取り可能な（例えば非一時的な）記録媒体であってもよい。また、以下の説明において、２以上のプログラムが１つのプログラムとして実現されてもよいし、１つのプログラムが２以上のプログラムとして実現されてもよい。
【００２１】
また、以下の説明では、「計算機システム」は、１以上の物理的な計算機を含んだシステムである。物理的な計算機は、汎用計算機でも専用計算機でもよい。物理的な計算機は、Ｉ／Ｏ（Input/Output）要求を発行する計算機（例えばホスト計算機）として機能してもよいし、Ｉ／Ｏ要求に応答してデータのＩ／Ｏを行う計算機（例えばストレージ装置）として機能してもよい。すなわち、計算機システムは、Ｉ／Ｏ要求を発行する１以上のホスト計算機であるホストシステム、及び、Ｉ／Ｏ要求に応答してデータのＩ／Ｏを行う１以上のストレージ装置であるストレージシステムのうちの少なくとも１つでよい。少なくとも１つの物理的な計算機において、１以上の仮想的な計算機（例えばＶＭ（Virtual Machine））が実行されてもよい。仮想的な計算機は、Ｉ／Ｏ要求を発行する計算機でもよいし、Ｉ／Ｏ要求に応答してデータのＩ／Ｏを行う計算機でもよい。
【００２２】
また、計算機システムは、１以上（典型的には複数）の物理的なノード装置で構成された分散システムでよい。物理的なノード装置は、物理的な計算である。
【００２３】
また、物理的な計算機（例えばノード装置）が所定のソフトウェアを実行することにより、当該物理的な計算機、又は、当該物理的な計算機を含んだ計算機システムに、ＳＤｘ（Software-Defined anything）が構築されてもよい。ＳＤｘとしては、例えば、ＳＤＳ（Software Defined Storage）又はＳＤＤＣ（Software-defined Datacenter）を採用することができる。例えば、ストレージ機能を有するソフトウェアが物理的な汎用の計算機で実行されることにより、ＳＤＳとしてのストレージシステムが構築されてもよい。また、少なくとも１つの物理的な計算機（例えばストレージ装置）が、ホストシステムとしての１以上の仮想的な計算機と、ストレージシステムのストレージコントローラ（典型的には、Ｉ／Ｏ要求に応答してデータをＰＤＥＶ部に対して入出力する装置）としての仮想的な計算機とが実行されてもよい。言い換えれば、当該少なくとも１つの物理的な計算機は、ホストシステムの少なくとも一部として機能と、ストレージシステムの少なくとも一部としての機能の両方を有してもよい。
【００２４】
また、計算機システム（典型的にはストレージシステム）は、冗長構成グループを有してよい。冗長構成は、Erasure Coding、ＲＡＩＮ（Redundant Array of Independent Nodes）及びノード間ミラーリングのように複数のノード装置での構成でもよいし、ＰＤＥＶ部の少なくとも一部としての１以上のＲＡＩＤ（Redundant Array of Independent (or Inexpensive) Disks）グループのように単一の計算機（例えばノード装置）での構成でもよい。
【００２５】
また、以下の説明では、「データセット」とは、アプリケーションプログラムのようなプログラムから見た１つの論理的な電子データの塊であり、例えば、レコード、ファイル、キーバリューペア及びタプルのうちのいずれでもよい。
【００２６】
また、以下の説明では、種々の対象の識別情報として、識別番号が使用されるが、識別番号以外の種類の識別情報（例えば、英字や符号を含んだ識別子）も採用可能である。
【００２７】
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号（又は、参照符号のうちの共通符号）を使用し、同種の要素を区別して説明する場合は、要素の識別番号（又は参照符号）を使用することがある。例えば、ページを特に区別しないで説明する場合には、「ページ５１」と記載し、個々のページを区別して説明する場合には、「ページ０」、「ページ１」のように記載することや、「ページ５１Ｐ」、「ページ５１Ｃ」のように記載することがある。
【００２８】
以下、図面を参照して、本発明の一実施形態を説明する。
【００２９】
図１は、本発明の一実施形態の概要を示す。なお、図１を参照した説明では、適宜、図３に記載の参照符号を使用することとする。
【００３０】
計算機システムの一例として、ストレージシステム２００が採用されている。ストレージシステム２００において、論理記憶領域（論理アドレス空間）の複数のレイヤがある。第１レイヤに属する１以上の第１論理記憶領域の一例が、１以上のプール５０３である。第２レイヤ（第１レイヤよりも上のレイヤ）に属する複数の第２論理記憶領域の一例が、複数の論理ボリューム５０１である。論理ボリューム５０１は、容量仮想化技術（典型的にはThin Provisioning）に従う仮想的な論理ボリュームである。論理ボリューム５０１のライト先論理アドレスに、プール５０３における未割当（空き）のページ５１が割り当てられる。
【００３１】
ストレージシステム２００は、ストレージコントローラ１０１を有する。ストレージコントローラ１０１は、プロセッサ部を含むコントローラの一例である。ストレージコントローラ１０１は、データ量削減機能として、重複排除機能を有する。
【００３２】
本実施形態では、重複データセットが格納される空間である共通領域８０と、単独データセットが格納される空間である単独領域７０とが用意される。言い換えれば、ストレージシステム２００における論理アドレス空間が、共通領域８０と単独領域７０とに論理的に区別される。例えば、複数の論理ボリューム５０１は、それぞれＩ／Ｏ元から認識され得る２以上の論理ボリュームである２以上の提供ボリューム５０１Ｐを含む。
【００３３】
ストレージコントローラ１０１は、提供ボリューム０をライト先としたライト要求に従う対象データセットが、いずれかの１以上のデータセットと重複するデータセットであるか否かを判断する重複判断処理を行う。重複判断処理は、当該ライト要求の処理において行われる処理（インプロセス）と、当該ライト要求に従う対象データセットの格納の後に当該ライト要求の処理と非同期に行われる処理（ポストプロセス）のいずれであってもよい。重複判断処理の対象となる複数のデータセットは、ライト要求にかかるデータセットと、単独領域７０に対応付けられているデータセットと、共通領域８０に対応付けられているデータセットとのうちの少なくとも二つのデータセットを含む。すなわち、ストレージシステム２００内に既に重複しているデータセットが存在する場合、３以上のデータセットが重複することもあり得る。なお、インプロセスでの重複判断処理では、ライト要求にかかるデータセットが、単独領域７０に対応付けられているデータセット、又は、共通領域８０に対応付けられているデータセットと重複するか否かが判断される。重複するとの判断の場合、ライト要求にかかるデータセットが削除（重複排除）されるため、単独領域７０におけるデータセットの削除（例えば、後述の単独ページ５１Ｐの回収）は不要である。
【００３４】
重複判断処理の結果、対象データセットがいずれのデータセットとも重複しない単独データセットＡであれば、ストレージコントローラ１０１は、当該データセットＡに関する格納先を、単独領域７０に属し提供ボリューム０に対応したページ０とする。単独領域７０に属するページを、以下、「単独ページ」と言うことがある。図１の例によれば、ページ０及び１の各々が、単独ページ５１Ｐである。
【００３５】
重複判断処理の結果、対象データセットがいずれかの１以上のデータセットと重複するデータセットＢ（又はＣ）であれば、ストレージコントローラ１０１は、重複データセットＢ（又はＣ）に関する格納先を、共通領域８０に属するページ２とする。ページ２が、重複データセットＢ及びＣの各々の複数のライト先（提供ボリューム０及び１）から直接的又は間接的に参照される。共通領域８０に属するページを、以下、「共通ページ」と言うことがある。図１の例によれば、ページ２が、共通ページ５１Ｃである。重複判断処理がポストプロセスの場合、ストレージコントローラ１０１は、提供ボリューム０及び１にそれぞれ割り当てられている複数の単独ページ０及び１の各々から、データセットＢ及びＣを、共通ページ２にコピーし、複数の単独ページ０及び１の各々からデータセットＢ及びＣを削除する。
【００３６】
これにより、図２に例示する一比較例のような状況の発生、すなわち、１つのページ６０に、単独データセットＡと重複データセットＣとが混在してしまうといった状況の発生
を避けることができ、以って、単独ページ５１Ｐに関して、ページ５１の回収、及び、ページ５１間でのデータセットのコピーを、迅速に行うことができる。
【００３７】
例えば、ストレージコントローラ１０１は、提供ボリューム０が削除対象とされた場合、提供ボリューム０に関し割り当てられている全単独ページ５１Ｐを、当該全単独ページ５１Ｐの各々について当該単独ページ５１Ｐがいずれか他の領域から参照されているか否かをチェックすること無しに、且つ、提供ボリューム０におけるいずれかの領域が共通領域８０を参照しているか否かをチェックすること無しに、解放する。このため、提供ボリューム０に割り当たっていた全単独ページ５１Ｐを迅速に回収することができる。
【００３８】
また、例えば、ストレージコントローラ１０１は、単独ページ５１Ｐのガベージコレクション処理において、当該単独ページ５１Ｐのうちの全ての有効な単独データセットを、いずれか別のページ５１に追記的にコピーし、コピー元のページ５１Ｐの割り当てを解除する。単独ページ５１Ｐに関して、ページ５１間でコピーされるデータセットは、単独データセットであり、重複データセットであることが無い。故に、参照先の更新は、当該単独データセットの１つの論理アドレス（提供ボリューム５０１Ｐに属する論理アドレス）についてのみ行えばよく、複数の論理アドレスの各々について行う必要は無い。このため、単独ページ５１Ｐから別のページ５１へのデータセットのコピーを迅速に行うことができ、結果として、単独ページ５１Ｐのガベージコレクション処理が効率化される。
【００３９】
以下、本実施形態を詳細に説明する。
【００４０】
図３は、ストレージシステム２００を含むシステム全体の構成を示す。
【００４１】
ストレージシステム２００は、複数（又は１つ）のＰＤＥＶ２２０と、複数のＰＤＥＶ２２０に接続されたストレージコントローラ１０１とを有する。
【００４２】
ストレージコントローラ１０１は、Ｓ−Ｉ／Ｆ２１４と、Ｍ−Ｉ／Ｆ２１５と、Ｐ−Ｉ／Ｆ２１３と、メモリ２１２と、それらに接続されたプロセッサ２１１とを有する。Ｓ−Ｉ／Ｆ２１４、Ｍ−Ｉ／Ｆ２１５及びＰ−Ｉ／Ｆ２１３が、インターフェース部の一例である。メモリ２１２が、記憶部の一例である。プロセッサ２１１が、プロセッサ部の一例である。プロセッサ部は、圧縮及び伸張を行うハードウェア回路を含んでいてもよい。本実施形態では、プロセッサ２１１が、圧縮及び伸張を行う。つまり、ストレージコントローラ１０１は、データ量削減機能として、重複排除機能の他に圧縮機能を有する。
【００４３】
Ｓ−Ｉ／Ｆ２１４は、サーバシステム２０１とストレージコントローラ１０１との間のデータのやり取りを仲介する通信インターフェースデバイスである。Ｓ−Ｉ／Ｆ２１４に、ＦＣ（Fibre Channel）ネットワーク２０３を介して、サーバシステム２０１が接続される。サーバシステム２０１は、ストレージコントローラ１０１に対して、Ｉ／Ｏ先（例えばＬＵＮ（Logical Unit Number）のような論理ボリューム番号や、ＬＢＡ（Logical Block Address）のような論理アドレス）を指定したＩ／Ｏ要求（ライト要求又はリード要求）を送信する。
【００４４】
Ｍ−Ｉ／Ｆ２１５は、管理システム２０５とストレージコントローラ１０１の間のデータのやり取りを仲介する通信インターフェースデバイスである。Ｍ−Ｉ／Ｆ２１５には、ＩＰ（Internet Protocol）ネットワーク２０４を介して管理システム２０５が接続される。ネットワーク２０３及び２０４は、同一の通信ネットワークでもよい。管理システム２０５は、ストレージシステム２００を管理する。
【００４５】
Ｐ−Ｉ／Ｆ２１３は、複数のＰＤＥＶ２２０とストレージコントローラ１０１の間のデータのやり取りを仲介する通信インターフェースデバイスである。Ｐ−Ｉ／Ｆ２１３には、複数のＰＤＥＶ２２０が接続される。
【００４６】
メモリ２１２は、プロセッサ２１１が実行するプログラムや、プロセッサ２１１が使用するデータを記憶する。プロセッサ２１１は、メモリ２１２に格納されているプログラムを実行する。本実施形態では、例えば、メモリ２１２及びプロセッサ２１１の組が二重化されている。
【００４７】
図４は、メモリ２１２の構成と、メモリ２１２内のプログラム及び管理情報とを示す。
【００４８】
メモリ２１２は、ローカルメモリ４０１、キャッシュメモリ４０２、及び共有メモリ４０４というメモリ領域を含む。これらのメモリ領域のうちの少なくとも１つは、独立したメモリであってもよい。
【００４９】
ローカルメモリ４０１は、このローカルメモリ４０１を含むメモリ２１２と同一組に属するプロセッサ２１１により使用される。ローカルメモリ４０１には、リードプログラム４１１、フロントエンドライトプログラム４１２、バックエンドライトプログラム４１３、データ量削減プログラム４１４、ＶＯＬ管理プログラム４１５、プール容量管理プログラム４１６及び共通領域解放プログラム４１７が格納される。これらのプログラムについては後述する。
【００５０】
キャッシュメモリ４０２には、ＰＤＥＶ２２０に対してライト又はリードされるデータセットが一時的に格納される。
【００５１】
共有メモリ４０４は、この共有メモリ４０４を含むメモリ２１２と同一組に属するプロセッサ２１１と異なる組に属するプロセッサ２１１との両方により使用される。共有メモリ４０４には、管理情報が格納される。管理情報は、ＶＯＬ管理テーブル４２１、アドレス変換テーブル４２２（重複排除情報の一例）、プール管理テーブル４２３、有効領域管理テーブル４２４、ページ変換テーブル４２５、ページ割当管理テーブル４２６、サブブロック管理テーブル４２７、追記先検索テーブル４２８、ハッシュ管理テーブル４２９、重複管理テーブル４３０及び共通領域割当管理テーブル４３１を含む。これらのテーブルうち、プール管理テーブル４２３以外については、図を参照して後述する。プール管理テーブル４２３は、プール５０３に関する情報を保持するテーブルであり、例えば、プール５０３毎に、プール＃（プール５０３の番号）、ＲＧ＃（プール５０３の基になっている１以上のＲＧ５０４の番号）、プール容量（プール５０３の容量）及びプール使用容量（プール容量のうち使用されている容量（典型的には、プール５０３のうちの割当て済ページの総容量））を表す。
【００５２】
図５は、ストレージシステム２００内の記憶階層を示す。なお、以下の説明では、ｎ番目のレイヤを「レイヤｎ」と呼ぶ（ｎは自然数）。ｎが小さい程、上のレイヤである。
【００５３】
提供ボリューム５０１Ｐ、追記ボリューム５０２、プール５０３及びＲＧ５０４がある。
【００５４】
提供ボリューム５０１Ｐは、レイヤ１（第２レイヤの一例）の論理記憶領域であり、サーバシステム２０１に提供される（サーバシステム２０１から可視の）上述の論理ボリュームである。なお、レイヤ１の論理記憶領域として、更に、本実施形態では、後述するように、共通領域８０に属する論理ボリュームでありサーバシステム２０１に提供されない（サーバシステム２０１から不可視の）共通ボリュームがある。
【００５５】
追記ボリューム５０２は、レイヤ２（第３レイヤの一例）の論理記憶領域であり、追記用の論理ボリュームである。１つの追記ボリューム５０２には、いずれか１つの論理ボリューム５０１が関連付けられる。逆に、１つの論理ボリューム５０１には、１又は複数の追記ボリューム５０２が関連付けられる。従って、追記ボリューム５０２（レイヤ２の論理記憶領域）と論理ボリューム５０１（レイヤ１の論理記憶領域）は、１：１又は１：多の関係である。本実施形態では、説明を簡単にするために、追記ボリューム５０２と論理ボリューム５０１は１：１であるとする。
【００５６】
プール５０３は、レイヤ３（第１レイヤの一例）の論理記憶領域であり、１以上のＲＧ５０４に基づく論理記憶領域である。プール５０３は、複数のページ５１で構成されている。なお、プール５０３の全部又は一部は、少なくとも１つのＲＧ５０４に代えて又は加えて、ストレージシステム２００の外部の記憶資源に基づいていてもよい。
【００５７】
ＲＧ５０４は、レイヤ４の論理記憶領域であり、複数のＰＤＥＶ２２０で構成されたＲＡＩＤグループの空間である。
【００５８】
図５に例示の提供ボリューム５０１Ｐの一部は、２以上の提供ボリューム５０１Ｐのうちの少なくとも一部であり圧縮が有効とされた領域である「有効領域」の全部又は一部である。２以上の提供ボリューム５０１Ｐのうち有効領域以外の領域を、圧縮が無効とされた領域という意味で「無効領域」と言う。
【００５９】
ストレージコントローラ１０１は、ライト対象のデータセットＡのライト先が有効領域の場合、当該ライト対象のデータセットＡを圧縮し、提供ボリューム５０１Ｐに対応した追記ボリューム５０２に割り当てられたページ５１Ｐａ（当該ライト先に関して割り当てられた単独ページ５１Ｐａ）に、当該圧縮されたデータセットＡ´を追記する。つまり、有効領域に関して、ページ５１Ｐａは、提供ボリューム５０１Ｐに対応した追記ボリューム５０２に割り当てられたページ５１、言い換えれば、提供ボリューム５０１Ｐに間接的に割り当てられたページ５１である。ページ５１Ｐａには、追記的に圧縮後データセットＡ´が格納される。言い換えれば、追記ボリューム５０２に割り当てられたページ５１は、上書き不可である。追記ボリューム５０２に割り当てられたページ（提供ボリューム５０１Ｐに間接的に割り当てられたページ）を、「追記ページ」と言うことができる。
【００６０】
一方、ストレージコントローラ１０１は、ライト対象のデータセットＢのライト先が無効領域の場合、当該ライト対象のデータセットＢを圧縮すること無しに、当該ライト先に関して割り当てられたページ５１Ｐｂに、当該非圧縮のデータセットＢを格納する。つまり、無効領域に関して、ページ５１Ｐｂは、提供ボリューム５０１Ｐに直接的に（追記ボリューム５０２非経由で）割り当てられたページ５１である。ページ５１Ｐｂには、非圧縮のデータセットＢが格納される。提供ボリューム５０１Ｐに直接的に割り当てられたページ５１は、上書き可である。提供ボリューム５０１Ｐに直接的に割り当てられたページを、「上書きページ」と言うことができる。
【００６１】
図６は、追記ページ５１への追記を模式的に示す。
【００６２】
論理ボリューム５０１は、複数の単位領域である複数のブロック６０１で構成されている。本実施形態では、データセットは、ブロック単位のデータである。
【００６３】
論理ボリューム５０１に対応した追記ボリューム５０２に割り当てられた追記ページ５１Ｐには、圧縮後データセットが追記されていく。追記ページ５１Ｐにおいて、圧縮後データセットが占める領域６０２を、以下の説明では、「サブブロック６０２」と言う。サブブロック６０２は、サブページ領域及びサブ部分領域の各々の一例である。なお、追記ページ５１Ｐには、非圧縮のデータセットが追記されてもよいが、本実施形態では、圧縮後データセットが追記される。
【００６４】
図７は、重複排除処理を模式的に示す。具体的には、図７は、ポストプロセスの重複排除処理の一例を模式的に示す。
【００６５】
論理ボリューム５０１として、提供ボリューム５０１Ｐの他に、共通ボリューム５０１Ｃがある。共通ボリューム５０１Ｃは、上述したように、共通領域８０に属しサーバシステム２０１に提供されない論理ボリュームである。図示の共通ボリューム５０１Ｃの少なくとも一部が有効領域である。なお、有効領域に属する共通ボリュームと、無効領域に属する共通ボリュームとが用意されてもよい。
【００６６】
アドレス変換テーブル４２２及び追記ボリューム５０２の各々が、論理ボリューム５０１毎に設けられている。図７の説明において、論理ボリュームｍ（ＶＯＬ＃“ｍ”の論理ボリューム（ｍは０以上の整数））に対応したアドレス変換テーブル４２２を、「アドレス変換テーブルｍ」と言うことがある。また、図７の説明において、論理ボリュームｍに対応した追記ボリューム５０２を、「追記ボリュームｍ」と言うことがある。
【００６７】
また、以下の説明において、下記の用語を使用することがある。
・提供ブロック：提供ボリュームにおけるブロック。
・共通ブロック：共通ボリュームにおけるブロック。
・重複先ブロック：重複データセットのライト先（コピー先）とされた共通ブロック。
・追記単独ページ：単独ページ且つ追記ページであるページ。
・追記共通ページ：共通ページ且つ追記ページであるページ（共通ボリュームに対応した追記ボリュームに割り当てられたページ）。
【００６８】
提供ボリューム１及び２があり、故に、アドレス変換テーブル１及び２と、追記ボリューム１及び２がある。また、共通ボリューム３があり、故に、アドレス変換テーブル３と、追記ボリューム３がある。追記ボリューム１及び２が、単独領域７０に属し、追記ボリューム３が、共通領域８０に属する。
【００６９】
重複排除処理の前の状況の一例は、図７の上側に示すように、下記の通りである。
・提供ボリューム１及び２がそれぞれ有する２つの提供ブロック６０１Ｐの各々に、データセットＡが存在する。結果として、追記ボリューム１及び２にそれぞれ割り当てられた２つの追記単独ページ５１Ｐの各々に、圧縮後データセットＡ´が存在する。
・アドレス変換テーブル１及び２の各々では、データセットＡのライト先提供ブロック６０１Ｐの論理アドレスの参照先が、追記単独ページ５１Ｐにおけるサブブロック６０２（圧縮後データセットＡ´が存在するサブブロック６０２）の論理アドレスである。
【００７０】
ストレージコントローラ１０１は、上述した重複判断処理において、提供ボリューム１及び２に重複するデータセットＡが存在することを検出する。その場合、ストレージコントローラ１０１は、例えば以下の処理を含む重複排除処理を行う。
・ストレージコントローラ１０１は、重複データセットＡ（圧縮後データセットＡ´の伸張後データセットに相当）を、提供ボリューム１及び２における有効領域の提供ブロック６０１Ｐから、共通ボリューム３の有効領域におけるいずれかの未使用の共通ブロック６０１Ｃにコピーする。コピー先の共通ブロック６０１Ｃが、重複先ブロック６０１Ｃ（重複先領域の一例）である。
・ストレージコントローラ１０１は、重複先ブロック６０１Ｃに対応した追記ボリューム３にページ５１を割り当てる。割り当てられたページ５１が、追記共通ページ５１Ｃである。
・ストレージコントローラ１０１は、重複データセットＡを圧縮し、圧縮後データセットＡ´を、追記共通ページ５１Ｃに追記する。
・ストレージコントローラ１０１は、アドレス変換テーブル３を更新する。更新後のアドレス変換テーブル３では、重複先ブロック６０１Ｃの論理アドレスの参照先が、追記共通ページ５１Ｃにおけるサブブロック６０２（圧縮後データセットＡ´が存在するサブブロック６０２）の論理アドレスである。
・ストレージコントローラ１０１は、アドレス変換テーブル１及び２を更新する。更新後のアドレス変換テーブル１及び２の各々では、提供ブロック６０１Ｐの論理アドレスの参照先が、追記単独ページ５１Ｐにおけるサブブロック６０２（圧縮後データセットＡ´が存在するサブブロック６０２）の論理アドレスに代えて、重複先ブロック６０１Ｃの論理アドレスとなる。
・ストレージコントローラ１０１は、追記ボリューム１及び２にそれぞれ割り当てられた２つの追記単独ページ５１Ｐの各々のうち、圧縮後データセットＡ´が格納されているサブブロック６０２を、黒色で示す通り、無効サブブロック（未割当）として管理する。
・ストレージコントローラ１０１は、重複管理テーブル４３０を更新する。更新後の重複管理テーブル４３０では、重複先ブロック６０１Ｃの論理アドレスの参照元が、コピー元の２つの提供ブロック６０１Ｐの論理アドレスである。
【００７１】
以上が、重複排除処理の一例である。なお、共通領域８０におけるデータセットを参照する単独領域７０内の参照元が一つになっても、当該データセットは単独領域７０に移動されないでよい（当該データセットは共通領域８０に残り続けてよい）。重複排除処理において、ストレージコントローラ１０１は、重複データセットＡを共通ブロック６０１Ｃにコピーすることに代えて、いずれかの圧縮後データセットＡ´を、共通領域８０に属するページ５１Ｃに追記的にコピーし、２つの提供ブロック６０１Ｐの論理アドレスの参照先を、コピー先ページ５１Ｃのサブブロック６０２の論理アドレスとし、コピー元のサブブロック６０２を無効サブブロックとしてもよい。このような処理が採用される場合、共通ボリューム５０１Ｃは無くてもよい。
【００７２】
ストレージコントローラ１０１は、例えば、提供ボリューム１のうちの、データセットＡのライト先提供ブロック６０１Ｐに、更新後のデータセットＦを書き込むためのライト要求を受信したとする。この場合、追記ボリューム１の追記単独ページ５１Ｐに対して、下記の（ｃ１）〜（ｃ３）を行う。（ｃ２）は、重複排除処理の前に当該ライト要求を受けた場合に行われる処理である。（ｃ３）は、重複排除処理の後に当該ライト要求を受けた場合に行われる処理である。
（ｃ１）ストレージコントローラ１０１は、旧サブブロック６０２の参照元（旧参照元）が、提供ボリューム１におけるいずれかの提供ブロック６０１Ｐの論理アドレスであるか否かを判断する。「旧サブブロック」とは、ライト対象の圧縮後データセットＦ´の更新前の圧縮後データセットＡ´を格納したサブブロックである。「ライト対象の圧縮後データセットＦ´」とは、ライト先提供ブロック６０１Ｐへのライト対象のデータセットＦの圧縮後データセットである。
（ｃ２）（ｃ１）の判断の結果が真の場合、ストレージコントローラ１０１は、旧サブブロック６０２が追記単独ページ５１Ｐに存在するため当該旧サブブロック６０２を無効サブブロック（未使用のサブブロック）とし、ライト対象の圧縮後データセットＦ´を新たなサブブロックに追記し、ライト先提供ブロック６０１Ｐの論理アドレスの参照先を、旧サブブロック６０２の論理アドレスから当該新たなサブブロックの論理アドレスに変更する。
（ｃ３）（ｃ１）の判断の結果が偽の場合、ストレージコントローラ１０１は、旧サブブロック６０２が追記共通ページ５１Ｃに存在するため当該旧サブブロック６０２を無効サブブロックとすること無しに、ライト対象の圧縮後データセットＦ´を追記単独ページ５１Ｃにおける新たなサブブロックに追記し、ライト先提供ブロックの論理アドレスの参照先を、重複先ブロック６０１Ｃの論理アドレスから当該新たなサブブロックの論理アドレスに変更する。
【００７３】
このため、下記の（ｘ１）及び（ｘ２）のような状況が発生し得る。
（ｘ１）追記単独ページ５１Ｐにおいて、有効な圧縮後データセット（有効なサブブロック６０２）の論理アドレスが非連続となること（有効な圧縮後データセットが離散した状態となること）。
（ｘ２）共通ボリューム５０１Ｃにおける重複先ブロック６０１Ｃが、いずれの提供ボリューム５０１Ｐにおける提供ブロック６０１Ｐからも参照されなくなっているにも関わらず、使用中のままとなり、結果として、共通ボリューム５０１Ｃの空き容量が増えず、且つ、共通ページ５１Ｃに、不必要な圧縮後データブロックが残り続けてしまうこと。
【００７４】
（ｘ１）の状況が発生し得るため、単独領域７０に関し、ガベージコレクション処理が必要となる。本実施形態では、単独領域７０に関してのガベージコレクション処理を効率的に行うことができる。ガベージコレクション処理において有効ないずれの圧縮後データセットも単独データセットの圧縮後データセットであるため、各有効な圧縮後データセットについて、参照元は１つであり、当該１つの参照元についてのみ、参照先の変更を行えばよいからである。
【００７５】
（ｘ２）の状況が発生し得るため、ストレージコントローラ１０１は、重複先ブロック６０１Ｃを未使用とするための解放処理を行う。具体的には、当該解放処理において、ストレージコントローラ１０１は、重複先ブロック６０１Ｃの１以上の参照元ブロック６０１Ｐ（１以上の提供ボリューム５０１Ｐにおける１以上の提供ブロック６０１Ｐ）から、参照先が当該重複先ブロック６０１Ｃではない参照元ブロック６０１Ｐを除外する。ストレージコントローラ１０１は、全ての参照元ブロック６０１Ｐが除外されたために当該重複先ブロック６０１Ｃを参照先とする参照元が無い場合、当該重複先ブロック６０１Ｃを未使用へと解放する。それに伴い、ストレージコントローラ１０１は、当該重複先ブロック６０１Ｃの参照先のサブブロック６０２（共通ページ５１Ｃ内のサブブロック６０２）を無効サブブロックとする。なお、共通ボリューム５０１Ｃにおける重複先ブロック６０１Ｃの参照元ブロック６０１Ｐが１つだけの場合、ストレージコントローラ１０１は、下記のうちのいずれかを行ってよい。
・ストレージコントローラ１０１は、当該重複先ブロック６０１Ｃに対応した圧縮後データセットを、共通ページ５１Ｃから、当該参照元ブロック６０１Ｐを含む提供ボリューム５０１Ｐに対応した追記ページ５１Ｐに、追記的にコピーし、コピー元のサブブロック６０２（共通ページ５１Ｃにおけるサブブロック６０２）を未使用（未割当）とし、重複先ブロック６０１Ｃを未使用とする。これにより、共通ボリューム５０１Ｃの空き容量を増やすことができる。
・ストレージコントローラ１０１は、当該重複先ブロック６０１Ｃに対応した圧縮後データセットを、共通ページ５１Ｃに格納されたままとする。これにより、ページ５１間のコピーの発生頻度を低減することができる。
【００７６】
以下、幾つかのテーブルを説明する。
【００７７】
図８は、ＶＯＬ管理テーブル４２１の構成を示す。
【００７８】
本実施形態では、提供ボリューム５０１Ｐのようにサーバシステム２０１に提供される論理ボリュームも、共通ボリューム５０１Ｃ及び追記ボリューム５０２のようにサーバシステム２０１に提供されない論理ボリュームも、「ＶＯＬ」と総称できる。ＶＯＬ管理テーブル４２１は、ＶＯＬに関する情報を保持する。例えば、ＶＯＬ管理テーブル４２１は、ＶＯＬ毎に、エントリを有する。各エントリは、ＶＯＬ＃８０１、ＶＯＬ属性８０２、ＶＯＬ容量８０３及びプール＃８０４といった情報を格納する。以下、１つのＶＯＬ（図８の説明において「対象ＶＯＬ」）を例に取る。
【００７９】
ＶＯＬ＃８０１は、対象ＶＯＬの番号（識別番号）を表す。ＶＯＬ属性８０２は、対象ＶＯＬの属性を表す（例えば、提供ボリュームは“提供”、追記ボリュームは“追記”、共通ボリュームは“共通”）。ＶＯＬ容量８０３は、対象ＶＯＬの容量を表す。プール＃８０４は、対象ＶＯＬに関連付けられているプール５０３の番号を表す。
【００８０】
図９は、アドレス変換テーブル４２２の構成を示す。
【００８１】
アドレス変換テーブル４２２は、論理ボリューム５０１（レイヤ１の論理ボリューム）毎に存在する。アドレス変換テーブル４２２は、参照元の論理アドレスと参照先の論理アドレスとの関係に関する情報を保持する。例えば、アドレス変換テーブル４２２は、ブロック６０１毎に、エントリを有する。各エントリは、ＶＯＬ内アドレス９０１、参照先ＶＯＬ＃９０２、参照先ＶＯＬ内アドレス９０３、データサイズ９０４及び参照先ＶＯＬ種別９０５といった情報を格納する。以下、１つのブロック６０１（図９の説明において「対象ブロック６０１」）を例に取る。
【００８２】
ＶＯＬ内アドレス９０１は、対象ブロック６０１の論理アドレス（例えば先頭論理アドレス）を表す。参照先ＶＯＬ＃９０２は、対象ブロック６０１の論理アドレスの参照先ＶＯＬ（追記ボリューム又は共通ボリューム）の番号を表す。参照先ＶＯＬ内アドレス９０３は、対象ブロック６０１の論理アドレスの参照先の論理アドレス（参照先ＶＯＬ内の論理アドレス）を表す。データサイズ９０４は、対象ブロック６０１をライト先としたデータセットの圧縮後データセットのサイズを表す。参照先ＶＯＬ種別９０５は、対象ブロック６０１の論理アドレスの参照先ＶＯＬの種別（“単独”（追記ボリューム）か“共通”（共通ボリューム））を表す。
【００８３】
図１０は、有効領域管理テーブル４２４の構成を示す。
【００８４】
有効領域管理テーブル４２４は、論理ボリューム５０１毎に存在する。有効領域管理テーブル４２４は、有効領域に関する情報を保持する。例えば、有効領域管理テーブル４２４は、ブロック毎に、エントリを有する。各エントリは、ＶＯＬ内アドレス１００１及び有効フラグ１００２といった情報を格納する。以下、１つのブロック６０１（図１０の説明において「対象ブロック６０１」）を例に取る。
【００８５】
ＶＯＬ内アドレス１００１は、対象ブロック６０１の論理アドレスを表す。有効フラグ１００２は、対象ブロック６０１が有効領域に属する（“有”）か否（“無”）かを示す。
【００８６】
図１１は、ページ変換テーブル４２５の構成を示す。
【００８７】
ページ変換テーブル４２５は、論理ボリューム５０１毎に、及び、追記ボリューム５０２毎に、存在する。ページ変換テーブル４２５は、論理ボリューム５０１における領域（例えば、ページ５１のサイズと同数分のブロック６０１）とページ５１との関係に関する情報を保持する。例えば、ページ変換テーブル４２５は、論理ボリューム５０１における領域毎に、エントリを有する。各エントリは、ＶＯＬ内アドレス１１０１、割当フラグ１１０２及びページ＃１１０３といった情報を格納する。以下、１つの領域（図１１の説明において「対象領域」）を例に取る。
【００８８】
ＶＯＬ内アドレス１００１は、対象領域の論理アドレス（例えば先頭論理アドレス）を表す。割当フラグ１１０２は、対象領域にページ５１が割り当てられている（“割当済”）か否（“未割当”）かを示す。ページ番号１１０３は、対象領域に割り当てられているページ５１の番号を表す。
【００８９】
図１２は、ページ割当管理テーブル４２６の構成を示す。
【００９０】
ページ割当管理テーブル４２６は、プール５０３毎に存在する。ページ割当管理テーブル４２６は、ページ５１とその割当先との関係に関する情報を保持する。例えば、ページ割当管理テーブル４２６は、ページ５１毎にエントリを有する。各エントリは、ページ＃１２０１、割当フラグ１２０２、割当先ＶＯＬ＃１２０３及び割当先ＶＯＬ内アドレス１２０４といった情報を格納する。以下、１つのページ５１（図１２の説明において「対象ページ５１」）を例に取る。
【００９１】
ページ＃１２０１は、対象ページ５１の番号を表す。割当フラグ１２０２は、対象ページ５１が割り当てられている（“割当済”）か否（“未割当”）かを示す。割当先ＶＯＬ＃１２０３は、対象ページ５１の割当先ＶＯＬ（論理ボリューム５０１又は追記ボリューム５０２）の番号を表す。割当先ＶＯＬ内アドレス１２０４は、対象ページ５１の割当先ＶＯＬにおける領域の論理アドレス（例えば先頭論理アドレス）を表す。
【００９２】
図１３は、サブブロック管理テーブル４２７の構成を示す。
【００９３】
サブブロック管理テーブル４２７は、追記ボリューム５０２毎に存在する。サブブロック管理テーブル４２７は、サブブロック６０２に関する情報を保持する。例えば、サブブロック管理テーブル４２７は、サブブロック６０２毎にエントリを有する。各エントリは、ページ＃１３０１、ページ内アドレス１３０２、割当フラグ１３０３、ＶＯＬ内アドレス１３０４及びサブブロックサイズ１３０５といった情報を格納する。以下、１つのサブブロック６０２（図１３の説明において「対象サブブロック６０２」）を例に取る。
【００９４】
ページ＃１３０１は、対象サブブロック６０２を含むページ５１の番号を表す。ページ内アドレス１３０２は、対象サブブロック６０２の論理アドレスを表す。割当フラグ１３０３は、対象サブブロック６０２が割り当てられている（“割当済”）か否（“未割当”）か、言い換えれば、対象サブブロック６０２が使用中か未使用かを表す。ＶＯＬ内アドレス１３０４は、対象サブブロック６０２の割当先の論理アドレス（追記ボリューム５０２における領域の論理アドレス）を表す。サブブロックサイズ１３０５は、対象サブブロック６０２のサイズ（言い換えれば、対象サブブロック６０２に格納されている圧縮後データセットのサイズ）を表す。
【００９５】
図１４は、追記先検索テーブル４２８の構成を示す。
【００９６】
追記先検索テーブル４２８は、圧縮後データセットの追記先の表す。追記先検索テーブル４２８は、例えば、追記ボリューム５０２毎にエントリを有する。各エントリは、ＶＯＬ＃１４０１、追記先アドレス１４０２及び終端アドレス１４０３といった情報を格納する。以下、１つの追記ボリューム５０２（図１４の説明において「対象追記ボリューム５０２」）を例に取る。
【００９７】
ＶＯＬ＃１４０１は、対象追記ボリューム５０２の番号を表す。追記先アドレス１４０２は、対象追記ボリューム５０２における追記先の論理アドレス（対象追記ボリューム５０２に割り当てられた追記ページ５１Ｐにおける追記先の論理アドレス）を表す。終端アドレス１４０３は、追記先となり得る論理アドレスの終端の論理アドレスを表す。
【００９８】
追記先の論理アドレスと終端の論理アドレスとの差に従うサイズが、圧縮後データサイズ未満の場合、追記不可のため、対象追記ボリューム５０２の先頭の論理アドレスが再度追記先とされてよい。具体的には、例えば、ストレージコントローラ１０１は、対象追記ボリューム５０２の先頭の論理アドレスに近い追記ページ５１Ｐから優先的にガベージコレクション処理を行ってよい。それにより、対象追記ボリューム５０２の先頭の論理アドレスに近い追記ページ５１Ｐから優先的に、追記ページ５１Ｐの割当が解除され、結果として、対象追記ボリューム５０２の先頭の論理アドレスに近い領域から優先的に、未使用とされていってよい。
【００９９】
図１５は、重複チェックテーブル４８９の構成を示す。
【０１００】
重複チェックテーブル４８９は、重複判断処理において作成され使用される。重複チェックテーブル４８９は、重複判断処理の対象とされるデータについて、作成され、例えばメモリ２１２に格納される。ここで言う「データ」は、典型的には、所定の処理対象のデータであり、ブロックのサイズよりも大きい。このため、重複判断処理（及び、単独領域７０又は共通領域８０への格納）は、ブロック単位（データセット単位）で行われてもよいが、本実施形態では、ブロック単位に代えて処理対象のデータの単位でまとめて行われる。具体的には、例えば、処理対象のデータは、いずれかの提供ボリューム５０１Ｐに対するライト要求に従うデータであり、当該データのサイズは、ブロックのサイズの整数倍でよく、重複判断処理（及び、単独領域７０又は共通領域８０への格納）は、ライト要求に従うデータの単位（つまり、Ｉ／Ｏ要求の単位）で行われてよい。このように、重複判断処理（及び、単独領域７０又は共通領域８０への格納）は、処理対象のデータの単位でまとめて行われるので、効率的である。
【０１０１】
重複チェックテーブル４８９は、例えば、データを構成する１以上のデータセットにそれぞれ対応した１以上のブロック６０１の各々について、エントリを有する。各エントリは、対象ＶＯＬ＃１５０１、対象ＶＯＬ内アドレス１５０２、ハッシュ値１５０３、ヒットフラグ１５０４、比較先ＶＯＬ＃１５０５、比較先ＶＯＬ内アドレス１５０６、比較成功フラグ１５０７、格納先ＶＯＬ＃１５０８及び格納先ＶＯＬ内アドレス１５０９といった情報を格納する。以下、１つのブロック６０１（図１５の説明において「対象ブロック６０１」）を例に取る。
【０１０２】
対象ＶＯＬ＃１５０１は、対象ブロック６０１を含む論理ボリューム５０１の番号を表す。対象ＶＯＬ内アドレス１５０２は、対象ブロック６０１の論理アドレスを表す。ハッシュ値１５０３は、対象ブロック６０１に対応したハッシュ値（対象ブロック６０１がライト先であるデータセットのハッシュ値）を表す。
【０１０３】
ヒットフラグ１５０４は、ハッシュ値ヒット（“Ｈｉｔ”）か否（“Ｍｉｓｓ”）かを表す。「ハッシュ値ヒット」とは、対象ブロック６０１に対応したハッシュ値と一致するハッシュ値が既に存在することである。
【０１０４】
比較先ＶＯＬ＃１５０５は、対象ブロック６０１についてハッシュ値ヒットが生じた場合に有効であり、比較先ＶＯＬの番号を表す。「比較先ＶＯＬ」とは、対象ブロック６０１に対応したハッシュ値と一致するハッシュ値のデータセットを格納する論理ボリューム５０１であり、データセット同士の比較先とされる論理ボリューム５０１である。比較先ＶＯＬは、提供ボリューム５０１Ｐと共通ボリューム５０１Ｃのいずれかである。比較先ＶＯＬ内アドレス１５０６は、対象ブロック６０１に対応したハッシュ値と一致するハッシュ値のデータセットを格納するブロック６０１の論理アドレス（比較先ＶＯＬにおけるブロック６０１の論理アドレス）を表す。対象ブロック６０１について、比較先ＶＯＬ＃１５０５及び比較先ＶＯＬ内アドレス１５０６の組が複数存在してもよい。
【０１０５】
比較成功フラグ１５０７は、対象ブロック６０１についてハッシュ値ヒットが生じた場合に行われるデータセット同士の比較が成功（“成功”）か否（“失敗”）かを表す。データセット同士が互いに一致の場合に、比較成功フラグ１５０７は“成功”である。
【０１０６】
格納先ＶＯＬ＃１５０８は、格納先ＶＯＬの番号を表す。「格納先ＶＯＬ」とは、対象ブロック６０１がライト先であるデータセットの格納先の論理ボリューム５０１である。対象ブロック６０１がライト先であるデータセットが単独データセットであれば、格納先ＶＯＬは、追記ボリューム５０２である。対象ブロック６０１がライト先であるデータセットが重複データセットであれば、格納先ＶＯＬは、共通ボリューム５０１Ｃである。格納先ＶＯＬ内アドレス１５０９は、対象ブロック６０１がライト先であるデータセットの格納先ブロックの論理アドレス（格納先ＶＯＬ内のブロックの論理アドレス）を表す。
【０１０７】
図１６は、ハッシュ管理テーブル４２９の構成を示す。
【０１０８】
ハッシュ管理テーブル４２９は、データセットのハッシュ値に関する情報を保持する。ハッシュ管理テーブル４２９は、例えば、ハッシュ値毎にエントリを有する。各エントリは、ハッシュ値１６０１、登録フラグ１６０２、ＶＯＬ＃１６０３及びＶＯＬ内アドレス１６０４といった情報を格納する。以下、１つのハッシュ値（図１６の説明において「対象ハッシュ値」）を例に取る。
【０１０９】
ハッシュ値１６０１は、対象ハッシュ値を表す。登録フラグ１６０２は、対象ハッシュ値をハッシュ値とするデータセットがストレージシステム２００に存在している（“済”）か否（“未”）を表す。
【０１１０】
ＶＯＬ＃１６０３は、対象ハッシュ値をハッシュ値とするデータセットを格納する論理ボリューム５０１の番号を表す。ＶＯＬ内アドレス１６０４は、対象ハッシュ値をハッシュ値とするデータセットを格納するブロック６０１の論理アドレスを表す。重複判断処理において、対象ハッシュ値についてハッシュ値ヒットが生じた場合、対象ハッシュ値に対応したＶＯＬ＃１６０３及びＶＯＬ内アドレス１６０４が、図１５に示した重複チェックテーブル４８９における比較先ＶＯＬ＃１５０５及び比較先ＶＯＬ内アドレス１５０６とされる。
【０１１１】
図１７は、重複管理テーブル４３０の構成を示す。
【０１１２】
重複管理テーブル４３０は、重複データセットの位置（論理アドレス）を表す。重複管理テーブル４３０は、例えば、共通ボリューム５０１Ｃを構成する複数のブロック６０１Ｃの各々について、ＶＯＬ内アドレス（論理アドレス）を有する。参照元が存在するブロック６０１Ｃには、当該参照元のエントリが例えばキュー形式で関連付けられる。参照元のエントリは、ＶＯＬ＃（参照元のブロック６０１を含む論理ボリューム５０１の番号）、及び、ＶＯＬ内アドレス（参照元のブロック６０１の論理アドレス）を格納する。
【０１１３】
図１８は、共通領域割当管理テーブル４３１の構成を示す。
【０１１４】
共通領域割当管理テーブル４３１は、共通ボリューム５０１Ｃ毎に存在する。共通領域割当管理テーブル４３１は、共通ボリューム５０１Ｃの空き状況を表す。共通領域割当管理テーブル４３１は、例えば、共通ボリューム５０１Ｃを構成する複数のブロック６０１Ｃの各々について、エントリを有する。各エントリは、ＶＯＬ内アドレス１８０１及び使用中フラグ１８０２といった情報を格納する。以下、１つのブロック６０１Ｃ（図１８の説明において「対象ブロック６０１Ｃ」）を例に取る。
【０１１５】
ＶＯＬ内アドレス１８０１は、対象ブロック６０１Ｃの論理アドレスを表す。使用中フラグ１８０２は、対象ブロック６０１Ｃが使用中（“使用中”）か否（“未使用”）かを表す。使用中フラグ１８０２“使用中”は、対象ブロック６０１Ｃに直接的（追記ボリューム非経由）又は間接的（追記ボリューム経由）にページ５１が割り当てられていることを意味する。使用中フラグ１８０２“未使用”は、対象ブロック６０１Ｃにページ５１が割り当てられていないこと、つまり、空きであることを意味する。
【０１１６】
図１９は、共通領域チェックテーブル４３２の構成を示す。
【０１１７】
共通領域チェックテーブル４３２は、共通ボリューム５０１Ｃ毎に存在する。共通領域チェックテーブル４３２は、共通ボリューム５０１Ｃに対する参照状況を表す。共通領域チェックテーブル４３２は、例えば、共通ボリューム５０１Ｃを構成する複数のブロック６０１Ｃの各々について、エントリを有する。各エントリは、ＶＯＬ内アドレス１９０１及び参照フラグ１９０２といった情報を格納する。以下、１つのブロック６０１Ｃ（図１９の説明において「対象ブロック６０１Ｃ」）を例に取る。
【０１１８】
ＶＯＬ内アドレス１９０１は、対象ブロック６０１Ｃの論理アドレスを表す。参照フラグ１９０２は、対象ブロック６０１Ｃについて１以上の参照元ブロック６０１が存在する（“有”）か否（“無”）かを表す。
【０１１９】
以下、本実施形態で行われる幾つかの処理を説明する。なお、以下の説明において、データセットの圧縮及び伸張は、データ量削減プログラム４１４により（又は、データ量削減プログラム４１４が呼び出されることにより）、実行されてよい。
【０１２０】
図２０は、フロントエンドライト処理の流れを示す。フロントエンドライト処理は、論理ボリューム５０１に対するライト要求を受け付けた場合に行われる。
【０１２１】
フロントエンドライトプログラム４１２は、キャッシュヒットしたか否かを判断する（Ｓ２００１）。ライト要求について、「キャッシュヒット」とは、ライト要求に従うライト先に対応したキャッシュセグメント（キャッシュメモリ４０２における領域）が確保されていることを意味する。
【０１２２】
Ｓ２００１の判断結果が偽の場合（Ｓ２００１：Ｎｏ）、フロントエンドライトプログラム４１２は、キャッシュメモリ４０２からキャッシュセグメントを確保する（Ｓ２００２）。
【０１２３】
Ｓ２００１の判断結果が真の場合（Ｓ２００１：Ｙｅｓ）、又は、Ｓ２００２の後、フロントエンドライトプログラム４１２は、確保されているキャッシュセグメントに、ライト要求に従うライト対象データを書き込む（Ｓ２００３）。
【０１２４】
フロントエンドライトプログラム４１２は、ライト先の論理ボリューム５０１に対応した有効領域管理テーブル４２４を基に、ライト先が有効領域に属するか否かを判断する（Ｓ２００４）。
【０１２５】
Ｓ２００４の判断結果が真の場合（Ｓ２００４：Ｙｅｓ）、フロントエンドライトプログラム４１２は、ライト対象データを構成する１以上のデータセットの各々についてのライトコマンドを、データ量削減ダーティキューに蓄積する（Ｓ２００５）。「データ量削減ダーティキュー」とは、ダーティのデータセット（ページ５１に未格納のデータセット）であり圧縮が必要なデータセットのライトコマンドが蓄積されるキューである。
【０１２６】
Ｓ２００４の判断結果が偽の場合（Ｓ２００４：Ｎｏ）、フロントエンドライトプログラム４１２は、ライト対象データを構成する１以上のデータセットの各々についてのライトコマンドを、デステージダーティキューに蓄積する（Ｓ２００６）。「デステージダーティキュー」とは、ダーティのデータセット（ページ５１に未格納のデータセット）であり圧縮が不要なデータセットのライトコマンドが蓄積されるキューである。
【０１２７】
Ｓ２００５又はＳ２００６の後、フロントエンドライトプログラム４１２は、Ｇｏｏｄ応答（ライト完了報告）を、ライト要求の送信元に返す（Ｓ２００７）。
【０１２８】
なお、ライト要求に対するＧｏｏｄ応答は、バックエンドライト処理が完結した場合に返されてもよい。すなわち、バックエンドライト処理は、フロントエンド処理と同期又は非同期で行われてよい。バックエンドライト処理がバックエンドライトプログラム４１３により行われる。具体的には、例えば、バックエンドライトプログラム４１３は、デステージダーティキューにあるライトコマンドについて、非圧縮又圧縮後のデータセットを、ライト先に関し割り当てられたページ５１に書き込む。
【０１２９】
図２１は、データ量削減処理の流れを示す。データ量削減処理は、例えば定期的に行われる。
【０１３０】
データ量削減プログラム４１４は、データ量削減ダーティキューを参照する（Ｓ２１０１）。当該キューにコマンドが無ければ（Ｓ２１０２：Ｎｏ）、データ量削減処理が終了する。
【０１３１】
当該キューにコマンドが有れば（Ｓ２１０２：Ｙｅｓ）、データ量削減プログラム４１４は、データ量削減ダーティキューからライトコマンドを取得する、すなわち、ダーティのデータセットを選択する（Ｓ２１０３）。
【０１３２】
データ量削減プログラム４１４は、Ｓ２１０３で選択されたデータセットについて重複排除処理を行う（Ｓ２１０４）。当該選択されたデータセットが単独データセットであるが故に重複排除がされなかった場合には（Ｓ２１０５：Ｎｏ）、データ量削減プログラム４１４は、当該単独データセットについて追記処理を行う（Ｓ２１０６）。
【０１３３】
Ｓ２１０３で選択されたデータセットが重複データセットであるが故に重複排除がされた場合（Ｓ２１０５：Ｙｅｓ）、又は、Ｓ２１０６の後、データ量削減プログラム４１４は、当該選択されたデータセットを破棄（例えばキャッシュメモリ４０２から削除）する（Ｓ２１０７）。
【０１３４】
図２２は、重複排除処理の流れを示す。重複排除処理は、図２１のＳ２１０３で選択されたデータセットについて行われる。以下、図２２及び図２３の説明において、当該選択されたデータセットを「ライトデータセット」と言い、対象データセットのライト先ブロックを「ライト先ブロック」と言い、ライト先ブロックを含んだ論理ボリュームを「ライト先ボリューム」と言う。
【０１３５】
データ量削減プログラム４１４は、ライトデータセットについて重複判断処理を行う（Ｓ２２０１）。Ｓ２２０１の結果、ライトデータセットが単独データセットであれば（Ｓ２２０２：Ｎｏ）、重複排除処理が終了する。
【０１３６】
Ｓ２２０１の結果、ライトデータセットが重複データセットであれば（Ｓ２２０２：Ｙｅｓ）、データ量削減プログラム４１４は、ライトデータセットと重複する別の重複データセットが単独領域７０に存在するか否かを判断する（Ｓ２２０３）。
【０１３７】
なお、ライトデータセットと、当該ライトデータセットと重複する別の重複データセットを、図２２の以下の説明において「重複データセット」と総称する。つまり、図２２の以下の説明において、「重複データセット」は、ライトデータセットを含む２以上のデータセットのうちのいずれでもよい。重複データセットが単独領域７０に既に存在するデータセットの場合、後述のＳ２２０４及びＳ２２０５のいずれかにおいて、当該データセットの圧縮後データセットがデータ量削減プログラム４１４により一旦伸張され、当該伸張後データセットが、重複データセットであってよい。
【０１３８】
また、Ｓ２２０３の判断は、例えば、ライト先ブロックに対応した比較先ＶＯＬ＃１５０５が、ＶＯＬ属性８０２“提供”のＶＯＬ＃８０１と一致するか、ＶＯＬ属性８０２“共通”のＶＯＬ＃８０１と一致するかに基づく。ライト先ブロックに対応した比較先ＶＯＬ＃１５０５が、ＶＯＬ属性８０２“提供”のＶＯＬ＃８０１と一致すれば、別の重複データセットが単独領域７０に存在することになるため、Ｓ２２０３の判断結果が真である。ライト先ブロックに対応した比較先ＶＯＬ＃１５０５が、ＶＯＬ属性８０２“共通”のＶＯＬ＃８０１と一致すれば、別の重複データセットが共通領域８０に存在することになるため、Ｓ２２０３の判断結果が偽である。
【０１３９】
さて、Ｓ２２０３の判断結果が真の場合（Ｓ２２０３：Ｙｅｓ）、次の処理が行われる。すなわち、データ量削減プログラム４１４は、使用中フラグ１８０２が“未使用”の共通ブロック６０１Ｃを選択する（Ｓ２２０４）。以下、この段落において、当該選択された共通ブロック６０１Ｃを、「対象共通ブロック６０１Ｃ」と言い、対象共通ブロック６０１Ｃを含む共通ボリューム５０１Ｃを、「対象共通ボリューム５０１Ｃ」と言う。データ量削減プログラム４１４は、重複データセットを圧縮し、その圧縮後データセットを、追記共通ページ５１Ｃ（対象共通ボリューム５０１Ｃに対応した追記ボリューム５０２に割り当てられたページ５１Ｃ）に追記する（Ｓ２２０５）。データ量削減プログラム４１４は、重複管理テーブル４３０を更新、具体的には、対象共通ブロック６０１Ｃに、全ての重複データセットにそれぞれ対応した全てのブロック６０１Ｐを参照元として関連付ける（Ｓ２２０６）。データ量削減プログラム４１４は、重複チェックテーブル４８９を更新、具体的には、ライト先ブロックに対応した格納先ＶＯＬ＃１５０８及び格納先ＶＯＬ内アドレス１５０９として、対象共通ボリューム５０１Ｃの番号、及び、対象共通ブロック６０１Ｃの論理アドレスを登録する（Ｓ２２０７）。データ量削減プログラム４１４は、ハッシュ管理テーブル４２９を更新、例えば、ハッシュ値１６０１（重複データセットのハッシュ値）、登録フラグ１６０２（“済”）、ＶＯＬ＃１６０３（対象共通ボリューム５０１Ｃの番号）、及び、ＶＯＬ内アドレス１６０４（対象共通ブロック６０１Ｃの論理アドレス）を登録する（Ｓ２２０８）。データ量削減プログラム４１４は、ライトデータセット以外の重複データセットを格納する提供ボリューム５０１Ｐに対応したアドレス変換テーブル４２２を更新、具体的には、重複データセットに対応した参照先ＶＯＬ＃９０２及び参照先ＶＯＬ内アドレス９０３を、対象共通ボリューム５０１Ｃの番号、及び、対象共通ブロック６０１Ｃの論理アドレスに変更し、且つ、重複データセットに対応した参照先ＶＯＬ種別９０５を“共通”に変更する（Ｓ２２０９）。データ量削減プログラム４１４は、ライトデータセット以外の重複データセットを格納する提供ボリューム５０１Ｐに対応した追記ボリューム５０２に関するサブブロック管理テーブル４２７を更新、具体的には、ライトデータセット以外の重複データセットの圧縮後データセットを格納するサブブロックに対応した割当フラグ１３０３を“未割当”に変更する（Ｓ２２１０）。
【０１４０】
Ｓ２２０３の判断結果が偽の場合（Ｓ２２０３：Ｎｏ）、次の処理が行われる。すなわち、データ量削減プログラム４１４は、重複管理テーブル４３０を更新、具体的には、重複データセットを格納した共通ブロック６０１Ｃに、ライト先ブロック６０１Ｐを新たに参照元として関連付ける（Ｓ２２１１）。データ量削減プログラム４１４は、重複チェックテーブル４８９を更新、具体的には、ライト先ブロックに対応した格納先ＶＯＬ内アドレス１５０９及び格納先ＶＯＬ＃１５０８として、重複データセットを格納した共通ブロック６０１Ｃの論理アドレスと、当該共通ブロック６０１Ｃを含んだ共通ボリューム５０１Ｃの番号を登録する（Ｓ２２１２）。
【０１４１】
Ｓ２２１０又はＳ２２１２の後、データ量削減プログラム４１４は、ライト先ボリューム５０１Ｐに対応したアドレス変換テーブル４２２を更新、具体的には、ライト先ブロック（ライトデータセット）に対応した参照先ＶＯＬ＃９０２及び参照先ＶＯＬ内アドレス９０３を、共通ボリューム５０１Ｃの番号、及び、共通ブロック６０１Ｃの論理アドレスに変更し、且つ、ライト先ブロックに対応した参照先ＶＯＬ種別９０５を“共通”に変更する（Ｓ２２１３）。データ量削減プログラム４１４は、ライトデータセットの圧縮後データセットが追記単独ページ５１Ｐにあれば、ライト先ボリューム５０１Ｐに対応した追記ボリューム５０２に関するサブブロック管理テーブル４２７を更新、具体的には、ライトデータセットの圧縮後データセットを格納するサブブロックに対応した割当フラグ１３０３を“未割当”に変更する（Ｓ２２１４）。
【０１４２】
本実施形態において、重複排除処理は、上述したポストプロセスとしての処理であるが、インプロセスとしての処理の場合、例えば図２２のＳ２２１４は行われないでよい。ライトデータセットの圧縮後データセットを追記すること無しに（又はライトデータセットの圧縮をすること無しに）重複排除がされるためである。
【０１４３】
図２３は、重複判断処理の流れを示す。
【０１４４】
データ量削減プログラム４１４は、ライトデータセットに関し重複チェックテーブル４８９を作成する（Ｓ２３０１）。重複排除処理が、例えば、Ｉ／Ｏ単位のような所定の処理対象のデータの単位で行われ、結果として、データが複数のデータセットを含む場合、重複チェックテーブル４８９は、それら複数のデータセットにそれぞれ対応した複数のエントリを有する。
【０１４５】
データ量削減プログラム４１４は、ライト先ブロックに対応したハッシュ値１５０３として、ライトデータセットのハッシュ値を登録する（Ｓ２３０２）。
【０１４６】
データ量削減プログラム４１４は、Ｓ２３０２で登録したハッシュ値と一致するハッシュ値がハッシュ管理テーブル４２９に登録されているか否か、すなわち、ハッシュ値ヒットが生じるか否かを判断する（Ｓ２３０３）。
【０１４７】
Ｓ２３０３の判断結果が真の場合（Ｓ２３０３：Ｙｅｓ）、データ量削減プログラム４１４は、重複チェックテーブル４８９を更新、具体的には、ライト先ブロック６０１Ｐに対応した比較先ＶＯＬ＃１５０５及び比較先ＶＯＬ内アドレス１５０６として、Ｓ２３０２で登録したハッシュ値と一致するハッシュ値に対応したＶＯＬ＃１６０３及びＶＯＬ内アドレス１６０４を登録する（Ｓ２３０４）。データ量削減プログラム４１４は、ライトデータセットと、比較先ＶＯＬ＃１５０５及び比較先ＶＯＬ内アドレス１５０６を基に取得したデータセット（例えば伸張後データセット）とを比較する（Ｓ２３０５）。Ｓ２３０５の比較は、圧縮後データセット同士の比較でもよい。
【０１４８】
Ｓ２３０３の判断結果が偽の場合（Ｓ２３０３：Ｎｏ）、データ量削減プログラム４１４は、ハッシュ管理テーブル４２９を更新、具体的には、新たなエントリに、ハッシュ値１６０１（ライトデータのハッシュ値）、登録１６０２“済”、ＶＯＬ＃１６０３（ライト先ボリューム５０１Ｐの番号）、及び、ＶＯＬ内アドレス１６０４（ライト先ブロック６０１Ｐの論理アドレス）を登録する（Ｓ２３０６）。
【０１４９】
Ｓ２３０５又はＳ２３０６の後、データ量削減プログラム４１４は、重複チェックテーブル４８９を更新、具体的には、ライト先ブロック６０１Ｐに対応した比較成功フラグ１５０７を登録する（Ｓ２３０７）。具体的には、Ｓ２３０５で一致が得られた場合、比較成功フラグ１５０７は“成功”である。Ｓ２３０５で一致が得られなかった場合、又は、Ｓ２３０６が行われた場合、比較成功フラグ１５０７は“失敗”である。
【０１５０】
図２４は、追記処理の流れを示す。追記処理は、図２１のＳ２１０３で選択されたデータセットについて行われる。以下、図２４の説明において、当該選択されたデータセットを「ライトデータセット」と言い、対象データセットのライト先ブロックを「ライト先ブロック」と言い、ライト先ブロックを含んだ論理ボリュームを「ライト先ボリューム」と言う。
【０１５１】
データ量削減プログラム４１４は、ライトデータセットを圧縮し、圧縮後データセットを例えばキャッシュメモリ４０２に格納する（Ｓ２４０１）。データ量削減プログラム４１４は、圧縮後データセットのサイズ以上の空きが、ライト先ボリューム５０１Ｐに対応した追記ボリューム５０２に割当済のページ５１Ｐにあるか否かを判断する（Ｓ２４０２）。このような判断は、例えば、当該追記ボリューム５０２に対応した追記先アドレス１４０２が属する領域に割り当てられているページ５１Ｐの番号をキーに、当該追記ボリューム５０２に対応したサブブロック管理テーブル４２７を参照することで、可能である。
【０１５２】
Ｓ２４０２の判断結果が偽の場合（Ｓ２４０２：Ｎｏ）、データ量削減プログラム４１４は、ライト先ボリューム５０１Ｐに対応した追記ボリューム５０２に、未割当のページ５１を割り当てる（Ｓ２４０３）。
【０１５３】
Ｓ２４０２の判断結果が真の場合（Ｓ２４０２：Ｙｅｓ）、又は、Ｓ２４０３の後、データ量削減プログラム４１４は、追記先とするサブブロックを割り当てる（Ｓ２４０４）。データ量削減プログラム４１４は、ライトデータセットの圧縮後データセットを追記ボリューム５０２にコピーする、例えば、当該圧縮後データセットを、追記ボリューム５０２用の領域（キャッシュメモリ４０２における領域）にコピーする（Ｓ２４０５）。データ量削減プログラム４１４は、圧縮後データセットのライトコマンドをデステージダーティキューに登録する（Ｓ２４０６）。データ量削減プログラム４１４は、ライト先ボリューム５０１Ｐに対応したアドレス変換テーブル４２２を更新、具体的には、ライト先ブロックに対応した参照先ＶＯＬ＃９０２及び参照先ＶＯＬ内アドレス９０３を、追記ボリューム５０２の番号、及び、Ｓ２４０４で割り当てたサブブロックの論理アドレスに変更し、且つ、ライト先ブロックに対応した参照先ＶＯＬ種別９０５を“単独”に変更する（Ｓ２４０７）。
【０１５４】
データ量削減プログラム４１４は、旧サブブロックの参照元（旧参照元）が、ライト先ブロック６０１Ｐの論理アドレスであるか否か（つまり単独領域７０であるか否か）を判断する（Ｓ２４０８）。「旧サブブロック」とは、ライトデータセットの圧縮後データセットの更新前の圧縮後データセットを格納したサブブロックである。つまり、Ｓ２４０８の判断は、ライトデータセットが、単独領域７０内のデータセットの更新後のデータセットであるか、共通領域８０内のデータセットの更新後のデータセットであるかの判断である。
【０１５５】
Ｓ２４０８の判断結果が真の場合（Ｓ２４０８：Ｙｅｓ）、データ量削減プログラム４１４は、旧サブブロックに対応した割当フラグ１３０３を“未割当”に更新する（Ｓ２４０９）。
【０１５６】
図２５は、リード処理の流れを示す。リード処理は、論理ボリューム５０１に対するリード要求を受け付けた場合に行われる。
【０１５７】
リードプログラム４１１は、有効領域テーブル４２４を基に、リード要求に従うリード元が有効領域に属するか否かを判断する（Ｓ２５０１）。
【０１５８】
Ｓ２５０１の判断結果が真の場合（Ｓ２５０１：Ｙｅｓ）、リードプログラム４１１は、リード元の提供ボリューム５０１Ｐに対応したアドレス変換テーブル４２２を参照する（Ｓ２５０２）。リードプログラム４１１は、リード元の領域を構成する各ブロックについて、下記を行う。
・リードプログラム４１１は、当該ブロックに対応した参照先ＶＯＬ種別９０５が“単独”か否かを判断する（Ｓ２５０３）。
・Ｓ２５０３の判断結果が偽の場合（Ｓ２５０３：Ｎｏ）、当該ブロックに対応した参照先ＶＯＬ＃９０２及び参照先ＶＯＬ内アドレス９０３を基に、共通ボリューム５０１Ｃに対応したアドレス変換テーブル４２２を参照する（Ｓ２５０４）。
・Ｓ２５０３の判断結果が真の場合（Ｓ２５０３：Ｙｅｓ）、又は、Ｓ２５０４の後、リードプログラム４１１は、当該ブロックに対応したページ５１を、ページ変換テーブル４２５を基に特定する（Ｓ２５０５）。リードプログラム４１１は、特定したページ５１から、当該ブロックに対応する圧縮後データセットを読み出し、圧縮後データセットを伸張し、伸張後データセットをキャッシュメモリ４０２に格納する（Ｓ２５０６）。
【０１５９】
Ｓ２５０１の判断結果が真の場合（Ｓ２５０１：Ｙｅｓ）において、リード元の領域を構成する各ブロックについてＳ２５０３〜Ｓ２５０６が終了すると、リード要求に従うデータがキャッシュメモリ４０２にあるため、リードプログラム４１１は、当該データをリード要求に送信元に転送する（Ｓ２５０７）。
【０１６０】
Ｓ２５０１の判断結果が偽の場合（Ｓ２５０１：Ｎｏ）、リードプログラム４１１は、リード元の領域に割り当てられているページ５１を、ページ変換テーブル４２５を基に特定する（Ｓ２５０５）。リードプログラム４１１は、特定したページ５１から、リード対象のデータを読み出し（Ｓ２５０６）、読み出したデータを、リード要求に送信元に転送する（Ｓ２５０７）。
【０１６１】
図２６は、提供ボリューム削除処理の流れを示す。提供ボリューム削除処理は、例えば、いずれかの提供ボリューム５０１Ｐを指定したボリューム削除要求を受け付けた場合に行われる。
【０１６２】
ＶＯＬ管理プログラム４１５は、削除対象の提供ボリューム５０１Ｐが有効領域に属するか否かを、有効領域管理テーブル４２４を基に判断する（Ｓ２６０１）。
【０１６３】
Ｓ２６０１の判断結果が真の領域について（Ｓ２６０１：Ｙｅｓ）、ＶＯＬ管理プログラム４１５は、削除対象の提供ボリューム５０１Ｐに対応した各種テーブル（具体的には、テーブル４２２、４２４及び４２５）を削除する（Ｓ２６０２）。また、ＶＯＬ管理プログラム４１５は、削除対象の提供ボリューム５０１Ｐに対応したサブブロック管理テーブル４２７も削除する（Ｓ２６０３）。
【０１６４】
Ｓ２６０１の判断結果が偽の領域について（Ｓ２６０１：Ｎｏ）、及び、Ｓ２６０３の後、ＶＯＬ管理プログラム４１５は、削除対象の提供ボリューム５０１Ｐに割り当てられている全ページ５１を未割当へと解放する（Ｓ２６０４）。この段落で言う「全ページ５１」とは、削除対象の提供ボリューム５０１Ｐに直接的に割り当てられている全てのページ５１と、削除対象の提供ボリューム５０１Ｐに間接的に割り当てられている全てのページ５１（削除対象の提供ボリューム５０１Ｐに対応した追記ボリューム５０２に割り当てられている全てのページ５１）である。
【０１６５】
以上のように、提供ボリュームが削除対象とされた場合、提供ボリュームに直接的又は間接的に割り当てられている全ページを、当該全ページの各々について当該ページがいずれか他の領域から参照されているか否かをチェックすること無しに、且つ、提供ボリュームにおけるいずれかの領域が共通領域８０を参照しているか否かをチェックすること無しに、解放することができる。
【０１６６】
図２７は、ガベージコレクション処理の流れを示す。図示のガベージコレクション処理は、追記ページを回収する処理である。当該処理は、例えば、定期的に開始されてもよいし、プール５０３の容量に対して未割当のページ５１の総容量の比率が所定値未満になったことがプール容量管理プログラム４１６により検出された等の場合に開始されてよい。
【０１６７】
プール容量管理プログラム４１６は、ガベージコレクション処理においてコピー元とするページを選択する（Ｓ２７０１）。
【０１６８】
プール容量管理プログラム４１６は、コピー元ページが割り当てられている追記ボリューム５０２に対応したサブブロック管理テーブル４２７を参照し、Ｓ２７０１で選択したコピー元ページに関して、当該ガベージコレクション処理において未チェックのサブブロックがあるか否かを判断する（Ｓ２７０２）。
【０１６９】
Ｓ２７０２の判断結果が真の場合（Ｓ２７０２：Ｙｅｓ）、次の処理が行われる。すなわち、プール容量管理プログラム４１６は、未チェックのサブブロックのうちの一のサブブロックを選択する（Ｓ２７０３）。プール容量管理プログラム４１６は、当該選択したサブブロックの割当フラグ１３０３が“割当済”であれば（Ｓ２７０４：Ｙｅｓ）、コピー先のページにおけるサブブロックを割り当て（Ｓ２７０５）、Ｓ２７０３で選択したサブブロックからＳ２７０５で割り当てたサブブロックに圧縮後データセットをコピーする（Ｓ２７０６）。Ｓ２７０６では、コピー元のサブブロックの参照元は、コピー元のサブブロックに代えてコピー先のサブブロックを参照先とすることになる。Ｓ２７０６の後、Ｓ２７０２に処理が戻る。
【０１７０】
Ｓ２７０２の判断結果が偽の場合（Ｓ２７０２：Ｎｏ）、言い換えれば、コピー元ページ内の有効な圧縮後データセットが全てコピー先ページにコピーされた場合、プール容量管理プログラム４１６は、コピー元ページを回収する、すなわち、コピー元ページの割当フラグ１２０２を“未割当”に変更する（Ｓ２７０７）。
【０１７１】
以上のように、追記ページのガベージコレクション処理では、Ｓ２７０６において参照先が更新されることになるが、当該追記ページが単独ページであれば、コピーされるデータセットは、常に、単独データセットの圧縮後データセットである。故に、コピー元サブブロックの参照元は常に１つである。このため、各コピー元サブブロックについて、参照先の更新は、１つの参照元についてのみ行えばよい。従って、追記単独ページのガベージコレクション処理が効率化されている。
【０１７２】
図２８は、共通領域解放処理の流れを示す。共通領域解放処理は、例えば定期的に行われる。共通領域解放処理において、処理対象の共通ボリューム５０１Ｃに対応した共通領域チェックテーブル４３２が、共通領域解放プログラム４１７により作成されてもよいし、予め共有メモリ４０４に用意されていてもよい。
【０１７３】
共通領域解放プログラム４１７は、いずれかの共通ブロック６０１Ｃを選択する（Ｓ２８０１）。Ｓ２８０１で選択した共通ブロック６０１Ｃを、図２８の説明において「対象共通ブロック６０１Ｃ」と言う。
【０１７４】
共通領域解放プログラム４１７は、重複管理テーブル４３０を参照し、対象共通ブロック６０１Ｃを参照する参照元が１つでも存在するか否かを判断する（Ｓ２８０２）。
【０１７５】
Ｓ２８０２の判断結果が真の場合（Ｓ２８０２：Ｙｅｓ）、次の処理が行われる。すなわち、共通領域解放プログラム４１７は、重複管理テーブル４３０から、対象共通ブロック６０１Ｃに対応したいずれかの参照元エントリを選択し、当該参照元エントリから参照元のＶＯＬ＃及び論理アドレスを特定する（Ｓ２８０３）。共通領域解放プログラム４１７は、Ｓ２８０３で特定したＶＯＬ＃に対応したアドレス変換テーブル４２２から、Ｓ２８０３で特定した論理アドレスに対応した参照先ＶＯＬ＃９０２及び参照先ＶＯＬ内アドレス９０３を特定する（Ｓ２８０４）。Ｓ２８０４で特定した参照先（参照先ＶＯＬ＃９０２及び参照先ＶＯＬ内アドレス９０３）が、対象共通ブロック６０１Ｃに一致していれば（Ｓ２８０５：Ｙｅｓ）、共通領域解放プログラム４１７は、対象共通ブロック６０１Ｃに対応した参照フラグ１９０２を“有”とする（Ｓ２８０６）。一方、Ｓ２８０４で特定した参照先が、対象共通ブロック６０１Ｃに一致していなければ（Ｓ２８０５：Ｎｏ）、共通領域解放プログラム４１７は、Ｓ２８０３で選択した参照元エントリを、対象共通ブロック６０１Ｃに対応した参照元エントリから削除する（Ｓ２８０７）。なお、対象共通ブロック６０１Ｃに、同一の提供ボリューム５０１Ｐを参照元とする複数の参照元エントリがある場合には、当該同一提供ボリューム５０１Ｐに対応した複数の参照元エントリがそれぞれ表す複数の論理アドレスについて、まとめて、Ｓ２８０３〜Ｓ２８０７が行われてよい。
【０１７６】
Ｓ２８０２の判断結果が偽の場合（Ｓ２８０２：Ｎｏ）、対象共通ブロック６０１Ｃに対応した全ての参照元エントリについてＳ２８０３〜Ｓ２８０７が行われたか、或いは、対象共通ブロック６０１Ｃに１つの参照元エントリが無い。この場合、共通領域解放プログラム４１７は、対象共通ブロック６０１Ｃに対応した参照フラグ１９０２が“有”か否かを判断する（Ｓ２８０８）。
【０１７７】
Ｓ２８０８の判断結果が偽の場合（Ｓ２８０８：Ｎｏ）、言い換えれば、対象共通ブロック６０１Ｃに対応した参照フラグ１９０２が“無”の場合、対象共通ブロック６０１Ｃを参照先とする参照元が１つも存在しないので、次の処理が行われる。すなわち、共通領域解放プログラム４１７は、ハッシュ管理テーブル４２９を更新、具体的には、対象共通ブロック６０１Ｃに対応したＶＯＬ＃１６０３及びＶＯＬ内アドレス１６０４を格納したエントリについて、登録フラグ１６０２を“無”に更新し、ＶＯＬ＃１６０３及びＶＯＬ内アドレス１６０４を削除する（Ｓ２８０９）。また、共通領域解放プログラム４１７は、対象共通ブロック６０１Ｃを未使用へと解放、具体的には、対象共通ブロック６０１Ｃに対応した使用中フラグ１８０２を“未使用”に更新する（Ｓ２８１０）。
【０１７８】
Ｓ２８０８の判断結果が真の場合（Ｓ２８０８：Ｙｅｓ）、Ｓ２８０９及びＳ２８１０は行われない。対象共通ブロック６０１Ｃを参照先とする少なくとも１つの参照元が存在するためである。
【０１７９】
以上の共通領域解放処理によれば、参照元が存在しなくなった共通ブロック６０１Ｃを検出することができ、検出された共通ブロック６０１Ｃを未使用へと解放することができる。以って、共通ボリューム５０１Ｃの空き容量（空きブロック）を増やすことができる。
【０１８０】
以上、一実施形態を説明したが、これは本発明の説明のための例示であって、本発明の範囲をこの実施形態にのみ限定する趣旨ではない。本発明は、他の種々の形態でも実施することが可能である。例えば、ライト要求のようなＩ／Ｏ要求の送信元（Ｉ／Ｏ元）は、上述の実施形態では、サーバシステム２０１であるが、ストレージシステム２００における図示しないプログラム（例えば、ＶＭ上で実行されるアプリケーションプログラム）であってもよい。
【符号の説明】
【０１８１】
２００…ストレージシステム
【図１】
2019159605.tif 000003
【図２】
2019159605.tif 000004
【図３】
2019159605.tif 000005
【図４】
2019159605.tif 000006
【図５】
2019159605.tif 000007
【図６】
2019159605.tif 000008
【図７】
2019159605.tif 000009
【図８】
2019159605.tif 000010
【図９】
2019159605.tif 000011
【図１０】
2019159605.tif 000012
【図１１】
2019159605.tif 000013
【図１２】
2019159605.tif 000014
【図１３】
2019159605.tif 000015
【図１４】
2019159605.tif 000016
【図１５】
2019159605.tif 000017
【図１６】
2019159605.tif 000018
【図１７】
2019159605.tif 000019
【図１８】
2019159605.tif 000020
【図１９】
2019159605.tif 000021
【図２０】
2019159605.tif 000022
【図２１】
2019159605.tif 000023
【図２２】
2019159605.tif 000024
【図２３】
2019159605.tif 000025
【図２４】
2019159605.tif 000026
【図２５】
2019159605.tif 000027
【図２６】
2019159605.tif 000028
【図２７】
2019159605.tif 000029
【図２８】
2019159605.tif 000030