なお、以下の実施例において、ストレージ装置内で実行される処理について、「プログラム」を主語として説明を行う場合がある。実際には、ストレージ装置が有するプロセッサ(CPU)がプログラムを実行することによって、プログラムに記述された処理が行われるため、処理の主体はプロセッサ(CPU)であるが、説明が冗長になることを防ぐため、プログラムを主語にして処理の内容を説明することがある。また、プログラムの一部または全ては専用ハードウェアによって実現されてもよい。また、以下で説明される各種プログラムは、プログラム配布サーバや計算機が読み取り可能な記憶メディアによって提供され、プログラムを実行する各装置にインストールされてもよい。計算機が読み取り可能な記憶メディアとは、非一時的なコンピュータ可読媒体で、例えばICカード、SDカード、DVD等の不揮発性記憶媒体である。
本明細書において、「圧縮」とはLZWアルゴリズム等の可逆圧縮アルゴリズムを用いて、データの意味を保ったままデータサイズを縮小する処理のことを意味する。本実施例に係るストレージ装置では、ホストからストレージ装置に対して書き込まれるデータの圧縮を行うことがある。ストレージ装置で圧縮処理が行われたことによりサイズの縮小されたデータのことを、「圧縮データ」と呼び、ストレージ装置で圧縮処理が施されていないデータの事を「非圧縮データ」と呼ぶ。また可逆圧縮アルゴリズムを用いて、圧縮データを元のデータサイズに戻す処理のことを、「伸長」と呼ぶ。
また以下で説明する実施例では、データ圧縮によるデータの縮小効率の指標として、「圧縮率」を用いる。実施例における圧縮率は、以下の計算式により定義されるものである。
圧縮率=(非圧縮データのサイズ−圧縮データのサイズ)÷非圧縮データのサイズ
以下の実施例では、「圧縮率が低い」、「圧縮率が高い」等の表現が用いられるが、その場合の圧縮率は、上の計算式により定義されるものである。そのため圧縮後のデータについて、「圧縮率が低い」または「圧縮率が小さい」と表現される場合、圧縮によりデータがあまり縮小されなかったことを意味する。一例として圧縮処理の結果、データサイズが全く変化しなかった場合には、圧縮率は0となる。逆に「圧縮率が高い」とは、圧縮によるデータ縮小量が多いことを意味する。
「ボリューム」とは、ストレージ装置や記憶デバイス等のターゲットデバイスが、ホスト計算機等のイニシエータデバイスに提供する記憶空間のことを意味する。イニシエータデバイスが記憶空間上のある位置(アドレス)に対するデータの書き込み要求を発行すると、そのアドレスに割り当てられている記憶領域にデータが格納される。本実施例に係るストレージ装置はボリュームとして、いわゆるThin Provisioning技術により形成される仮想ボリュームをホストに提供する。仮想ボリュームは、その初期状態(仮想ボリュームが定義された直後)では、仮想ボリューム上の各アドレスに記憶領域が割り当てられていない。ストレージ装置は、イニシエータデバイス(ホスト)から記憶空間上のアドレスに対するデータ書き込み要求を受領した時点で、そのアドレスに割り当てられるべき記憶領域を動的に決定する。
「ブロック」とは、ボリューム上の領域を意味する。また、以下で説明する実施例では、ブロックはイニシエータデバイスがボリュームにアクセスする時の最小アクセス単位と等しいサイズの領域で、固定長である。ブロックのサイズは一例として512バイトである。イニシエータデバイスがボリューム上の領域にアクセスする際には、各ブロックにアサインされているアドレスを指定することでアクセスする。このアドレスは、「Logical Block Address(LBA)」と呼ばれる。ボリュームの先頭ブロックのLBAが0で、それ以降のブロックには順に1,2,...の連続番号が付される。また、以下の実施例では、ストレージ装置はボリューム上の領域を特定するアドレスとして、LBA以外のアドレスを用いることがある。これについては、実施例中で説明する。
「重複排除処理」とは、ストレージ装置内に同内容のデータが複数存在する場合、1つだけをストレージ装置に残し、それ以外のデータをストレージ装置から削除する処理である。ストレージ装置内に同内容のデータが存在するか判定する処理のことを、「重複判定」処理と呼ぶ。なお、特に断りのない限り、重複排除処理は重複判定処理を含む処理である。
以下で説明する実施例に係るストレージ装置では、チャンクと呼ばれる所定サイズのデータ毎に重複判定を行う。以下の実施例では、チャンクのサイズが8KBの例について説明されるが、チャンクのサイズは8KB以外のサイズであってもよい。同内容のデータ(またはチャンク)のことを「重複データ(または重複チャンク)」と呼ぶ。
重複判定の際、2つのデータをビット単位あるいはバイト単位で比較すると、判定処理に長時間を要することになる。そのため一般的には重複判定を行う装置は、比較対象のデータに所定の演算(たとえばハッシュ関数を用いた演算等)を行うことで、小サイズ(たとえば8バイト程度)の特徴量を生成し、それを用いて重複判定を行う。以下の実施例では、データから生成される特徴量のことを、「FingerPrint Key」と呼ぶ。FingerPrint Keyは、FPKと略記されることもある。
以下で説明する実施例では、データAから算出されたFPKの値がHであった場合、値HはデータAのFPKと呼ばれる。逆にデータAのことを、「FPK Hを持つデータ」と呼ぶことがある。
「重複排除の範囲」とは、重複データの有無を判定する時のデータの探索範囲のことを意味する。たとえば重複排除の範囲が「ストレージ装置」の場合、ストレージ装置はデータAと同一のデータが存在するか判定する際に、データAとストレージ装置内の全データとを比較する。一方、重複排除の範囲がストレージ装置内の一部の記憶デバイス(ここではこれを「記憶グループ」と呼ぶ)に限定されている場合、ストレージ装置は重複データの有無を判定する際に、記憶グループ内のデータのみの中から重複データの有無を検索する。
記憶領域の「更新」とは、記憶領域に格納されているデータの内容を新しい内容に書き換える(上書きする)ことを意味する。ある記憶領域が更新される前に、その記憶領域に格納されていたデータは、「更新前データ」と呼ばれる。一方その記憶領域に新たに書き込まれるデータのことは、「更新データ」または「更新後データ」と呼ばれる。
「追書き(append write)」または「追記(append)」とは、データを記憶領域の未使用領域に対してシーケンシャルに書き込む動作のことを意味する。以下の実施例におけるストレージ装置では、追書き用の記憶領域が設けられる。ストレージ装置が追書き処理を行う場合、追書き用の記憶領域の先頭から順にデータを書き込んでいく。ストレージ装置は、直前に行われた追書き処理でデータが書き込まれた終端アドレスを記憶しており、追書き処理を行う際には、この終端アドレスの次のアドレスから、データを書き込む。
(1)システム構成
図1は、第1の実施例に係るストレージ装置1を含む計算機システムの構成例を示している。ストレージ装置1は、ストレージコントローラ10と、ストレージコントローラ10に接続された複数の記憶デバイス20を有する。
記憶デバイス20は、ストレージ装置1がホスト2などの上位装置からのライトデータを記憶するために用いられる。記憶デバイスとしては、たとえば磁気ディスクを記憶媒体として用いるHDD(Hard Disk Drive)22や、フラッシュメモリ等の不揮発性半導体メモリを記憶媒体として採用したSSD(Solid State Drive)21が用いられる。記憶デバイス20は一例として、SAS(Serial Attached SCSI)規格に従う伝送線(SASリンク)や、PCI(Peripheral Component Interconnect)規格に従う伝送線(PCIリンク)などによって、ストレージコントローラ10と接続される。
ストレージコントローラ10には、1以上のホスト2が接続される。またストレージコントローラ10には、管理ホスト5が接続される。ストレージコントローラ10とホスト2とは、一例としてファイバチャネルを用いて形成されるSAN(Storage Area Network)3を介して接続される。ストレージコントローラ10と管理ホスト5とは、一例としてイーサネットを用いて形成されるLAN(Local Area Network)6を介して接続される
ストレージコントローラ10は少なくとも、プロセッサ(CPUとも呼ばれる)11、ホストインタフェース(「ホストI/F」とも呼ばれる)12、デバイスインタフェース(「デバイスI/F」とも呼ばれる)13、キャッシュメモリ14、管理用I/F15、ローカルメモリ16を有する。そしてCPU11、ホストI/F12、デバイスI/F13、キャッシュメモリ14、管理用I/F15は、内部スイッチ(内部SWとも呼ばれる)17を介して相互接続されている。図1ではこれらの構成要素がそれぞれ1つだけ示されているが、高性能化及び高可用性の確保のため、これらの構成要素のそれぞれがストレージコントローラ10内に複数搭載されていてもよい。また内部SW17ではなく、共通バスを介して各構成要素が相互接続された構成にしてもよい。
デバイスI/F13は少なくとも、インタフェースコントローラと転送回路を有する。インタフェースコントローラは、記憶デバイス20で用いられているプロトコル(一例ではSAS)をストレージコントローラ10内部で用いられている通信プロトコル(一例としてPCI−Express)に変換するためのコンポーネントである。転送回路は、ストレージコントローラ10が、記憶デバイス20に対してデータの転送(リード、ライト)を行う際に用いられる。
ホストI/F12は、デバイスI/F13と同様に、少なくともインタフェースコントローラと転送回路を有する。ホストI/F12が有するインタフェースコントローラは、ホスト2とストレージコントローラ10間のデータ転送経路で用いられている通信プロトコル(たとえばファイバチャネル)と、ストレージコントローラ10内部で用いられている通信プロトコルを変換するためのものである。
CPU11は、ストレージ装置1の各種制御を行う。ローカルメモリ16には、CPU11が実行するプログラム(ストレージ制御プログラムと呼ぶ)が格納される。またCPU11は、データの圧縮処理を行う際に、ローカルメモリ16上の記憶領域の一部を、一種の作業用領域として使用する。ローカルメモリ16には、DRAM、SRAM等の揮発性記憶媒体が用いられるが、別の実施形態として、不揮発性メモリが用いられてもよい。
キャッシュメモリ14は、記憶デバイス20に対するI/O対象データを一時的に記憶するために用いられる。またCPU11が使用する、ストレージ装置1の各種管理情報を記憶するために用いられる。キャッシュメモリ14には、DRAM、SRAM等の揮発性記憶媒体が用いられるが、別の実施形態として、不揮発性メモリを用いてキャッシュメモリ14を構成してもよい。また、キャッシュメモリ14に揮発性記憶媒体が用いられる場合、ストレージ装置1にバッテリ等の補助電源を搭載し、停電時にキャッシュメモリ14の記憶内容を維持できるように構成されていてもよい。
本実施例に係るストレージ装置1において、CPU11は、ローカルメモリ16とキャッシュメモリ14の何れにもアクセス可能に構成されている。ただしCPU11がキャッシュメモリ14にアクセスする際、内部スイッチ17を経由してアクセスすることになる。そのため、CPU11がキャッシュメモリ14にアクセスした時の応答時間は、CPU11がローカルメモリ16にアクセスした時の応答時間よりも長くなる。
管理ホスト5は、ストレージ装置1の管理操作を行うための計算機である。管理ホスト5は、キーボードやディスプレイ等の入出力デバイス(非図示)を備え、ユーザ(管理者)は入出力デバイスを用いてストレージ装置1に対する設定指示を行うことができる。また管理ホスト5は、ストレージ装置1の状態等の情報をディスプレイ等の出力デバイスに表示することもできる。
本実施例に係るストレージ装置1は、記憶デバイス20に格納されるデータを圧縮することができる。データの圧縮は、CPU11が実行する(CPU11でデータ圧縮を行うためのプログラムコードが実行されることで、圧縮が行われる)。ただし別の実施形態として、ストレージコントローラ10にデータ圧縮を行う専用のハードウェアを設け、ストレージコントローラ10がこのハードウェアを用いてデータ圧縮を行うように構成されていてもよい。
(2)記憶領域の管理
続いて、本実施例に係るストレージ装置1が管理する記憶領域について説明する。本実施例に係るストレージ装置1が有する1以上の記憶デバイス20は、所定サイズの記憶空間をストレージコントローラ10に提供する。ただしストレージコントローラ10は、記憶デバイス20の提供する記憶空間を直接ホスト2には提供しない。ストレージコントローラ10はホスト2に、記憶デバイス20の提供する記憶空間とは異なる、1以上の仮想的な記憶空間を提供する。この仮想的な記憶空間を「仮想ボリューム」と呼ぶ。また、仮想ボリューム(ホスト2に提供される記憶空間)のことを、「上書き空間」と呼ぶこともある。
仮想ボリュームは、公知のThin Provisioning技術を用いて形成されるボリュームである。ストレージ装置1は、ホスト2から仮想ボリューム上の領域に対するアクセス要求を受け付けた時点で、その領域に記憶デバイス20の記憶領域を割り当てる(マップする)。
本実施例では、ストレージ装置1が有する複数の記憶デバイス20のうち、仮想ボリュームに割り当てることができる記憶デバイス20を「プール」という管理単位に所属させる。ストレージ装置1は、プールに所属する記憶デバイス20の記憶空間を、所定サイズ(一例として42MB)の部分領域に分割して管理する。本実施例では、この部分領域のことを「ページ」または「物理ページ」と呼ぶ。なお、ストレージ装置1内にプールは複数設けられて良い。各プールにはストレージ装置1内で一意な識別番号が付されており、この識別番号はプール番号(プール#)と呼ばれる。またプール#がkのプールは、「プール#k」と表記される。
ストレージ装置1が仮想ボリュームに記憶デバイス20の記憶領域を割り当てる時、ページ毎に割り当てる。そのためストレージ装置1は、仮想ボリュームもページと同サイズの領域に分割して管理する。仮想ボリューム上の、ページと同サイズの領域のことは、「仮想ページ」または「上書きページ」と呼ばれる。なお、本実施例では仮想ページのサイズが42MBの場合の例を説明するが、仮想ページのサイズはこれ以外のサイズでもよい。
ホスト2が仮想ボリュームにアクセスする時、ホスト2はストレージ装置1にアクセス要求(リード要求、ライト要求等)を発行する。リード要求やライト要求には、アクセス対象の仮想ボリュームを特定するための識別子(Logical Unit Number(LUN)等)と、仮想ボリューム上の領域を特定する情報が含まれる。仮想ボリューム上の領域を特定する情報には、Logical Block Address(LBA)と領域の長さの情報が含まれる。ストレージ装置1がホスト2からライト要求を受信すると、ストレージ装置1はライト要求に含まれる、仮想ボリューム上の領域を特定する情報(LBAと領域の長さ)から、アクセス対象の仮想ページを特定する。アクセス対象の仮想ページにまだページが割り当てられていない場合、ストレージ装置1はプールに属するページのうち未使用のページ(まだ仮想ページに割り当てられていないページ)を選択し、アクセス対象の仮想ページに、選択されたページを割り当てる(マップする)。ホスト2からのライトデータは、このアクセス対象仮想ページにマップされたページに格納される。
またストレージ装置1は、仮想ページと、仮想ページに割り当てられたページとの対応関係(マッピング)をマッピングテーブル(後述する仮想ボリューム管理テーブル300など)に記憶している。仮想ページに対するリード要求を受け付けた時には、ストレージ装置1はマッピングテーブルを参照することで、仮想ページに割り当てられたページを特定し、特定されたページからデータを読み出す。
図2は、仮想ボリュームと、仮想ボリュームに割り当てられる記憶領域(ページ)の関係を表した概念図である。図2に示されている長方形状のオブジェクト40は、仮想ボリューム(上書き空間)を表す。一方、円柱状のオブジェクト50はプールを表している。
さらにストレージ装置1は、仮想ボリューム(上書き空間)40とは異なる記憶空間を有する。この記憶空間は「追書き空間」と呼ばれる。図2に示されている長方形状のオブジェクト60が追書き空間を表している。追書き空間60は、ホスト2がアクセスできる記憶空間ではなく、ストレージコントローラ10だけが使用可能な記憶空間である。追書き空間60は、ストレージコントローラ10のCPU11が圧縮データを記憶デバイスに格納するために用いられる。
まず、上書き空間の仮想ページと物理ページの関係について説明する。各仮想ページには、仮想ページ番号(VP#と表記されることもある)と呼ばれる、一意な識別番号(識別番号には非負の整数値が用いられる)が付される。以下では、仮想ページ番号がn(nは非負の整数値)の仮想ページのことを、「VP#n」と表記する。同様に各物理ページには、物理ページ番号(またはページ#)と呼ばれる、ストレージ装置1内で一意な識別番号が付される(この識別番号も非負の整数値である)。以下では、物理ページ番号がn(nは非負の整数値)の物理ページのことを、「ページ#n」と表記する。図2の例では、VP#0にページ#0がマップされた例が示されている。VP#1,VP#2については後述する。
ストレージ装置1がホスト2から、仮想ページ内の領域(1または複数のブロック)に対するライト要求(及びライトデータ)を受け付けた場合、仮想ページにマップされている物理ページ内のブロックにライトデータが格納される。ストレージ装置1は、仮想ページと物理ページの対応関係(マッピング)を、後述する仮想ボリューム管理テーブル300に格納して管理する。
本実施例に係るストレージ装置1は原則として(後述する、圧縮データ格納のケースを除いて)、仮想ページの先頭からn番目のブロックへのデータライト要求を受領すると、データは仮想ページにマップされている物理ページの先頭からn番目のブロックに格納される。なお、説明が冗長になることを避けるため、以下では、ストレージ装置1が仮想ページに割り当てられている物理ページにデータを格納することを、「仮想ページ(または上書き空間)にデータを格納する」と表現する。
追書き空間も上書き空間と同じく、いわゆるThin Provisioning技術により形成される記憶空間である。ストレージコントローラ10は、追書き空間上の領域に、動的にページ(物理ページ)を割り当て、データは追書き空間に割り当てられた物理ページに書き込まれる。上書き空間と同じく、ストレージ装置1は追書き空間を物理ページと同サイズの領域に分割して管理する。この領域は「追書きページ」と呼ばれる。また追書きページにも追書きページ番号と呼ばれる一意な識別番号が付される。追書きページ番号は、追書きページ#と表記されることもある。ストレージ装置1は、追書きページと物理ページの対応関係(マッピング)を、後述する追書き空間マッピングテーブル350に格納して管理する。また、説明が冗長になることを避けるため、以下では、ストレージ装置1が追書きページに割り当てられている物理ページにデータを書き込む処理を、「追書きページ(または追書き空間)にデータを書き込む」と表現する。
先にも述べたが、追書き空間に書き込まれるデータは、圧縮データである。また追書き空間はプールごとに設けられ、プールがn個ある場合には追書き空間はn個存在する。追書き空間に割り当てられる物理ページは、仮想ページに割り当てられる物理ページと同じく、プールから未使用の物理ページが選択される。プール#kの物理ページが割り当てられる仮想ボリュームのチャンクが追書き空間に移動される時、その追書き空間に割り当てられる物理ページは、プール#kの物理ページである。
ストレージ装置1は、ホスト2から仮想ページに書き込まれたデータ(非圧縮データ)について、必要に応じて圧縮処理を行う。圧縮処理により生成された圧縮データは、非圧縮データの格納された物理ページとは異なる場所、具体的には追書き空間に移動される。またこの時、重複データの有無の判定なども行われる。
本実施例に係るストレージ装置1は、仮想ページ内の領域を、仮想ページの先頭から順に8KBの部分領域に区分し、この部分領域ごとにデータ圧縮を行う。本実施例では、この8KBの部分領域(あるいはこの部分領域に格納されているデータ)のことを「チャンク」と呼ぶ。なお、チャンクの大きさには、8KB以外の大きさが採用されてもよい。また、チャンクを圧縮することで生成されたデータのことを「圧縮チャンク」と呼ぶ。圧縮チャンクの大きさはデータの内容に依存して変動するが、最小で512バイト、最大で8KBである。また本実施例に係るストレージ装置1は、512バイトの整数倍のサイズの圧縮チャンクを生成する。
ストレージコントローラ10(のCPU11)が圧縮チャンクを生成すると、ストレージコントローラ10は圧縮チャンクを追書き空間に追記する。ある仮想ページのチャンクがすべて圧縮されて、圧縮チャンクが全て追書き空間に書き込まれると、仮想ページに割り当てられていたページは破棄される。具体的には、その仮想ページに割り当てられていたページは、未使用状態(仮想ページに割り当てられていない状態)に変更される。これにより、上書き空間に対して書き込まれたデータが、追書き空間に移動されたことになる。なお、追書き空間に割り当てられた物理ページには、複数の仮想ページのチャンク(圧縮チャンク)が格納されることもある。圧縮によりチャンクのサイズは小さくなり、複数の仮想ページのデータが1物理ページに収容可能になることもあるからである。またストレージ装置1は、上書き空間上のチャンクと追書き空間上の圧縮チャンクの対応関係(マッピング)を、後述するLP変換テーブル500に格納して管理する。
ホスト2から書き込まれたデータが追書き空間に移動された仮想ページに対して、ホスト2から更新データの書き込み要求(つまり更新要求)があった場合、更新データは圧縮され、追書き空間に追記される。ただし別の実施形態として、ストレージ装置1は再び上書き空間の仮想ページに物理ページを割り当て、追書き空間に移動されたデータを伸長して、仮想ページに割り当てられた物理ページに伸長されたデータを書き戻し、そしてこの物理ページ上のデータを更新(上書き)するようにしてもよい。
ストレージ装置1が、上書き空間上のチャンクを特定するために使用するアドレスをLAと呼ぶ。LAはチャンクごとに付されるアドレスで、
LA=LBA÷16
の関係にある。
そのため、上書き空間上の先頭に位置するチャンクのLAは0で、後続のチャンクのLAは順に、1,2,...の連続番号になる。
一方追書き空間上の圧縮チャンクは可変長で、最小512バイトのサイズであるので、追書き空間上の512バイトの領域(ブロック)ごとにアドレスが付される。このアドレスをPAと呼ぶ。追書き空間上の先頭に位置する512バイト領域のPAが0で、後続の領域のPAには、順に1,2,...の連続番号が用いられる。
(3)管理情報
続いて、上で述べたプール、仮想ボリューム(上書き空間)、追書き空間の管理に用いられる管理情報の内容について説明する。なお、本明細書や図面で、数値の先頭に文字列“0x”が付されているものがあるが、これはその数値が16進数で表記されていることを意味する。
図3にストレージ装置1が有する管理情報を示す。ストレージ装置1は、キャッシュメモリ14上にページ管理テーブル200、仮想ボリューム管理テーブル300、追書き空間マッピングテーブル350、論理物理変換テーブル(LP変換テーブル)500、FingerPrint Match Queue(FPMQ)400、FingerPrint Table Directory(FPTD)450、プール管理情報600を有する。
図4はプールに属するページを管理するための情報である、ページ管理テーブル200の例を示している。ページ管理テーブル200はプールごとに設けられるテーブルで、プールがn個設けられている場合には、ストレージ装置1はn個のページ管理テーブル200を有する。
ページ管理テーブル200の各行(レコード)には、プール内の物理ページの情報が格納される。各レコードは、ページ#(201)、DEV#(202)、Addr(203)、use(204)の欄を有する。ページ#(201)には、物理ページのページ番号が格納される。つまりページ#(201)がnのレコードは、ページ#nの情報を管理するレコードである。
先に述べたが、ページ(物理ページ)は記憶デバイス20上の領域である。DEV#(202)とAddr(203)には、物理ページの存在する記憶デバイス20の識別番号及び記憶デバイス内のアドレスが格納される。図4の場合、ページ#1の情報を管理するレコードには、DEV#(202)に0、Addr(203)に0x15000が格納されている。そのため、ページ#1は、識別番号が0の記憶デバイス20の、アドレス0x15000から始まる42MBの領域(1物理ページのサイズに等しい領域)に相当することを表している。
use(204)には、物理ページの使用状況を表す情報が格納される。物理ページが仮想ボリュームまたは追書き空間にマップされている場合、use(204)には“1”が格納される。逆に物理ページが仮想ボリュームまたは追書き空間にマップされていない場合、use(204)には“0”が格納される。use(204)が“1”であるページは、使用中のページと呼ばれ、逆にuse(204)が“0”のページは、未使用のページと呼ばれる。
なお、本実施例では、ページ管理テーブル200に、記憶デバイス20(たとえばHDD)の識別番号とアドレスが登録され、各ページが1つの記憶デバイス20内の記憶領域に相当する例が説明されている。ただし、これ以外のプール(またはページ)の構成方法が採用されてもよい。たとえばストレージ装置1がRAID(Redundant Arrays of Independent (or Inexpensive) Disks)技術を用いて、複数の記憶デバイス20から1つの論理的な記憶デバイス(論理デバイスと呼ぶ)を形成する場合、論理デバイス上の所定サイズ(たとえば42MB)の記憶領域をページとして扱ってよい。その場合、ページ管理テーブル200のDEV#(202)とAddr(203)には、論理デバイスの識別番号と、論理デバイス内のアドレスが格納されるとよい。
図5にプール管理情報600の例を示す。プール管理情報600は、各プールに属する仮想ボリュームの情報と、重複排除処理に関する情報を格納するためのテーブルである。プールが複数存在する場合、ストレージ装置1は各仮想ボリュームを、いずれか1つのプールに所属させる。ストレージ装置1は、仮想ボリュームの仮想ページに物理ページを割り当てる際、仮想ボリュームが属しているプール内の未使用物理ページを選択して、仮想ページに物理ページを割り当てる。
プール管理情報600の各レコードには、プール番号(601)、仮想ボリューム#(605)、最終書き込み位置(604)、累積重複排除対象チャンク数(602)、メタデータ削除チャンク数(603)の情報が格納される。プール番号(601)は、プール番号が格納される。仮想ボリューム#(605)には、プールに属する仮想ボリュームの識別番号(仮想ボリューム番号と呼ぶ)が格納される。プールに属する仮想ボリュームが複数存在する場合には、仮想ボリューム#(605)には複数の仮想ボリューム番号が格納される。
最終書き込み位置(604)には、最後に圧縮チャンクが書き込まれた追書きページの、追書きページ番号が格納される。ストレージコントローラ10が追書きページに圧縮チャンクを書き込む際、最終書き込み位置(604)を参照することで、最後に書き込みが行われた追書きページを特定する。
累積重複排除対象チャンク数(602)、メタデータ削除チャンク数(603)は重複排除処理に用いられる情報で、詳細は後述する。
図6は、仮想ボリューム管理テーブル300の例を示している。仮想ボリューム管理テーブル300もキャッシュメモリ14に格納されている。仮想ボリューム管理テーブル300の各レコードには、仮想ボリューム内の仮想ページについての情報が格納される。具体的には各レコードには、仮想ページ#(301)、シーケンシャルWR数(302)、ランダムWR数(303)、最終更新時刻(304)、ページ種別(305)、ページ#(306)、プール#(307)、メタデータ削減チャンク数(308)の情報が格納される。
仮想ページ#(101)には、仮想ページの仮想ページ番号が格納される。一方ページ#(306)には、仮想ページに割り当てられた物理ページのページ#が格納される。プール#(307)は、仮想ページに割り当てられた物理ページが属するプールのプール番号である。
シーケンシャルWR数(302)とランダムWR数(303)には、仮想ページに対してホスト2から受け付けたライト要求の数が格納される。具体的には、シーケンシャルWR数(302)には、シーケンシャルライト要求の数が、ランダムWR数(303)にはランダムライト要求の数が格納される。
なお、ホスト2から受け付けたライト要求が、シーケンシャルライト要求であるかランダムライト要求であるかを判別する方法には、任意の方法が用いられて良い。たとえばストレージ装置1が、ある仮想ページに対して複数のライト要求を受け付けた時、各ライト要求で指定されているアドレス(LBA)が連続している場合、それらのライト要求はシーケンシャルライト要求であると判定するとよい。逆にそうでないライト要求は、ランダムライト要求であると判断されるとよい。
最終更新時刻(304)には、最後に仮想ページに対してライト要求を受け付けた時刻が格納される。ストレージ装置1はある仮想ページに対してライト要求を受け付けるたびに、その仮想ページの最終更新時刻(304)にライト要求を受け付けた時刻を格納する。
ページ種別(305)には、1または0が格納される。初期状態では、全仮想ページのページ種別(305)は1に設定されている。
ページ種別(305)に0が格納されている場合、仮想ページに対して書き込まれたデータは圧縮されて、追書き空間に移動されたことを表す。この場合には、ページ#(306)とプール#(307)には無効値(nullと呼ぶ。具体的には“−1”などの、ページ#やプール#に用いられない値である)が格納される。また移動されたデータ(圧縮チャンク)の格納場所は、後述するLP変換テーブル500等に記録される。
一方ページ種別(305)に1が格納されている場合、仮想ページに対して書き込まれたデータはまだ追書き空間に移動されていないか、あるいはその仮想ページに対してまだホスト2からの書き込み要求が発生していないことを表す。ページ種別(305)が1で、ページ#(306)とプール#(307)に有効な値(nullでない値)が格納されている場合、その仮想ページに対して物理ページが割り当てられており、その物理ページにホスト2からのライトデータが格納されていることを示す。逆にページ種別(305)が1で、ページ#(306)とプール#(307)がnullの場合、その仮想ページに対してまだホスト2からの書き込み要求が発生しておらず、物理ページが割り当てられていないことを表す。
メタデータ削減チャンク数(308)は、重複排除処理に関係する情報であり、詳細は後述する。
なお、仮想ボリューム管理テーブル300は仮想ボリューム毎に作成されるため、仮想ボリュームが複数存在する場合、仮想ボリューム管理テーブル300は複数存在する。また仮想ボリュームが複数存在する場合、仮想ボリューム管理テーブル300の各レコードには、上で説明した仮想ページ#(301)等の情報に加えて、仮想ボリュームを特定するための情報(たとえば仮想ボリューム番号)が含まれてもよい。
図7は、追書き空間マッピングテーブル350の例を示している。追書き空間マッピングテーブル350は、追書き空間にマッピングされる物理ページを管理するための管理情報である。追書き空間はプールごとに設けられるので、追書き空間マッピングテーブル350もプールごとに存在する。各行の追書きページ#(351)には、追書きページ番号が昇順に格納されている。追書き空間マッピングテーブル350の各レコードは、追書きページ#(351)で特定される追書きページに、ページ#(352)とプール#(353)で特定されるページが割り当てられていることを表している。追書きページにページが割り当てられていない場合、その追書きページのページ#(352)とプール#(353)にはnullが格納される。
ページ内最終書き込み位置(354)は、追書きページ内のブロックのうち、最後に圧縮チャンクが書き込まれたブロックの相対アドレスが格納される。相対アドレスとは具体的には、ページ内の先頭ブロックのアドレスを0と定めた時の、ブロックのアドレスである。図7の例では、追書きページ#(351)が“2”のレコードのページ内最終書き込み位置(354)は“0x05”であるので、この追書きページ#が“2”の追書きページに割り当てられているページには、ページ先頭から6番目のブロックまで圧縮チャンクが書き込まれていることを表している。ストレージ装置1は追書き空間に圧縮チャンクを追記する際に、このページ内最終書き込み位置(354)とプール管理情報600の最終書き込み位置(604)とを参照することで、圧縮チャンクを書き込むべき位置を特定する。
続いて論理物理変換テーブル500について説明する。論理物理変換テーブル500は、上書き空間上のチャンクが圧縮されて追書き空間に移動された場合、各チャンクの移動先を管理するためのテーブルである。図8に論理物理変換テーブル500の例を示す。論理物理変換テーブル500はLP変換テーブル500と表記されることもある。
LP変換テーブル500のレコードは、仮想ボリューム上のチャンクと圧縮チャンクの記録位置との対応関係(マッピング)についての情報を表す。各レコードは、レコードのLA(501)で特定される8KBの領域(チャンク)が圧縮された後、PA(503)で特定されるアドレスから始まる、長さがLength(504)の領域に格納されたことを表す。FPK上位32bit(502)、FPMQ登録(505)については、重複排除処理の概要を述べた後、説明する。
先に述べたとおり、本実施例に係るストレージ装置1は重複排除処理を行うので、原則として、同内容の複数のチャンクが追書き空間に格納されないように制御される。再び図2を用いて重複排除処理の概略を説明する。仮想ボリュームのVP#2のチャンクA、チャンクBのそれぞれが、圧縮チャンクa、圧縮チャンクbとして追書き空間上に格納されている状態にあるとき、ストレージ装置1がVP#3のチャンクを追書き空間に移動する処理を開始した場合を想定する。もしチャンクDの内容がチャンクBと同一だった場合、チャンクDの圧縮チャンクは追書き空間に書き込まれない。代わりにストレージ装置1は、LP変換テーブル500のチャンクBの情報を格納しているレコードのPA(503)と同一の値を、LP変換テーブル500のチャンクDの情報を格納しているレコードのPA(503)に格納する。
また、ストレージ装置1が重複排除処理を行う時、チャンクに所定の演算(たとえばハッシュ関数を用いた演算等)を施すことで、値を生成する。本実施例では、この生成された値をFPK(FingerPrint Key)と呼ぶ。本実施例では、FKPは64bitのサイズの情報である。ただしFKPは64bit以外のサイズであってもよい。
ストレージ装置1は、チャンクから生成されるFPKとチャンクのLAの対応関係を管理情報に記録する。この管理情報はFingerPrint Match Queue(以下では“FPMQ”と呼ばれる)と呼ぶ。図9にFPMQ400の例を示す。FPMQ400は、FPK(401)とLA(402)のカラムを有するテーブルで、LA(402)から始まる8KBの領域(チャンク)から生成されたFPKが、FPK(401)に格納される。FPMQ400に格納される各行(レコード)は、FPK(401)の昇順にソートされている。以下では、FPMQ400のレコード、つまりFPK(401)とLA(402)のセットのことを、「チャンクのメタデータ」(あるいは単に「メタデータ」)と呼ぶことがある。
FPMQ400はプールごとに設けられる。ストレージ装置1は、たとえばプール#nに属する仮想ボリューム(上書き空間)のチャンクを追書き空間に移動する時(仮にこのチャンクを“チャンクA”と呼ぶ)、プール#n用のFPMQ400を参照する事で、チャンクAと同一のチャンク(圧縮チャンク)が既に追書き空間に存在するか判定する。チャンクAのFPKと同一のFPKが、プール#n用のFPMQ400に存在しない場合、チャンクAと同一のチャンク(圧縮チャンク)はプール#n用の追書き空間に存在しないと判定できる。本実施例に係るストレージ装置1では、重複排除の範囲はプールである。そのためチャンクAと同一のチャンク(圧縮チャンク)がプール#nにはないが、プール#n以外のプールに存在した場合、チャンクA(の圧縮チャンク)はプール#nに書き込まれる。
また、FPMQ400内の情報の検索を効率的に行えるようにするために、ストレージ装置1はFPMQ400内のいくつかのレコードが格納されているアドレス(キャッシュメモリ14上アドレス)を記録した管理情報を有する。この管理情報は、FingerPrint Table Directoryと呼ばれる。また以下ではこれを、“FPTD”と呼ぶこともある。
図9にFPTD450の例を示す。FPTD450もFPMQ400と同様に、プールごとに設けられる。FPMQ格納アドレス(452)には、FPMQ400のレコードのうち、FPK401に格納されているFPKの上位32bitが、FPK先頭32bit(451)と等しいレコードの中で、FPK401が最も小さいレコードが格納されているアドレス(キャッシュメモリ14上アドレス)が格納される。
たとえばFPMQ400内で、FPK401の上位32bitが“0x00000001”であるレコードのうち、値が最小のレコードのFPK401が“0x0000000100000001”だった場合を想定する。この時FPK401が“0x0000000100000001”のレコードが格納されているアドレスが“ADR2”だった場合には、FPTD450には、FPK先頭32bit(451)が“0x00000001”、FPMQ格納アドレス452が“ADR2”のレコードが記録される。
後述する重複排除プログラム1000では、チャンクのFPKを算出してから、そのFPKと同じ値がFPMQ400のFPK(401)に格納されているか判定する処理が行われる。FPMQ400に格納されているレコード数が非常に多い場合、検索に時間がかかるため、FPTD450が用いられる。
たとえば、“0x0000000100000001”の格納されているレコードを検索する場合、重複排除プログラム1000はFPTD450を参照することで、FPK先頭32bit(451)が“0x00000001”のFPMQ格納アドレス(452)が“ADR2”であることを認識する。続いて重複排除プログラム1000は、FPMQ400内のレコードのうち、アドレス“ADR2”(これはキャッシュメモリ14上のアドレスである)のレコードから順に、“0x0000000100000001”の格納されているレコードを探索する。なお、FPTD450は、FPMQ400内の情報の検索速度を向上させるための情報であるから、FPTD450は必須の情報ではない。
FPMQ400には、チャンクごとに、チャンクのメタデータが格納される。FPKを生成したチャンクが多いと、FPMQ400のサイズが増大し、キャッシュメモリ14の記憶領域を多く消費することになる。キャッシュメモリ14の記憶領域を過剰に消費することを避けるために、本実施例に係るストレージ装置1は、所定の条件に該当するチャンクについては、FPMQ400にチャンクのメタデータを格納しない制御を行う。この制御の詳細は後述する。
図8のFPK上位32bit(502)とFPMQ登録(505)について説明する。LP変換テーブル500のFPK上位32bit(502)には、チャンクのFPKの上位32ビットが格納される。FPMQ登録(505)は、チャンクのメタデータがFPMQ400に登録されているかいないかを表す情報である。ストレージ装置1がLA(501)で特定されるチャンクのメタデータをFPMQ400に登録した場合、FPMQ登録(505)に“1”が記録され、そうでない場合にはFPMQ登録(505)に“0”が記録される。また、チャンクから生成されたFPK(及びそのチャンクのLA)をFPMQ400に登録した後、FPMQ400からFPK及びそのチャンクのLAを削除することもある。その場合にもストレージ装置1はFPMQ登録(505)に“0”を記録する。
ストレージ装置1は、FPMQ400にチャンクのメタデータを登録または削除した回数を、プールごとに計数し、プール管理情報600に記憶している。再び図5を参照しながら、プール管理情報600の累積重複排除対象チャンク数(602)とメタデータ削除チャンク数(603)について説明する。
累積重複排除対象チャンク数(602)は、FPMQ400にチャンクのメタデータ(チャンクのLA及びFPK)を登録した回数が記録される。一方メタデータ削除チャンク数(603)は、FPMQ400からチャンクのメタデータを削除した(または登録しなかった)回数が記録される。なお、ストレージ装置1はこれらの回数をプールごとに管理している。そのため、プール番号がnのプール内のチャンクについて、メタデータをFPMQ400に登録すると、ストレージ装置1はプール番号(601)がnの行(レコード)の累積重複排除対象チャンク数(602)に1を加算する。またプール番号がnのプール内のチャンクについて、メタデータをFPMQ400から削除した時は、ストレージ装置1はプール番号(601)がnの行(レコード)のメタデータ削除チャンク数(603)から1を減算する。
(4)処理の流れ
続いて、本実施例に係るストレージ装置1が実施する処理の流れの説明を行う。図10に示されているように、本実施例に係るストレージ装置1のローカルメモリ16には少なくとも、I/Oプログラム100、バッファ更新プログラム150、重複排除プログラム1000が格納されており、CPU11がこれらのプログラムを実行する。またローカルメモリ16には、稼働情報300’、バッファ700が設けられる。バッファ700は、CPU11が圧縮処理または伸長処理を行う時に使用するメモリ領域である。
稼働情報300’は、仮想ボリューム管理テーブル300に格納される情報のうち、一部の情報が格納された情報である。具体的には稼働情報300’は、仮想ボリューム管理テーブル300の各レコードのうち、仮想ページ#(301)、シーケンシャルWR数(302)、ランダムWR数(303)、最終更新時刻(304)のみを有する。そのため、本明細書では稼働情報300’の図示は略す。
まず、I/Oプログラム100が実行する処理の流れを説明する。なお、以下で説明される各図において、参照番号の前に付されているアルファベットの“S”は、「ステップ」を意味する。
ストレージ装置1がホスト2からI/O要求を受領すると、I/Oプログラム100の実行が開始される。図11では、ホスト2からのリード要求をストレージ装置1が受領した時に、I/Oプログラム100が実行する処理の流れを説明する。なお、図11では、リード要求で指定された領域のデータがキャッシュメモリ14に存在しなかった場合(キャッシュミスのケース)の例を説明する。
ステップ11:I/Oプログラム100は、ホスト2からリード要求を受領すると、リード要求に含まれている、リード先のアドレス(LBA)を、仮想ページ番号に変換する。以下ではリード先の領域の仮想ページ番号がpであった場合の例を説明する。また以下では、リード要求で指定されているリード先の領域が、複数の仮想ページに跨っていない場合の例を説明する。
ステップ12:I/Oプログラム100は仮想ボリューム管理テーブル300を参照し、ステップ11で求められた仮想ページ番号(p)のページ種別(305)が“1”か判定する。ページ種別(305)が“1”の場合(ステップ12:Yes)、次にステップ13が行われ、そうでない場合には(ステップ12:No)、次にステップ15が行われる。
ステップ13:I/Oプログラム100は仮想ボリューム管理テーブル300を参照し、仮想ページ(VP#p)に割り当てられている物理ページのページ番号(306)を特定する。さらにI/Oプログラム100はページ管理テーブル200を参照することで、その物理ページの存在する記憶デバイス20のDEV#(202)、Addr(203)を特定する。
ステップ14:I/Oプログラム100は、ステップ13で特定された記憶デバイス20からデータを読み出し、ホスト2に読み出されたデータを返送し、処理を終了する。なお、ここで読み出されたデータは、キャッシュメモリ14に格納しておいてもよい。そうすると、後でそのデータに対するリード要求を再び受領した際、I/Oプログラム100は記憶デバイス20にアクセスすることなく、ホスト2にデータを返却できる。
ステップ15:ステップ15が実行される場合、リード要求で指定されている領域のデータは追書き空間に移動されているので、I/Oプログラム100は、リード対象データ(圧縮チャンク)の格納されている、追書き空間上のアドレス(PA)を算出する必要がある。なお、以下では、リード要求で指定されている領域のサイズが1チャンク(8KB)と同じで、かつこの領域がチャンク境界に一致している場合の例を説明する。ステップ15ではチャンクI/Oプログラム100は、リード要求に含まれているリード先のアドレス(LBA)を、LAに変換する。
ステップ16:I/Oプログラム100はLP変換テーブル500を参照し、LA(501)がステップ15で特定されたLAに等しいレコードを特定し、そのレコードのPA(503)及びLength(504)を特定する。さらにI/Oプログラム100は、特定されたPAから追書きページ番号を算出し、そして追書き空間マッピングテーブル350を参照することで、特定された追書きページに割り当てられている物理ページのページ#(352)、プール#(353)を特定する。さらにI/Oプログラム100はページ管理テーブル200を参照することで、その物理ページの存在する記憶デバイス20のDEV#(202)、Addr(203)を特定する。
ステップ17:I/Oプログラム100は、ステップ16で特定された記憶デバイス20からデータ(圧縮チャンク)を読み出し、バッファ700に格納する。さらにI/Oプログラム100は、バッファ700に格納された圧縮チャンクを伸長する。そしてI/Oプログラム100は、伸長されたデータをホスト2に返却し、処理を終了する。なお、ここで読み出されたデータは、キャッシュメモリ14に格納しておいてもよい。
図12では、ホスト2からライト要求が発行された時に、I/Oプログラム100が実行する処理の流れを説明する。
ステップ101:I/Oプログラム100は、ホスト2からライト要求を受領すると、ライト要求でライト対象となっているデータを受領するために、キャッシュメモリ14上の領域を確保する。そしてI/Oプログラム100は、確保された領域にライト対象のデータを格納する。これは公知のストレージ装置でも行われる処理のため、詳細の説明は略す。なおステップ101でI/Oプログラム100は、ライト要求で指定されている、ライト先の領域のアドレス(LBA)を、仮想ページ#に変換する。以下ではライト先の領域の仮想ページ#がpであった場合の例を説明する。
ステップ102:I/Oプログラム100は、ホスト2に対し、ライト処理が完了した旨を応答する。
ステップ103:I/Oプログラム100は、稼働情報300’のレコードのうち、仮想ページ#(301)がpのレコードの最終更新時刻(304)に、現在時刻(ステップ103が実行される時点の時刻)を格納する。またI/Oプログラム100は、今回受領したライト要求がシーケンシャルライト要求かランダムライト要求かを判別する。今回受領したライト要求がシーケンシャルライト要求の場合、I/Oプログラム100は稼働情報300’内の、仮想ページ#(301)がpのレコードのシーケンシャルWR数(302)に1を加算する。今回受領したライト要求がランダムライト要求の場合、I/Oプログラム100は稼働情報300’内の、仮想ページ#(301)がpのレコードのランダムWR数(303)に1を加算する。
ステップ103の後、I/Oプログラム100は所定の契機でキャッシュメモリ14に格納したデータを、記憶デバイス20に書き込む(ステップ110)。この処理はデステージと呼ばれる。仮想ページ(仮にこれをVP#pとする)に書き込まれたデータをデステージする時、仮想ページに物理ページが割り当てられている場合、割り当てられた物理ページの存在する記憶デバイス29にデータをデステージする。また物理ページが割り当てられていない場合には、デステージ前に仮想ページに物理ページが割り当てられる。またVP#pのチャンクが追書き空間に移動されている場合、I/Oプログラム100は追書き空間にデータを追記する。この処理の詳細は後述する。
また、ステップ110は、ステップ103の直後に行われる必要はなく、任意の時刻に行われてよい。たとえばストレージ装置1のCPU11の負荷が低い時、或いはキャッシュメモリ14に格納されたデータ量が所定の閾値を超過した時などに実行されるとよい。
ステップ103で稼働情報300’に記録された情報は、バッファ更新プログラム150によって、キャッシュメモリ14上の仮想ボリューム管理テーブル300に反映される。バッファ更新プログラム150は定期的に実行されるプログラムである。
バッファ更新プログラム150の実行が開始されると、バッファ更新プログラム150は稼働情報300’の内容を、仮想ボリューム管理テーブル300に反映する。図13を用いて処理の流れを説明する。
ステップ151:バッファ更新プログラム150は稼働情報300’のレコードを1つ選択する。以下では、このレコードの仮想ページ#(101)の値がpの場合を例にとって説明する。
ステップ152:バッファ更新プログラム150は、ステップ151で選択された稼働情報300’のレコードのシーケンシャルWR数(302)とランダムWR数(303)の値をそれぞれ、仮想ボリューム管理テーブル300のレコードのうち、仮想ページ#(101)がpのレコードのシーケンシャルWR数(302)とランダムWR数(303)に加算する。また、仮想ページ#(101)がpのレコードの最終更新時刻(304)に、選択された稼働情報300’のレコードの最終更新時刻(304)を記録する。
ステップ153:バッファ更新プログラム150は、ローカルメモリ16からステップ151で選択された稼働情報300’のレコードを削除する。
ステップ154:稼働情報300’の全レコードに対してステップ153までの処理が終了した場合(ステップ154:Yes)、処理を終了する。まだローカルメモリ16に稼働情報300’のレコードが残っている場合(ステップ154:No)、バッファ更新プログラム150はステップ151から処理を繰り返す。
本実施例に係るストレージ装置1は、CPU11がキャッシュメモリ14にアクセスする時、内部スイッチ17を経由したアクセスを行うため、アクセス性能(応答時間)が、CPU11がローカルメモリ16にアクセスするときの性能に比べて良くない(長くなる)。そのため本実施例に係るストレージ装置1は、シーケンシャルWR数(302)、ランダムWR数(303)、最終更新時刻(304)の情報をローカルメモリ16上の稼働情報300’に一時記録し、定期的にその内容をキャッシュメモリ14上の仮想ボリューム管理テーブル300に反映する制御を行う。
ただし別の実施形態として、ストレージ装置1がローカルメモリ16のみを有し、仮想ボリューム管理テーブル300がローカルメモリ16上に格納される構成の場合、このような制御を行う必要がなく、I/Oプログラム100はステップ103で直接仮想ボリューム管理テーブル300のシーケンシャルWR数(302)、ランダムWR数(303)、最終更新時刻(304)の更新を行ってもよい。またストレージ装置1がキャッシュメモリ14のみを有し、全ての情報がキャッシュメモリ14上に格納される構成の場合も、上で説明した制御を行う必要がなく、I/Oプログラム100はステップ103で、キャッシュメモリ14上の仮想ボリューム管理テーブル300の更新を行ってもよい。
続いて、重複排除プログラム1000の処理について、図14、図15を用いて説明する。重複排除プログラム1000は、ホスト2から上書き空間に書き込まれたデータ(このデータは一旦上書き空間に割り当てられた物理ページに格納される)を、追書き空間に割り当てられたページに移動する処理を行うプログラムである。先に述べたとおり、追書き空間に割り当てられたページにデータ(チャンク)が移動される時、チャンクは圧縮される。そして重複排除処理が行われることもある。
ステップ1010:重複排除プログラム1000は、仮想ボリューム管理テーブル300を参照し、追書き空間にデータを移動する仮想ページを選択する。仮想ページの選択基準は任意で良い。一例として、ページ種別(305)が“1”の仮想ページのうち、現在時刻と最終更新時刻(304)の差が所定の閾値以上で、かつ最終更新時刻(304)が最も古いものが選ばれるとよい。追書き空間に格納されるデータ(チャンク)は圧縮されているため、アクセス時の応答時間が長くなる。そのため、アクセス頻度の高いデータよりも、アクセス頻度の低いデータが追書き空間に配置される方が好ましいからである。また重複排除プログラム1000は、変数Dを用意し、Dを初期化する(0を代入する)。
ステップ1020:重複排除プログラム1000は、ステップ1010で選択された仮想ページのデータを、記憶デバイス20からキャッシュメモリ14上に読み出す。もし既に仮想ページのデータがキャッシュメモリ14上に存在する場合には、このステップ1020は実行される必要がない。
ステップ1030:重複排除プログラム1000は、ステップ1020でキャッシュメモリ上に読み出されたデータの中から、チャンクを選択する。チャンクの選択方法は任意である。たとえばLAが小さいチャンクから順に選択されてもよい。
ステップ1040:重複排除プログラム1000は、ステップ1030(または後述するステップ1080)で選択されたチャンクを、バッファ700に転送する。
ステップ1050:重複排除プログラム1000は、バッファ700に転送されたデータからFPKを算出する。
ステップ1060:重複排除プログラム1000は、バッファ700に転送されたデータを圧縮することで、圧縮チャンクを生成する。同時に重複排除プログラム1000は、このチャンクの圧縮率を求める。圧縮率の定義は上で述べたとおりである。ここで生成された圧縮チャンクは、一旦バッファ700に保存される。
ステップ1070:このステップで重複排除プログラム1000は、圧縮チャンクを追書き空間に格納する。また、必要に応じて重複排除処理も行われる。この処理の詳細は後述する。
ステップ1080:重複排除プログラム1000は、ステップ1020でキャッシュメモリ上に読み出されたデータの中から、次のチャンク(ステップ1070の処理がまだ行われてないチャンク)を選択する。
ステップ1090:もしステップ1080で、次のチャンクが選択できなかった場合、つまりすべてのチャンクについてステップ1070の処理が行われた場合(ステップ1090:Yes)、次にステップ1100が行われる。ステップ1080で、次のチャンクが選択できた場合(ステップ1090:No)、重複排除プログラム1000は再びステップ1040からの処理を行う。
ステップ1100:重複排除プログラム1000は、上書き空間のデータを破棄する。具体的には重複排除プログラム1000は、ステップ1010で選択された仮想ページに割り当てられているページが、仮想ページに割り当てられていない状態になるよう、仮想ボリューム管理テーブル300の内容を更新する(この仮想ページのページ種別(305)は“0”に、そしてページ#(306)とプール#(307)には“null”が格納される)。また重複排除プログラム1000は、割り当てられていた物理ページを未使用の状態にするために、この物理ページについて、ページ管理テーブル200のレコードのうち、割り当てられていた物理ページのuse(204)の値を“0”に更新する。
ステップ1110:ステップ1070では原則として、重複排除プログラム1000はチャンクのメタデータをFPMQ400に登録する。ただしチャンクが所定の条件に該当する場合、チャンクのメタデータはFPMQ400に登録されない。重複排除プログラム1000は、変数Dに、メタデータがFPMQ400に登録されなかったチャンクの数を保持している。ステップ1110で重複排除プログラム1000は、仮想ボリューム管理テーブル300のメタデータ削減チャンク数(308)にDの値を加算し、処理を終了する。
続いて、ステップ1070で行われる処理の詳細を、図15を参照しながら説明する。
ステップ6010:重複排除プログラム1000はステップ1060で求められた圧縮率が、所定の閾値より大きいか否か判定する。圧縮率が所定の閾値以下の場合(ステップ6010:No)、次にステップ6020が行われる。圧縮率が所定の閾値より大きい場合、次にステップ6210が行われる。
ステップ6020:重複排除プログラム1000は、ステップ1040で求められたFPKと同じFPKが、FPMQ400に格納されているか探索する。先に述べたとおり、重複排除プログラム1000はFPTD450とFPMQ400を参照することで、ステップ1040で求められたFPKと同じFPKの格納されている、FPMQ400のレコードを探索する。
ステップ6030:もし、ステップ1040で求められたFPKと同じFPKが、FPMQ400に格納されている場合(ステップ6030:Yes)、重複排除プログラム1000は次にステップ6040を行う。ステップ1040で求められたFPKと同じFPKが、FPMQ400に格納されていない場合(ステップ6030:No)、次にステップ6110が行われる。
ステップ6040:重複排除プログラム1000は、FPMQ400、LP変換テーブル500、追書き空間マッピングテーブル350、ページ管理テーブル200を参照することで、ステップ1040で求められたFPKと同じFPKを持つチャンク(圧縮チャンク)を記憶デバイス20から読み出す。
具体的には重複排除プログラム1000は、まずFPMQ400とLP変換テーブル500を参照することで、ステップ1040で求められたFPKと同じFPKを持つチャンク(圧縮チャンク)の格納されているPA及びその長さを特定する。以下、このチャンクを“重複候補チャンク”と呼び、重複候補チャンクのPAを“PA1”と呼ぶ。続いて重複排除プログラム1000は追書き空間マッピングテーブル350を参照することで、重複候補チャンクが格納されているページ(物理ページ)のページ番号を特定し、さらにページ管理テーブル200を参照することで、重複候補チャンクが格納されているページの存在する記憶デバイス及びアドレスを特定する。これはI/Oプログラム100が行うステップ16と同様の処理である。そして重複排除プログラム1000は特定された記憶デバイス20から、重複候補チャンクを読み出す。
ステップ6050:重複排除プログラム1000は、ステップ6040で読み出されたチャンク(圧縮チャンク)とステップ1050で圧縮されたチャンクの内容を比較し、両者が同一か否か判定する。比較の際、両者はいずれも圧縮された状態にあるが、重複排除プログラム1000は圧縮されたチャンク同士をバイト単位で比較する。ただし別の実施形態として、重複排除プログラム1000は圧縮されたチャンクを一旦伸長し、伸長されたデータの比較を行ってもよい。比較の結果、両者が一致している場合(ステップ6050:Yes)、次にステップ6060が行われる。両者が異なる場合(ステップ6050:No)、次にステップ6110が行われる。
ステップ6060:重複排除プログラム1000は、FPMQ400にチャンクのFPKとチャンクのLAを登録する。また重複排除プログラム1000は、LP変換テーブル500のレコードのうち、LA(501)が処理対象チャンクのLAに一致するレコードのFPMQ登録(505)に“1”を格納する。
ステップ6070:重複排除プログラム1000は、プール管理情報600の累積重複排除対象チャンク数(602)に1を加算する。
ステップ6080:重複排除プログラム1000は、LP変換テーブル500のレコードのうち、LA(501)が処理対象チャンクのLAに一致するレコードのPA(503)に、重複候補チャンクのPA(つまりPA1)を格納し、Length(504)に重複候補チャンクの長さを格納する。この場合、追書き空間への圧縮チャンク格納は行われない。その後重複排除プログラム1000は、ステップ1080以降の処理を行う。
ステップ6110:このステップは、ステップ6030の判定が否定的だった場合またはステップ6050の判定が否定的だった場合、つまり対象チャンクと同一のチャンクが追書き空間に格納されていない場合に行われる。ステップ6110で重複排除プログラム1000は、FPMQ400にチャンクのメタデータを登録するか否か判定する。
具体的には、重複排除プログラム1000は、FPMQ400の合計サイズが所定の規定値を超過している場合、かつ処理対象チャンクの属する仮想ページのランダムライト比率が所定値以上の場合(ステップ6110:No)、FPMQ400にチャンクのメタデータを登録しないと決定し、次にステップ6210が行われる。一方、FPMQ400の合計サイズが所定の規定値を超過していない場合、または処理対象チャンクの属する仮想ページのランダムライト比率が所定値未満の場合(ステップ6110:Yes)、重複排除プログラム1000はFPMQ400にチャンクのメタデータを登録すると決定し、次にステップ6120が行われる。
なお、ここでの「所定の規定値」は、キャッシュメモリ14の容量に基づいて定められるとよい。たとえばFPMQ400の合計サイズが、キャッシュメモリ14の容量のx%を超過している場合(かつ仮想ページのランダムライト比率が所定値以上の場合)に、FPMQ400にチャンクのメタデータを登録しないようにするとよい。FPMQ400の合計サイズが過剰に大きくなり、キャッシュメモリ14の消費量が増加すると、ホスト2からのライトデータなどをキャッシュメモリ14に格納できる量が減少し、ストレージ装置1の性能に悪影響を及ぼすからである。
また、ここでのランダムライト比率とは、仮想ボリューム管理テーブル300に格納されているランダムWR数(303)とシーケンシャルWR数(302)を用いて算出される値である。判定対象のチャンクが属する仮想ページのランダムWR数(303)がr、シーケンシャルWR数(302)がsの場合、ランダムライト比率は以下の式で求められる。
r÷(r+s)
ステップ6120,ステップ6130:これらのステップはステップ6060,ステップ6070と同じである。
ステップ6140:重複排除プログラム1000は、バッファ700に一時保存されている圧縮チャンクを追書き空間に書き込み、バッファ700内の圧縮チャンクを削除する。先に述べたとおり、重複排除プログラム1000は追書き空間に圧縮チャンクを書き込むとき、追書き空間に追記する。ここで圧縮チャンクを追書き空間に追記する処理の流れを、図16を用いて説明する。
まず、重複排除プログラム1000は、圧縮チャンクを追記すべき追書き空間上のアドレス(PA)を決定する(ステップ51)。ストレージ装置1は、プール管理情報600と追書き空間マッピングテーブル350に、追書き空間の最終書き込み位置の情報を保持している。重複排除プログラム1000は、プール管理情報600の最終書き込み位置(604)を参照することで、最後に書き込みが行われた追書きページの追書きページ#を特定する。以下、これをAP1と表記する。続いて重複排除プログラム1000は追書き空間マッピングテーブル350を参照することで、追書きページ#(351)がAP1のレコードのページ内最終書き込み位置(354)を特定する。以下ではこれをRA1と表記する。そして重複排除プログラム1000は、“AP1×ページのサイズ(42MB)÷512+RA1+1”を算出することで、圧縮チャンクを書き込むべき追書き空間上のアドレス(PA)を求める。以下では、圧縮チャンク書き込み先のPAが“PA2”と決定され、また圧縮チャンクの長さが“L2”であった場合について説明する。
続いて重複排除プログラム1000は、ステップ51で決定されたPA(PA2)を含む追書きページに物理ページが割り当てられているか判定する(ステップ52)。このために重複排除プログラム1000は、PA2をページのサイズ(42MB)で割ることで、PA2を含む追書きページの追書きページ#を求める(以下、ここで求められた追書きページ#は、“AP2”と表記する)。さらに重複排除プログラム1000は追書き空間マッピングテーブル350を参照することで、追書きページ#(351)がAP2のレコードのページ#(352)に有効な値(null以外の値)が格納されているか判定する。ページ#(352)に有効な値が格納されている場合、PA2を含む追書きページには物理ページが割り当てられている。
PA2を含む追書きページに物理ページが割り当てられていない場合(ステップ52:No)、重複排除プログラム1000は、追書きページに物理ページを割り当てる(ステップ53)。具体的には重複排除プログラム1000は、ページ管理テーブル200から未使用の物理ページを1つ選択し、そのページ#及びそのページの属するプールのプール#をそれぞれ、追書きページ#(351)がAP2のレコードのページ#(352)とプール#(353)に格納する。また重複排除プログラム1000は、ページ管理テーブル200から選択された物理ページのuse(204)に“1”を格納する。逆に、PA2に物理ページが割り当てられている場合(ステップ52:Yes)は、ステップ53は行われない。
ステップ54では、重複排除プログラム1000は追書き空間マッピングテーブル350とページ管理テーブル200を参照することで、圧縮チャンクの書き込み先の記憶デバイス20のアドレスを算出する。続いて重複排除プログラム1000は、ステップ54で算出されたアドレスに、圧縮チャンクを書き込む(ステップ55)。ステップ56で重複排除プログラム1000は、今回圧縮チャンクを書き込んだ追書きページの追書きページ#をプール管理情報600の最終書き込み位置(604)に代入し、また最後に書き込みを行った追書きページ内の相対アドレスを最終書き込み位置(604)に代入し、処理を終了する。
以上が、ステップ6140で行われる処理である。再び図15の説明に戻る。
ステップ6150:重複排除プログラム1000は、LP変換テーブル500のレコードのうち、LA(501)が処理対象チャンクのLAに一致するレコードのPA(503)に、圧縮チャンクのPA(つまりPA2)を格納し、Length(504)に圧縮チャンクの長さ(L2)を格納する。その後重複排除プログラム1000は、ステップ1080以降の処理を行う。
ステップ6210:重複排除プログラム1000は、変数Dに1を加算する。またステップ6210が実行される場合、重複排除プログラム1000は図15の処理で処理対象となっているチャンク(圧縮チャンク)について、重複排除判定を行わず、またFPMQ400にチャンクのメタデータを登録しない。
ステップ6220:重複排除プログラム1000は、プール管理情報600のメタデータ削除チャンク数(603)に1を加算する。その後重複排除プログラム1000は、ステップ6140を行う。
最後に、ステップ110でI/Oプログラム100が実行するデステージ処理の流れを、図17を用いて説明する。
ステップ5010:I/Oプログラム100は、キャッシュメモリ14に格納された各データの中から、処理対象のデータを選択する。データの選択方法は、様々な方法がありえる。一例として、ホスト2からライトされた時刻が最も古いデータを選択する方法がある。その場合、ストレージコントローラ10は、キャッシュメモリ14に格納された各データについて、ホスト2からライトされた時刻を記憶しておく必要がある。以下では、ここで1チャンク分のデータが選択された場合の例を説明する。ただし別の実施形態として、複数のチャンク、たとえば仮想ボリューム上で連続している複数のチャンクが選択されてもよい。
ステップ5020:I/Oプログラム100は、ステップ5010で選択されたデータの書き込み先仮想ページを特定する。以下では、ステップ5020でVP#pが特定された場合の例を説明する。そしてI/Oプログラム100は仮想ボリューム管理テーブル300を参照し、仮想ページ#(301)が“p”のレコードについて、ページ種別(305)が“0”か“1”かを判定する。ページ種別(305)が“1”の場合(ステップ5020:No)、データの書き込み先は上書き空間であるので、次にステップ5110が実行される。ページ種別(305)が“0”の場合(ステップ5020:No)、次にステップ5030が行われる。
ステップ5030:このステップが実行される場合、VP#pに書き込まれたデータは追書き空間に移動されていることを意味する。この場合I/Oプログラム100は、追書き空間に移動されているVP#pのデータを、再び上書き空間に戻すか否かを判定する。
たとえばVP#p内のほぼ全てのチャンクが更新された場合、I/Oプログラム100は、追書き空間に移動されているVP#pのデータを再び上書き空間に戻すと決定する。この場合、VP#pが今後も頻繁に更新される可能性があるため、デステージのたびにデータを圧縮して格納すると、ライト処理のオーバヘッドが大きくなるためである。ただしこの判定方法は一例であり、これ以外の判定方法によって、追書き空間に移動されているVP#pのデータを、再び上書き空間に戻すか否かが判定されてもよい。ステップ5030の判定が否定的な場合、次にステップ5040が行われ、ステップ5030の判定が肯定的な場合、次にステップ5210が行われる。
ステップ5040:I/Oプログラム100は、処理対象データを圧縮する。これはステップ1040〜ステップ1060で行われる処理と同じである。ステップ1040〜ステップ1060と同様に、I/Oプログラム100はFPKの算出も行う。
ステップ5050:I/Oプログラム100は、処理対象データ(圧縮チャンク)を追書き空間に格納する。この処理はステップ1070と同様な処理である。つまり図15のステップ6010〜ステップ6150の処理が行われる。図15で説明した処理との違いは、I/Oプログラム100はステップ6210で、変数Dに1を加算する代わりに、仮想ボリューム管理テーブル300のメタデータ削減チャンク数(308)に1を加算する。それ以外の点は、先に説明した処理と同じ処理が行われる。ステップ5050の後、キャッシュメモリ14から処理対象データを削除し、またバッファ700から処理対象データ及びその圧縮チャンクを削除し、デステージ処理は終了する。
ステップ5210:追書き空間に移動されているVP#pのデータを、再び上書き空間に戻すと決定された場合、I/Oプログラム100は、追書き空間に移動されているVP#pのデータを全て、記憶デバイス20から読み出し、データを伸長し、一旦キャッシュメモリ14に格納する。これは図11を用いて説明した処理と同様の処理が行われればよい。
ステップ5220:I/Oプログラム100は、VP#pに物理ページを割り当てる。具体的には、I/Oプログラム100はページ管理テーブル200から未使用の物理ページを1つ選択し、そのページ#及びそのページの属するプールのプール#をそれぞれ、仮想ボリューム管理テーブル300内の、仮想ページ#(301)がpのレコードのページ#(306)とプール#(307)に格納する。またI/Oプログラム100は、ページ管理テーブル200から選択された物理ページのuse(204)に“1”を格納する。
ステップ5230:I/Oプログラム100は、VP#pに割り当てられた物理ページに、ステップ5210で読み出されたデータを格納する。具体的にはI/Oプログラム100は、図11のステップ13と同様に、ページ管理テーブル200を参照することでVP#pに割り当てられた物理ページの存在する記憶デバイス20のDEV#(202)、Addr(203)を特定する。そしてI/Oプログラム100は、特定された記憶デバイスに、ステップ5210で読み出されたデータを格納する。
ステップ5240:I/Oプログラム100は、VP#pに割り当てられた物理ページに、処理対象データを上書きし、デステージ処理を終了する。
ステップ5110:I/Oプログラム100は、VP#pに物理ページが割り当てられていない場合、物理ページを割り当てる。これはステップ5220と同様の処理である。ただしVP#pに既に物理ページが割り当てられている場合には、物理ページの割り当ては必要ない。
ステップ5120:ステップ5240と同様に、I/Oプログラム100はVP#pに割り当てられた物理ページに、処理対象データを上書きし、デステージ処理を終了する。
なお、ここで説明したデステージ処理は一例であり、上で説明した処理と異なる処理が行われてもよい。たとえば、VP#pのデータが追書き空間に移動されている場合、ステップ5030の判定を行わずに、必ず追書き空間に追記するようにしてもよい。
あるいは、追書き空間から上書き空間にデータを戻す場合、戻すデータの量が少なくなるような制御が行われてもよい。たとえばホスト2からVP#pのページ全体を更新する要求を受け付けた場合、キャッシュメモリ14にはVP#pの1ページ分のデータが格納される。この状態の場合、追書き空間から上書き空間にデータを戻しても、キャッシュメモリ14に格納されたデータをデステージすると、追書き空間から上書き空間に書き戻されたデータは上書きされてしまう。そのため、このような場合には、追書き空間から上書き空間にデータを戻さないようにする方が、効率がよい。
以上述べたように、実施例1に係るストレージ装置1は、ホスト2からのライトデータを圧縮し、さらに重複排除処理を行って、記憶デバイスに格納する。これにより、圧縮のみを行う場合、あるいは重複排除処理のみを行う場合に比べ、記憶領域をより節約することができる。
また実施例1に係るストレージ装置1は、圧縮率が高いチャンク(ステップ6010:Yes)、あるいはランダムライト比率が高い仮想ページに属するチャンク(ステップ6110:Yes)等の、所定条件に該当するチャンクのメタデータをFPMQ400に登録しない。所定条件を満たすチャンクのメタデータがFPMQ400に登録されない理由は、キャッシュメモリ14の消費量を抑制するためである。ストレージ装置1がFPMQ400に全チャンクのメタデータを登録すると、FPMQ400のサイズが過大になる。そのため実施例1に係るストレージ装置1は、FPMQ400に登録するチャンクのメタデータの量を抑制し、FPMQ400がキャッシュメモリ14を過剰に占有することを防いでいる。
また、圧縮率が高いチャンクのメタデータがFPMQ400に登録されない理由は、圧縮率が高いチャンク(つまり圧縮チャンクのサイズが小さい)について重複排除処理が行われても、圧縮率が低いチャンクの重複排除処理が行われる場合に比べて、重複排除処理による記憶領域の節約の効果が小さいためである。
またランダムライト比率が高い仮想ページに属するチャンクのメタデータがFPMQ400に登録されない理由は、ランダムライト比率が高い仮想ページ(チャンク)は、ランダムライト比率が低い(シーケンシャルライト比率が高い)仮想ページに比べて、重複データが存在する可能性が低いという推定に基づく。シーケンシャルライト比率が高い仮想ページ(またはその仮想ページを含む仮想ボリューム)は、例えばデータのバックアップ用途で用いられている可能性が高い。特に複数世代のバックアップデータを仮想ページ(仮想ボリューム)に記憶している場合、同一データが存在する可能性が高いことが期待できる。一方ランダムライト比率が高い仮想ページ(またはその仮想ページを含む仮想ボリューム)は、そのようなデータが含まれていることが期待できないため、本実施例に係るストレージ装置1は、ランダムライト比率が高い仮想ページに属するチャンクのメタデータをFPMQ400に登録しない制御を行っている。ただしこれらの条件は一例であり、チャンクのメタデータをFPMQ400に登録しないチャンクは、別の条件によって選定されてもよい。