(57)【特許請求の範囲】
【請求項１】
１以上の物理記憶デバイスと、
前記１以上の物理記憶デバイスに対するＩ／Ｏ（Input/Output）を制御するコントローラと
を有し、
前記コントローラは、
論理アドレス空間である仮想ボリュームを提供し、
前記物理記憶デバイスに基づく論理記憶空間であるプールを管理し、
前記仮想ボリュームに書き込まれたデータを、圧縮して前記プールに書き込み、
前記プールに記憶領域が割当て済のデータを更新する新データが前記仮想ボリュームに書き込まれた場合、前記コントローラは、
前記新データを圧縮して圧縮新データを作成し、
前記圧縮新データのサイズが、更新前のデータである旧データに割当て済みの前記プールでの記憶領域のサイズより大きいか否かを判定し、
前記割当て済みの記憶領域のサイズよりも大きい場合、前記旧データに割当て済みの記憶領域以外の記憶領域に前記圧縮新データを書き込み、前記割当て済みの記憶領域のサイズより大きくない場合、前記新データを前記旧データに割当て済みの記憶領域に書き込む
ストレージ装置。
【請求項２】
前記割当て済みの記憶領域のサイズよりも大きく、前記割当て済みの記憶領域以外の記憶領域に前記圧縮新データを書き込んだ場合、前記旧データに割り当て済みの記憶領域をガベージ領域にし、
他の圧縮新データが、その旧データの割当て済みの記憶領域のサイズよりも大きい場合、前記他の圧縮新データよりもサイズの大きい前記ガベージ領域に書き込む
請求項１記載のストレージ装置。
【請求項３】
前記他の圧縮新データが書き込まれるガベージ領域は、前記他の圧縮新データのサイズ以上のサイズのガベージ領域のうち、最もサイズの小さいガベージ領域である、
請求項２記載のストレージ装置。
【請求項４】
前記他の圧縮新データのサイズ以上のサイズのガベージ領域が見つからない場合に、未割当の記憶領域に前記他の圧縮新データを書き込む
請求項２記載のストレージ装置。
【請求項５】
前記圧縮新データを書き込む前記旧データに割当て済みの記憶領域以外の記憶領域は、未割当の記憶領域である
請求項１記載のストレージ装置。
【請求項６】
前記コントローラが、
プール総使用量が閾値を超えている場合に、前記他の圧縮新データを前記ガベージ領域に書き込み、プール総使用量が閾値を超えていない場合に、前記他の圧縮新データを未割当の記憶領域に書き込む
請求項２記載のストレージ装置。
【請求項７】
プールに記憶領域が割当て済のデータを更新する新データが仮想ボリュームに書き込まれた場合、前記新データを圧縮して圧縮新データを作成し、
前記圧縮新データのサイズが、更新前のデータである旧データに割当て済みの前記プールでの記憶領域のサイズより大きいか否かを判定し、
前記割当て済みの記憶領域のサイズよりも大きい場合、前記旧データに割当て済みの記憶領域以外の記憶領域に前記圧縮新データを書き込み、前記割当て済みの記憶領域のサイズより大きくない場合、前記新データを前記旧データに割当て済みの記憶領域に書き込む
ストレージ装置による記憶領域管理方法。
【請求項８】
前記割当て済みの記憶領域のサイズよりも大きく、前記割当て済みの記憶領域以外の記憶領域に前記圧縮新データを書き込んだ場合、前記旧データに割り当て済みの記憶領域をガベージ領域にし、
他の圧縮新データが、その旧データの割当て済みの記憶領域のサイズよりも大きい場合、前記他の圧縮新データよりもサイズの大きい前記ガベージ領域に書き込む
請求項７記載の記憶領域管理方法。
【請求項９】
前記他の圧縮新データが書き込まれるガベージ領域は、前記他の圧縮新データのサイズ以上のサイズのガベージ領域のうち、最もサイズの小さいガベージ領域である、
請求項８記載の記憶領域管理方法。
【請求項１０】
前記他の圧縮新データのサイズ以上のサイズのガベージ領域が見つからない場合に、未割当の記憶領域に前記他の圧縮新データを書き込む
請求項８記載の記憶領域管理方法。
【請求項１１】
前記圧縮新データを書き込む前記旧データに割当て済みの記憶領域以外の記憶領域は、未割当の記憶領域である
請求項７記載の記憶領域管理方法。
【請求項１２】
プール総使用量が閾値を超えている場合に、前記他の圧縮新データを前記ガベージ領域に書き込み、プール総使用量が閾値を超えていない場合に、前記他の圧縮新データを未割当の記憶領域に書き込む
請求項８記載の記憶領域管理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、概して、記憶領域の管理に関する。
【背景技術】
【０００２】
仮想ボリューム（論理アドレス空間）におけるライト先仮想領域（論理アドレス範囲）にプール（実領域群）から実領域（論理記憶領域）を割り当て当該実領域にデータを書き込むストレージ装置が知られている。実領域に書き込まれたデータは、当該実領域に割り当てられた物理的な記憶領域に書き込まれる。また、ライト先仮想領域に実領域が割当て済であれば、ストレージ装置は、上書きライト処理を行う、すなわち、新データ（今回のライト対象のデータ）を旧データ（前回のライト対象のデータ）に上書きする。【０００３】
しかし、ストレージ装置がデータを圧縮して実領域に格納するようになっている場合、圧縮によりデータサイズは変化するため、上書きライト処理では、圧縮旧データ（圧縮された旧データ）のサイズより圧縮新データ（圧縮された新データ）のサイズが大きいことがある。その場合は、圧縮旧データが存在する領域内に圧縮旧データを上書きすることができない。このため、ストレージ装置は、割当て済実領域に代えてより大きい実領域をプールからライト先仮想領域に割り当て、そのより大きい実領域に圧縮新データを書き込む。割当て済実領域（圧縮旧データが格納されている実領域）はガベージとなり、無効実領域として管理される。ストレージ装置は、ガベージの容量を空き容量として管理せず、ガベージには新たにデータを書き込まない。特許文献１は、ガベージが一定量溜まったら、ガベージコレクション処理（以降、ＧＣ処理）を実行することで、ガベージを空き容量とする技術を開示する。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】米国特許第８５２７５４４号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ＧＣ処理はオーバヘッドがかかる。圧縮新データのサイズが割当て済実領域のサイズ以下であれば、圧縮新データを割当て済実領域へ上書きすることができ、以って、ガベージの発生を回避できる。しかし、新データの圧縮後のサイズは、新データの属性や圧縮の方式（例えば圧縮アルゴリズム）によって決まるため、必ずしもガベージの発生を回避することはできない。
【課題を解決するための手段】
【０００６】
仮想ボリュームのうちのライト先仮想領域に実領域が割当て済の場合、ストレージ装置が、圧縮新データのサイズが、割当て済の実領域のサイズより大きいか否かを判定する。その判定結果が真の場合、ストレージ装置が、圧縮新データのサイズ以上のサイズの１以上の実領域であってガベージとしての実領域であるガベージ領域を含む１以上の実領域があるか否かを判定する。その判定結果が真の場合、ストレージ装置が、ガベージ領域を含む１以上の実領域を選択し、選択した１以上の実領域を、割当て済の実領域に代えてライト先仮想領域に割り当て、割当て済の実領域をガベージ領域として管理する。
【発明の効果】
【０００７】
データが圧縮されてから実領域に格納されるようになっていて、且つ、圧縮新データのサイズが割当て済実領域のサイズを超えていても、ガベージ領域が増える可能性を低減することができる。
【図面の簡単な説明】
【０００８】
【図１】圧縮新データのサイズが割当て済のサブプールページのサイズを超えている場合に行われる実施例１に係る上書きライト処理の一例の概要を示す模式図である。
【図２】実施例１に係る計算機システムの構成例を示す。
【図３】ストレージシステムが有するプログラム及び管理情報の例を示す。
【図４】仮想ボリュームテーブルの構成例を示す。
【図５】プール管理テーブルの構成例を示す。
【図６】プールボリュームテーブルの構成例を示す。
【図７】ストレージシステムにおける記憶階層の例を示す。
【図８】プールとプールボリュームの関係の第１の例を示す。
【図９】プールとプールボリュームの関係の第２の例を示す。
【図１０】ライト処理のフローチャートである。
【図１１】実施例１に係るサブプールページ選択処理のフローチャートである。
【図１２】実施例２に係るサブプールページ選択処理のフローチャートである。
【図１３】実施例３に係るサブプールページ選択処理のフローチャートである。
【図１４】圧縮新データのサイズが割当て済のサブプールページのサイズ以下の場合の上書きライト処理の一例の概要を示す模式図である。
【図１５】圧縮新データのサイズが割当て済のサブプールページのサイズを超えている場合の上書きライト処理の一例の概要を示す模式図である。
【図１６】圧縮新データのサイズが割当て済のサブプールページのサイズを超えている場合に行われる一比較例に係る上書きライト処理の一例の概要を示す模式図である。
【発明を実施するための形態】
【０００９】
以下、図面を参照しながら実施例を説明する。ただし、本実施例は、発明を実現するための一例に過ぎず、発明の技術的範囲を限定するものではない。また、各図において共通の構成については、同一の参照番号が付されている。
【００１０】
なお、以降の説明においては、「ａａａテーブル」又は「ａａａキュー」の表現にて各種情報を説明することがあるが、各種情報は、テーブル又はキュー以外のデータ構造で表現されていてもよい。データ構造に依存しないことを示すために「ａａａテーブル」又は「ａａａキュー」を「ａａａ情報」と呼ぶことができる。
【００１１】
また、以降の説明においては、「インターフェース部」は、１以上のインターフェースデバイス、具体的には、ユーザインターフェース部と、通信インターフェース部とのうちの少なくとも１つを含んでよい。ユーザインターフェース部は、１以上のＩ／Ｏデバイス（例えば入力デバイス（例えばキーボード及びポインティングデバイス）と出力デバイス（例えば表示デバイス））と表示用計算機とのうちの少なくとも１つのＩ／Ｏデバイスを含んでよい。通信インターフェース部は、１以上の通信インターフェースデバイスを含んでよい。１以上の通信インターフェースデバイスは、１以上の同種の通信インターフェースデバイス（例えば１以上のＮＩＣ（Network Interface Card））であってもよいし２以上の異種の通信インターフェースデバイス（例えばＮＩＣとＨＢＡ（Host Bus Adapter））であってもよい。
【００１２】
また、以降の説明においては、「記憶部」は、１以上のメモリを含む。記憶部に関して少なくとも１つのメモリは、揮発性メモリでよい。記憶部は、主に、プロセッサ部による処理の際に使用される。
【００１３】
また、以降の説明においては、「プロセッサ部」は、１以上のプロセッサを含む。少なくとも１つのプロセッサは、典型的には、ＣＰＵ（Central Processing Unit）のようなマイクロプロセッサである。１以上のプロセッサの各々は、シングルコアでもよいしマルチコアでもよい。プロセッサは、処理の一部または全部を行うハードウェア回路を含んでもよい。プロセッサ部は、処理の一部又は全部を行うハードウェア回路（例えばＦＰＧＡ（Field-Programmable Gate Array）又はＡＳＩＣ（Application Specific Integrated Circuit））を含んでもよい。
【００１４】
また、以降の説明では、「ＰＤＥＶ」は、物理的な記憶デバイスを意味し、典型的には、不揮発性の記憶デバイス（例えば補助記憶デバイス）でよい。ＰＤＥＶは、例えば、ＨＤＤ（Hard Disk Drive）又はＳＳＤ（Solid State Drive)でよい。ストレージシステムに異なる種類のＰＤＥＶが混在していてもよい。
【００１５】
また、以降の説明では、「ＲＡＩＤ」は、Redundant Array of Independent (or Inexpensive) Disksの略である。
【００１６】
また、以降の説明では、「ＲＡＩＤグループ」は、複数のＰＤＥＶで構成され関連付けられたＲＡＩＤレベル（ＲＡＩＤ構成）に従いデータを記憶するグループでもよいし、複数の物理記憶領域で構成され関連付けられたＲＡＩＤレベル（ＲＡＩＤ構成）に従いデータを記憶するグループでもよい。
【００１７】
また、以降の説明においては、要素の識別情報として番号が使用されるが、番号に代えて又は加えて他種の識別情報が使用可能である。
【００１８】
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号における共通部分を使用し、同種の要素を区別して説明する場合は、要素の参照符号（枝番を含む）を使用することがある。
【００１９】
また、以降の実施例の説明において、ストレージ装置の一例が、１以上のＰＤＥＶを有するストレージシステムであるが、ストレージ装置の一例として、ＰＤＥＶを採用することもできる。ストレージ装置がＰＤＥＶ（例えばフラッシュメモリデバイス）の場合、ストレージ装置は、１以上の物理記憶媒体（例えばフラッシュメモリチップ）と、１以上の物理記憶媒体に対するＩ／Ｏを制御するコントローラとを有する。ＰＤＥＶ及び物理記憶媒体の各々は、物理記憶資源の一例である。
【実施例１】
【００２０】
後に図２を参照して詳細に説明するように、ストレージシステム３０は、１以上のＰＤＥＶ３４と、１以上のＰＤＥＶ３４に対するデータＩ／Ｏ（Input/Output）を制御するコントローラ３１とを有する。コントローラ３１が、データの圧縮及び伸張を行うようになっている。【００２１】
図１４に示すように、コントローラ３１が、１以上のプール６００を管理する。プール６００は、論理記憶空間である。プール６００の少なくとも一部は、複数のＰＤＥＶ３４のうちの少なくとも一部に基づいていてもよいし、プール６００の少なくとも一部は、ストレージシステム３０の外部のストレージシステム（図示せず）が提供する記憶領域に基づいていてもよい。プール６００は、サイズが異なる複数のサブプールページ（論理記憶領域）６４１で構成される。【００２２】
コントローラ３１は、ホスト計算機１０のような上位装置に仮想ボリューム５０１（論理アドレス空間）を提供する。図１４に示すように、仮想ボリューム５０１における仮想ページ（論理アドレス範囲）５２−１、５２−２及び５２−３に、それぞれ、サブプールページ６１−１、６１−２及び６１−３が割り当てられており、サブプールページ６１−１、６１−２及び６１−３に、それぞれ、圧縮旧データＡ、Ｂ及びＣが格納されているとする。【００２３】
この状況において、図１４に示すように、仮想ページ５２−１をライト先として新データＤのライト要求をコントローラ３１が受信したとする。コントローラ３１は、新データＤを圧縮し、圧縮新データＤのサイズが、ライト先仮想ページ５２−１に割り当てられているサブプールページ６１−１のサイズ（又は当該サブプールページ６１−１に格納されている圧縮旧データＡのサイズ）以下か否かを判断する。その判断結果が真の場合、図１４に示すように、コントローラ３１は、圧縮新データＤを割当て済サブプールページ６１−１に上書きする。【００２４】
一方、上述の状況において、図１５に示すように、仮想ページ５２−１をライト先として新データＥのライト要求をコントローラ３１が受信したとする。コントローラ３１は、新データＥを圧縮し、圧縮新データＥのサイズが、ライト先仮想ページ５２−１に割り当てられているサブプールページ６１−１のサイズ（又は当該サブプールページ６１−１に格納されている圧縮旧データＡのサイズ）以下か否かを判断する。その判断結果が偽の場合、図１５に示すように、コントローラ３１は、ライト先仮想ページ５２−１に対し、サブプールページ６１−１に代えて、より大サイズのサブプールページ６１−４を割り当て、サブプールページ６１−４に圧縮新データＥを書き込む。結果として、サブプールページ６１−１がガベージとなる。【００２５】
このようにしてプール６００にガベージが生じる。本実施例は、プール６００におけるガベージ総量を次のようにして抑え、結果として、ガベージコレクション処理（ＧＣ処理）の負荷を軽減することができる。【００２６】
例えば、図１５に示した状況、すなわち、サブプールページ６１−１がガベージとして存在する状況において、図１に示すように、コントローラ３１が、仮想ページ５２−３をライト先として新データＦのライト要求を受信したとする。コントローラ３１は、新データＦを圧縮し、圧縮新データＦのサイズが、ライト先仮想ページ５２−３に割り当てられているサブプールページ６１−３のサイズ（又は当該サブプールページ６１−３に格納されている圧縮旧データＣのサイズ）以下か否かの第１判断を行う。第１判断の結果が偽の場合、コントローラ３１は、圧縮新データＦのサイズが、いずれかのガベージ（ここではサブプールページ６１−１）（又は、そのガベージ内の圧縮データのサイズ）以下か否かの第２判断を行う。第２判断の結果が真の場合、図１に示すように、コントローラ３１は、ライト先仮想ページ５２−３に対し、サブプールページ６１−３に代えて、ガベージとしてのサブプールページ６１−１を割り当て、その割り当てたサブプールページ６１−１に圧縮新データＦを書き込む。結果として、サブプールページ６１−３がガベージとなるものの、ガベージの数が増えることを避けることができる。すなわち、本実施例によれば、上書きライト処理の対象の圧縮新データのライト先としてガベージが使用されるため（言い換えれば、オーバヘッドが性能低下の原因となっているＧＣ処理をしなくてもガベージが再利用可能であるため）、ストレージシステム３０の性能を向上することが期待できる。【００２７】
一方、図１６に示す一比較例によれば、上述の第２の判断は行われない。すなわち、第１判断の結果が偽の場合、ライト先仮想ページ５２−３に対し、サブプールページ６１−３に代えて、より大サイズのサブプールページ６１−５が割り当られて、サブプールページ６１−５に圧縮新データＦが書き込まれる。結果として、サブプールページ６１−１に加えてサブプールページ６１−３がガベージとなる。つまり、ガベージの数が増えてしまう。【００２８】
以下、本実施例を詳細に説明する。【００２９】
図２は、本実施例に係る計算機システムの構成例を示す。【００３０】
計算機システム１は、少なくとも１つのホスト計算機１０（例えば、汎用大型コンピュータやサーバや汎用のハードウェアコンポーネントから構成される装置や汎用サーバなど）と、少なくとも１つの管理装置２０（例えば、管理計算機やサーバや汎用のハードウェアコンポーネントから構成される装置や汎用サーバなど）と、これらが接続されるストレージシステム３０と、を有している。【００３１】
ホスト計算機１０は、ストレージシステム３０の論理的な記憶資源（例えば論理アドレス空間）にアクセスする。管理装置２０は、ストレージシステム３０の記憶領域の構成を管理する。ストレージシステム３０は、１以上のＰＤＥＶ３４に基づく記憶領域にデータを格納する。ホスト計算機１０及び管理装置２０の少なくとも１つは複数台でもよい。【００３２】
ストレージシステム３０は、複数のＰＤＥＶ３４と、コントローラ３１とを有する。コントローラ３１は、外部に、少なくとも１つのキャッシュメモリ３２と、少なくとも１つの共有メモリ３３とを有する。キャッシュメモリ３２、共有メモリ３３及びコントローラ３１の少なくとも１つが冗長化されていてもよい。また、コントローラ３１内部のハードウェア構成も冗長化されていてもよい。【００３３】
コントローラ３１は、ＰＤＥＶ３４に基づく記憶領域へのデータの格納を制御する。キャッシュメモリ３２は、ＰＤＥＶ３４に読み書きされるデータを一時的に格納する。共有メモリ３３は、コントローラ３１やＰＤＥＶ３４に関する構成情報を格納する。【００３４】
ＰＤＥＶ３４は、どのような物理記憶デバイスでもよく、例えば、ＨＤＤでもよいしＳＳＤでもよい。【００３５】
コントローラ３１は、ホストアダプタ３１０、ネットワークアダプタ３２０、不揮発性メモリ（ＮＶＭｅ）３３０、メモリ３５０、ストレージアダプタ３７０、共有メモリアダプタ３８０、圧縮伸張回路（Ｃ／Ｄ）３９０、及びそれらに接続されたプロセッサ３６０を有している。ホストアダプタ３１０、ネットワークアダプタ３２０、ストレージアダプタ３７０及び共有メモリアダプタ３８０のうちの少なくとも１つが、インターフェース部の一例である。不揮発性メモリ３３０、メモリ３５０、キャッシュメモリ３２及び共有メモリ３３の少なくとも１つが、記憶部の一例である。プロセッサ３６０が、プロセッサ部の一例である。【００３６】
ホストアダプタ３１０は、ストレージエリアネットワーク（ＳＡＮ）１２１を介してホスト計算機１０との間でデータを送受信する。ネットワークアダプタ３２０は、ネットワーク１０８（例えばＬＡＮ（Local Area Network））を介してホスト計算機１０、又は、管理装置２０との間でシステム管理上必要なデータ（例えば、管理情報）を送受信する。【００３７】
不揮発性メモリ３３０は、例えばハードディスクやフラッシュメモリで構成され、コントローラ３１で動作するプログラムや構成情報等を格納する。【００３８】
メモリ３５０は、例えばＲＡＭ（Random Access Memory）等の揮発性メモリでよく、プログラムやデータ等を格納する。【００３９】
プロセッサ３６０は、不揮発性メモリ３３０に格納されているプログラムをメモリ３５０に読み込んで、そのプログラムに規定された処理を実行する。【００４０】
ストレージアダプタ３７０は、ＰＤＥＶ３４、及び、キャッシュメモリ３２との間でデータを送受信する。共有メモリアダプタ３８０は、共有メモリ３３との間でデータを送受信する。【００４１】
圧縮伸長回路３９０は、ハードウェア回路であり、入力されたデータを圧縮又は伸長して出力する。圧縮及び伸長の少なくとも一方がハードウェア回路に代えて、コンピュータプログラムがプロセッサ３６０で実行されることによって行われてもよい。【００４２】
ネットワークアダプタ３２０（又は図示しない他のアダプタ）からネットワーク１２１（又は別のネットワーク）を介して図示しない外部のストレージシステムが接続されてもよい。当該外部のストレージシステムから提供される記憶領域の少なくとも一部が、上述のプール６００の少なくとも一部の記憶領域でもよい。【００４３】
なお、管理装置２０が接続されない構成でもよい。【００４４】
また、ストレージシステム３０は、１以上の物理的な計算機（例えば汎用計算機）を含んだ計算機システムでよい。少なくとも１つの物理的な計算機が、仮想的な計算機（例えばＶＭ（Virtual Machine））を実行してもよいし、ＳＤｘ（Software-Defined anything）を実行してもよい。ＳＤｘとしては、例えば、ＳＤＳ（Software Defined Storage）（仮想的なストレージシステム）又はＳＤＤＣ（Software-defined Datacenter）を採用することができる。また、その場合、ホスト計算機１０は、当該計算機システムにおいて実行される仮想的な計算機であってもよい。【００４５】
図３は、ストレージシステム３０が有するプログラム及び管理情報の例を示す。【００４６】
プログラム及び管理情報は、例えばメモリ３５０に格納される。プログラムはプロセッサ３６０によって実行される。プログラムとしては、例えば、Ｉ／Ｏ処理プログラム３５２及びプール管理プログラム３５４がある。管理情報は、例えば、仮想ボリュームテーブル５１０、プール管理テーブル６１０及びプールボリュームテーブル６６０は含む。Ｉ／Ｏ処理プログラム３５２及びプール管理プログラム３５４をプロセッサ３６０が実行することでコントローラ３１の動作の少なくとも一部が制御される。【００４７】
Ｉ／Ｏ処理プログラム３５２は、ページに圧縮データを格納するなどのＩ／Ｏに関する処理を行うためのプログラムである。プール管理プログラム３５４は、ページの選択などプール管理に関する処理を行うためのプログラムである。仮想ボリュームテーブル５１０は、仮想ボリュームに関する情報を保持するテーブルである。プール管理テーブル６１０は、プール６００に関する情報を保持するテーブルである。プールボリュームテーブル６６０は、プールボリュームに関する情報を保持するテーブルである。これらのプログラム及びテーブルは、不揮発メモリ３３０に格納されていてもよく、その場合はそれらがメモリ３５０にロードされる。【００４８】
図４は、仮想ボリュームテーブル５１０の構成例を示す。【００４９】
仮想ボリュームテーブル５１０は、仮想ページ毎に、エントリを有する。各エントリは、仮想ボリューム＃５１１、仮想ページ＃５１２、圧縮後サイズ５１３、プール＃５１４、サブプール＃５１５及びサブプールページ＃５１６といった情報を格納する。以下、１つの仮想ページ（図４の説明において「対象仮想ページ」）を例に取る。【００５０】
仮想ボリューム＃５１１は、対象仮想ページを含んだ仮想ボリュームを識別する番号である。仮想ページ＃５１２は、対象仮想ページを識別するための番号である。圧縮後サイズ５１３は、ライト対象のデータが圧縮伸長回路３９０にて圧縮された後のデータのサイズを示す。圧縮後サイズ５１３を参照することにより、プール６００内の適切なサブプール（後述）を選択できる。プール＃５１４は、対象仮想ページに割り当てられたサブプールページを含むプールを識別するための番号である。サブプール＃５１５は、対象仮想ページに割り当てられたサブプールページを含むサブプールを識別するための番号である。サブプールページ＃５１６は、対象仮想ページに割り当てられたサブプールページを識別するための番号である。なお、仮想ページにサブプールページが割り当てられていなければ、圧縮後サイズ５１３、プール＃５１４、サブプール＃５１５及びサブプールページ＃５１６の各々の値は、データが無いことを示す値（例えば“Ｎ／Ａ”）である。【００５１】
仮想ボリュームテーブル５１０は、図示していないが、仮想ボリューム毎に、圧縮に対応するか否かを示す情報を持ってもよい。それにより、仮想ボリューム単位で圧縮機能に対応するか否かを区別して処理することができる。圧縮に対応しない仮想ボリュームに対してはコントローラ３１はデータを圧縮すること無しにサブプールページ（実ページ）に書き込んでよい。【００５２】
図５は、プール管理テーブル６１０の構成例を示す。【００５３】
ストレージシステム３０は、１以上のプールを有し、少なくとも１つのプールが、サブプールページサイズが異なる複数のサブプールで構成されている。各サブプールは、サブプールページサイズが同じ複数のサブプールページの集合である。プール管理テーブル６１０は、サブプール毎に、エントリを有する。各エントリは、プール＃６１１、サブプール＃６１２、プールページサイズ６１３、使用ポインタ（使用ページキューへのポインタ）６１４、及び、未使用ポインタ（未使用ページキューへのポインタ）６１５といった情報を格納する。以降、１つのサブプール（図５の説明において「対象サブプール」）を例に取る。【００５４】
プール＃６１１は、対象サブプールを含むプールを識別するための番号である。サブプール＃６１２は、対象サブプールを識別するための番号である。サブプールページサイズ６１３は、対象サブプール内のサブプールページのサイズ（長さ）を示す。【００５５】
各サブプールについて、複数のサブプールページは、本実施例ではキューを使って管理されている。使用ポインタ６１４は、対象サブプールのうちの使用サブプールページ（いずれかの仮想ページに割り当てられているサブプールページ）を管理するキュー６２０（以降、使用キュー）の先頭アドレスを示す。未使用ポインタ６１５は、対象サブプールのうちの未使用サブプールページ（いずれの仮想ページにも割り当てられていないサブプールページ）を管理するキュー６３０（以降、未使用キュー）の先頭アドレスを示す。使用キュー６２０及び未使用キュー６３０は、サブプールページ（実ページ）を管理するものであり、本実施例ではキューを使用した管理が採用されるが、キューを使用する以外の方法で管理が行われてもよい。【００５６】
使用キュー６２０は、使用サブプールページ毎に、エントリを有する。各エントリは、サブプールページ＃６２１、プールボリューム＃６２２及び実ページ＃６２３といった情報を格納する。以降、１つの使用サブプールページ（図５の説明において「対象使用サブプールページ」）を例に取る。サブプールページ＃６２１は、対象使用サブプールページを識別するための番号である。プールボリューム＃６２２は、対象使用サブプールページに対応付けられている実ページを有するプールボリュームを識別するための番号である。実ページ＃６２３は、対象使用サブプールページに対応付けられている（マッピングされている）実ページを識別するための番号である。【００５７】
未使用キュー６３０は、未使用サブプールページ毎に、エントリを有する。各エントリは、サブプールページ＃６３１、プールボリューム＃６３２、実ページ＃６３３及びガベージフラグ６３４といった情報を格納する。以降、１つの使用サブプールページ（図５の説明において「対象未使用サブプールページ」）を例に取る。サブプールページ＃６３１は、対象未使用サブプールページを識別するための番号である。プールボリューム＃６３２は、対象未使用サブプールページに対応付けられている実ページを有するプールボリュームを識別するための番号である。実ページ＃６２３は、対象未使用サブプールページに対応付けられている（マッピングされている）実ページを識別するための番号である。ガベージフラグ６３４は、対象未使用サブプールページがガベージであるか否かを示す。ガベージではない対象未使用サブプールページは、空きサブプールページである。なお、コントローラ３１は、ＧＣ処理を行うことで、ガベージとしての未使用サブプールページに対応したガベージフラグ６３４を、“ガベージ”（ガベージを意味する値）から“−”（空きを意味する値）に更新する。【００５８】
図６は、プールボリュームテーブル６６０の構成例を示す。【００５９】
プールボリュームテーブル６６０は、実プール毎に、エントリを有する。各エントリは、プールボリューム＃６６１、実ページ＃６６２、実ページサイズ６６３及び物理アドレス６６４といった情報を格納する。以降、１つの実ページ（図６の説明において「対象実ページ」）を例に取る。【００６０】
プールボリューム＃６６１は、対象実ページを有するプールボリュームを識別するための番号である。実ページ＃６６２は、対象実ページを識別するための番号である。実ページサイズ６６３は、対象実ページのサイズを示す。対象実ページのサイズと、対象実ページが対応付けられているサブプールページのサイズは、典型的には同じである。物理アドレス６６４は、対象実ページが対応付けられている（マッピングされている）物理的な記憶領域のアドレス（例えばＰＤＥＶ３４が提供する論理アドレス空間のアドレス）を示す。【００６１】
図７は、ストレージシステム３０における記憶階層の例を示す。以下、下位のレイヤから順に記憶領域を説明する。【００６２】
複数のＰＤＥＶ３４がＲＡＩＤグループ３０１を構成する。それら複数のＰＤＥＶ３４に跨るストライプ列３０７がある。【００６３】
ＲＡＩＤグループ３０１の上位に、ＲＡＩＤグループ３０１に基づく仮想的な記憶資源である仮想デバイス３０３がある。仮想デバイス３０３（記憶空間）が仕切られることにより、仮想デバイス３０３に、複数の論理デバイス３０６が形成される。仮想デバイス３０３が１つの論理デバイス３０６であってもよい。論理デバイスを、以降、論理ボリュームとして説明する。【００６４】
仮想デバイス３０３の上位にプール６００がある。プール６００は、複数のサブプール６０１（例えば、ｎ個のサブプール６０１−１〜６０１−ｎ）から構成される。各サブプール６０１は、複数のサブプールページ６１を有する。サブプールページ６１の長さ（サイズ）は、サブプール６０１毎に定義されている。１つのサブプール６０１内では全てのサブプールページの長さは同じである。【００６５】
サブプールページ６４１は、複数のプールボリューム６５０の実ページ６５１に対応付けられている。サブプールページ６１及び実ページ６５１の組（又はサブプールページ６１）が実領域の一例でよい。プールボリューム６５０は、いずれかの論理ボリュームに関連付けられている。プールボリューム６５０は、オフラインボリュームであるため、上位装置であるホスト計算機１０から指定されるターゲットデバイスには関連付けられていない。プールボリューム６５０は、複数の実ページ６５１から構成されている。図７の例では、実ページ６５１とストライプ列３０７とが１対１で対応している。実ページ６５１に格納されるデータは、その実ページ６５１に対応するストライプ列３０７に格納される。１つの実ページ６５１に複数のストライプ列３０７が対応していてもよい。【００６６】
仮想ボリューム５０１は、ホスト計算機１０に提供される論理アドレス空間、すなわち、オンラインボリュームである。仮想ボリューム５０１は、複数の仮想ページ５２で構成される。サブプールページ６１が割り当てられてないライト先の仮想ページ５２には、プール６００内のサブプール６０１にある未使用サブプールページ６１（ガベージ又は空きサブプールページ）が割り当てられる。【００６７】
仮想ボリューム５０１の上位にターゲットデバイス３１６がある。１以上のターゲットデバイス３１６が、ある通信インターフェースデバイスが有する通信ポート３１４に関連付けられており、ターゲットデバイス３１６に、仮想ボリューム５０１が関連付けられている。【００６８】
図８は、プール６００とプールボリューム６５０の関係の第１の例を示す。【００６９】
プールボリューム６５０は、全て同じサイズの実ページ６５１から構成されている。サブプール６０１とプールボリューム６５１が１対１で対応している。【００７０】
図９は、プール６００とプールボリューム６５０の関係の第２の例を示す。【００７１】
プールボリューム６５０は、複数の異なるサイズの実ページから構成されている。サブプール６０１とプールボリューム６５１が多対多で対応している。【００７２】
図１０は、ライト要求を受けた場合に行われるライト処理のフローチャートである。【００７３】
ライト要求では、仮想ボリューム識別番号（例えば、ＬＵＮ（Logical Unit Number））と論理アドレス範囲（例えば、ＬＢＡ（Logical Block Address）及びデータ長）とを含んだライト先情報が指定されている。コントローラ３１は、ライト先情報に従うライト先仮想ページを特定する（Ｓ４１０）。コントローラ３１は、仮想ボリュームテーブル５１０を参照し、ライト先仮想ページにサブプールページが割り当てられているか否かを判定する（Ｓ４２０）。【００７４】
Ｓ４２０の判定結果が偽の場合（Ｓ４２０：ＮＯ）、コントローラ３１は、Ｓ５４０、すなわち、下記を行う。
（Ｓ４２０−１）コントローラ３１は、ライト対象データ（ライト要求に従うデータ）を圧縮伸張回路３９０により圧縮する。
（Ｓ４２０−２）コントローラ３１は、圧縮データ（圧縮伸張回路３９０による圧縮後のデータ）をキャッシュメモリ３２に格納する。
（Ｓ４２０−３）コントローラ３１は、プール管理テーブル６１０を参照し、圧縮データのサイズ以上のサイズの空きサブプールページを特定する。特定される空きサブプールページのサイズは、例えば、圧縮データのサイズ以上のサイズのうちの最小のサイズでよい。
（Ｓ４２０−４）コントローラ３１は、圧縮データのサイズと、特定した空きサブプールページのサイズとに差があれば、その差の分のゼロデータ（パディング用データの一例）を圧縮データに追加することにより、ライト用の圧縮データをキャッシュメモリ３２上に生成する。
（Ｓ４２０−５）コントローラ３１は、特定した空きサブプールページを、ライト先仮想ページに割り当てる（例えば、当該サブプールページの情報を、未使用キュー６３０から使用キュー６２０に移す）。結果として、当該サブプールページは、使用サブプールページとなる。
（Ｓ４２０−６）コントローラ３１は、ライト要求に対する完了をホスト計算機１０に返した後の任意のタイミングで（又は完了を返す前に）、キャッシュメモリ３２上のライト用の圧縮データを、割り当てたサブプールページに書き込む。その際、コントローラ３１は、プール管理テーブル６１０及びプールボリュームテーブル６６０を参照し、当該サブプールページに対応する物理アドレスに圧縮データを書き込む。【００７５】
Ｓ４２０の判定結果が真の場合（Ｓ４２０：ＹＥＳ）、コントローラ３１は、Ｓ４３０〜Ｓ４６０を含む上書きライト処理を行う。【００７６】
具体的には、Ｓ４３０で、コントローラ３１は、下記を行う。
（Ｓ４３０−１）コントローラ３１は、プールボリュームテーブル６６０を参照し、ライト先仮想ページに割り当てられているサブプールページ（以降、図１０の説明で「割当て済サブプールページ」）から圧縮旧データをキャッシュメモリ３２に読み出し、読み出した圧縮旧データを圧縮伸張回路３９０により伸張することで旧データをキャッシュメモリ３２上に得る。
（Ｓ４３０−２）コントローラ３１は、キャッシュメモリ３２における旧データに新データ（ライト要求に従うライト対象データ）を上書きする。
（Ｓ４３０−３）コントローラ３１は、新データを圧縮伸張回路３９０により圧縮することによりキャッシュメモリ３２上に圧縮新データを得る。【００７７】
次に、コントローラ３１は、Ｓ４４０で、圧縮新データのサイズが割当て済サブプールページのサイズ（又は圧縮旧データのサイズ）を超えているか否かを判定する。【００７８】
Ｓ４４０の判定結果が偽の場合（Ｓ４４０：ＮＯ）、Ｓ４５０で、コントローラ３１は、下記を行う。
（Ｓ４５０−１）コントローラ３１は、プール管理テーブル６１０を参照し、圧縮新データのサイズ以上のサイズの空きサブプールページを特定する。特定される空きサブプールページのサイズは、例えば、圧縮新データのサイズ以上のサイズのうちの最小のサイズでよい。
（Ｓ４５０−２）コントローラ３１は、圧縮新データのサイズと、特定した空きサブプールページのサイズとに差があれば、その差の分のゼロデータ（パディング用データの一例）を圧縮新データに追加することにより、ライト用の圧縮新データをキャッシュメモリ３２上に生成する。
（Ｓ４５０−３）コントローラ３１は、特定した空きサブプールページを、割当て済サブプールページに代えてライト先仮想ページに割り当てる。具体的には、例えば、コントローラ３１は、当該サブプールページの情報を、未使用キュー６３０から使用キュー６２０に移し、割当て済サブプールページの情報を使用キュー６２０から未使用キュー６３０に移し、割当て済サブプールページに対応したガベージフラグ６３４を“ガベージ”とする。結果として、）。結果として、当該サブプールページは、使用サブプールページとなり、割当て済サブプールページはガベージとなる。
（Ｓ４５０−４）コントローラ３１は、ライト要求に対する完了をホスト計算機１０に返した後の任意のタイミングで（又は完了を返す前に）、キャッシュメモリ３２上のライト用の圧縮新データを、割り当てたサブプールページに書き込む。【００７９】
Ｓ４４０の判定結果が真の場合（Ｓ４４０：ＹＥＳ）、Ｓ４６０で、コントローラ３１は、下記を行う。
（Ｓ４６０−１）コントローラ３１は、サブプールページ選択処理を行う。
（Ｓ４６０−２）コントローラ３１は、圧縮新データのサイズと、サブプールページ選択処理において選択されたサブプールページ（ガベージ又は空きサブプールページ）のサイズとに差があれば、その差の分のゼロデータ（パディング用データの一例）を圧縮新データに追加することにより、ライト用の圧縮新データをキャッシュメモリ３２上に生成する。
（Ｓ４６０−３）コントローラ３１は、選択されたサブプールページが空きサブプールページの場合、（Ｓ４５０−３）及び（Ｓ４５０−４）と同様の処理を行う。
（Ｓ４６０−４）コントローラ３１は、選択されたサブプールページがガベージの場合、次の処理を行う。すなわち、コントローラ３１は、選択されたサブプールページがガベージを、割当て済サブプールページに代えてライト先仮想ページに割り当てる。具体的には、例えば、コントローラ３１は、当該サブプールページ（ガベージ）の情報を、未使用キュー６３０から使用キュー６２０に移し、割当て済サブプールページの情報を使用キュー６２０から未使用キュー６３０に移し、割当て済サブプールページに対応したガベージフラグ６３４を“ガベージ”とする。結果として、当該ガベージは、使用サブプールページとなり、割当て済サブプールページはガベージとなる。その後、コントローラ３１は、（Ｓ４５０−４）と同様の処理を行う。【００８０】
図１１は、本実施例に係るサブプールページ選択処理のフローチャートである。【００８１】
コントローラ３１は、プール管理テーブル６１０を参照し、プール６００からサブプールを選択する（Ｓ４６１）。ここでは、例えば、圧縮新データのサイズ以上のサイズのサブプールページを含んだサブプールであってＳ４６１で未選択のサブプールのうち、最小のサイズのサブプールページを含んだサブプールが選択される。【００８２】
コントローラ３１は、プール管理テーブル６１０を参照し、Ｓ４６１で選択したサブプールにガベージがあるか否かを判定する（Ｓ４６２）。【００８３】
Ｓ４６２の判定結果が真の場合（Ｓ４６２：ＹＥＳ）、コントローラ３１は、Ｓ４６１で選択したサブプールからいずれかのガベージを選択する（Ｓ４６３）。【００８４】
Ｓ４６２の判定結果が偽の場合（Ｓ４６２：ＮＯ）、コントローラ３１は、圧縮新データのサイズ以上のサイズのサブプールページを有するサブプールであってＳ４６１で未選択のサブプールがあるか否かを判定する（Ｓ４６４）。Ｓ４６４の判定結果が真の場合（Ｓ４６４：ＹＥＳ）、Ｓ４６１が行われる。Ｓ４６４の判定結果が偽の場合（Ｓ４６４：ＮＯ）、コントローラ３１は、最初のＳ４６１で選択したサブプール（例えば、圧縮新データのサイズ以上のサイズのうちの最小のサイズのサブプールページを有するサブプール）から空きサブプールページを選択する（Ｓ４６５）。【００８５】
本実施例によれば、コントローラ３１がデータを圧縮してからサブプールページに書き込むようになっていて、且つ、圧縮新データのサイズが割当て済サブプールページのサイズを超えていても、ガベージが再利用され得るため（ガベージがライト先仮想ページに割り当てられるサブプールページとして選択され得るため）、ガベージが増える可能性を低減することができる。また、圧縮新データのサイズになるべく近いサイズのガベージが再利用されるため、容量効率が低下することを低減できる。
【実施例２】
【００８６】
実施例２を説明する。その際、実施例１との相違点を主に説明し、実施例１との共通点については説明を省略又は簡略する（これは、実施例３以降についても同様である）。【００８７】
図１２は、実施例２に係るサブプールページ選択処理のフローチャートである。【００８８】
実施例２に係るライト先サブプールページ選択処理は、Ｓ４６４が行われない点で、実施例１と相違する。すなわち、Ｓ４６２の判定結果が偽の場合（Ｓ４６２：ＮＯ）、コントローラ３１は、Ｓ４６１で選択したサブプールから空きサブプールページを選択する（Ｓ４６５）。【００８９】
実施例２によれば、実施例１に比べてガベージが再利用される可能性は低くなるものの、ガベージが増える可能性を低減することができる。言い換えれば、圧縮新データのサイズ以上のサイズのうち最も小さいサイズのガベージが無ければ空きサブプールページが選択されるため、実施例１に比べて、容量効率の低下を避けることが優先される
【実施例３】
【００９０】
図１３は、実施例３に係るサブプールページ選択処理のフローチャートである。【００９１】
コントローラ３１は、プール管理テーブル６１０を参照し、プール総使用量が閾値を超えているか否かを判定する（Ｓ６１０）。「プール総使用量」とは、プール総使用容量又はプール総使用割合である。「プール総使用容量」は、使用サブプールページの総容量である。「プール総使用割合」は、プール容量に対するプール総使用容量の割合である。【００９２】
Ｓ６１０の判定結果が真の場合（Ｓ６１０：ＹＥＳ）、コントローラ３１は、図１１又は図１２に示したサブプールページ選択処理を行う（Ｓ６２０）。【００９３】
Ｓ６１０の判定結果が偽の場合（Ｓ６１０：ＮＯ）、コントローラ３１は、プール管理テーブル６１０を参照し、プール６００からサブプール（例えば、圧縮新データのサイズ以上のサイズのうち最小のサイズのサブプールページを含んだサブプール）を選択し、選択したサブプールから空きサブプールページを選択する（Ｓ６３０）。【００９４】
空きサブプールページが充分にある場合、ガベージを選択しなくても問題が無いと考えられる。言い換えれば、ガベージが増えたことにより、実際は空き容量はあるのにも関わらずＧＣ処理を実施しないと、割当て可能なサブプールページが枯渇するといった状況が、回避されればよいと考えられる。プール内にガベージが少ない場合、圧縮新データのサイズに近いサイズのガベージが見つからない場合がある。このような場合でもガベージを再利用しようとすることには、例えば下記の課題があると考えられる。
（ｘ）ガベージを探す処理が、処理コストの増加につながる。
（ｙ）図１１を行うと、（ｘ）に加えて、無駄に大きいサイズのガベージが再利用される可能性があるため、サブプールページ内に無駄な領域が増えてしまうおそれがある。【００９５】
実施例３によれば、ある程度候補となるガベージが溜まった時点でガベージの再利用が行われるため、オーバヘッドの削減をしつつ、容量効率を上げることができる。なお、「プール総使用量」は、「ガベージ総量」と読み替えることもできる。「ガベージ総量」は、ガベージ総容量又はガベージ割合である。「ガベージ総容量」は、ガベージの総容量である。「ガベージ割合」は、プール容量に対するガベージ総容量の割合である。
【実施例４】
【００９６】
実施例４では、未使用キュー６３０に代えて、ガベージキューが用意される。ガベージキューは、ガベージの情報のキューである。ガベージキューは、サブプールページサイズ毎に用意されてもよいが、全てのサブプールページサイズに１つであってもよいし、サブプールページサイズ範囲毎に用意されてもよい。【００９７】
以上、幾つかの実施例を説明したが、これらは本発明の説明のための例示であって、本発明の範囲をこれらの実施例にのみ限定する趣旨ではない。本発明は、他の種々の形態でも実施することが可能である。【００９８】
例えば、２以上の実施例が組み合わされてもよい。【００９９】
また、例えば、１つの仮想ページに複数のサブプールページが割り当てられ、圧縮新データが、その複数のサブプールページに書き込まれてもよい。例えば、コントローラ３１は、総サイズが圧縮新データのサイズ以上になるよう複数のサブプールページを選択し、選択した複数のサブプールページをライト先仮想ページに割り当ててよい。その複数のサブプールページは、複数のガベージでもよいし、複数の空きサブプールページでもよいし、１以上のガベージと１以上のサブプールページとの組み合わせでもよい。
【符号の説明】
【０１００】
３０…ストレージシステム
【図１】
0006696052.tif 000002
【図２】
0006696052.tif 000003
【図３】
0006696052.tif 000004
【図４】
0006696052.tif 000005
【図５】
0006696052.tif 000006
【図６】
0006696052.tif 000007
【図７】
0006696052.tif 000008
【図８】
0006696052.tif 000009
【図９】
0006696052.tif 000010
【図１０】
0006696052.tif 000011
【図１１】
0006696052.tif 000012
【図１２】
0006696052.tif 000013
【図１３】
0006696052.tif 000014
【図１４】
0006696052.tif 000015
【図１５】
0006696052.tif 000016
【図１６】
0006696052.tif 000017