本実施例では、「圧縮」とは、LZWアルゴリズム等の可逆圧縮アルゴリズムを用いて、データの意味を保ったままデータサイズを縮小する処理のことを意味する。本実施例に係るストレージ装置では、ホストからストレージ装置に対して書き込まれるデータの圧縮を行うことがある。ストレージ装置で圧縮処理が行われたことによりサイズの縮小されたデータのことを、「圧縮データ」と呼び、ストレージ装置で圧縮処理が施されていないデータの事を「非圧縮データ」と呼ぶ。また可逆圧縮アルゴリズムを用いて、圧縮データを元のデータサイズに戻す処理のことを、「伸長」または「解凍」と呼ぶ。
また本実施例では、データ圧縮によるデータサイズの縮小効率の指標として、「圧縮率」を用いる。本実施例における圧縮率は、以下の計算式により定義されるものである。
圧縮率=(非圧縮データのサイズ−圧縮データのサイズ)÷非圧縮データのサイズ
本実施例では上の計算式に基づいて圧縮率が定義されるので、圧縮率は0から1の間の値をとり得る。そのため、「圧縮率が低い」とは、圧縮によりデータサイズがあまり縮小されなかったことを意味する。一例として圧縮処理の結果、データサイズが全く変化しなかった場合には、圧縮率は0となる。逆に「圧縮率が高い」とは、圧縮によるデータサイズの縮小量が多いことを意味する。
記憶領域の「更新」とは、記憶領域に格納されているデータの内容を新しい内容に書き換える(上書きする)ことを意味する。ある記憶領域が更新される前に、その記憶領域に格納されていたデータは、「更新前データ」と呼ばれる。一方その記憶領域に新たに書き込まれるデータのことは、「更新データ」または「更新後データ」と呼ばれる。
「ボリューム」とは、ストレージ装置や記憶デバイス等のターゲットデバイスが、ホスト計算機等のイニシエータデバイスに提供する記憶空間のことを意味する。イニシエータデバイスが記憶空間上の領域に対するデータ書き込み要求を発行すると、その領域に対応付けられているターゲットデバイス上の領域にデータが格納される。本実施例に係るストレージ装置はボリュームとして、いわゆるThin Provisioning技術により形成される仮想ボリュームをホストに提供する。仮想ボリュームは、その初期状態(仮想ボリュームが定義された直後)では、記憶空間上の領域に記憶デバイスが対応付けられていない。イニシエータデバイス(ホスト)が記憶空間上の領域にデータ書き込み要求を発行した時点で、ストレージ装置はその領域に対応付けられる記憶デバイスを動的に決定する。
本実施例において、「ブロック」とは、ターゲットデバイスがイニシエータデバイスに提供する記憶空間(ボリューム等)上の領域を意味する。また本実施例において、ブロックはボリューム等の最小アクセス単位と等しいサイズの領域で、固定長である。ブロックのサイズは一例として512バイトである。イニシエータデバイスが記憶空間内の各ブロックにアクセスする際には、各ブロックにアサインされているアドレスを指定することでアクセスする。このアドレスは、「Logical Block Address(LBA)」と呼ばれる。本実施例では特に、ストレージ装置がホストに提供するボリューム(仮想ボリューム)のブロックにアサインされているLBAのことを、「ホストLBA」と呼ぶことがある。
「追書き(append write)」または「追記(append)」とは、データを記憶領域の未使用領域に対してシーケンシャルに書き込む動作のことを意味する。本実施例に係るストレージ装置では、追書き用の記憶領域が設けられる。ストレージ装置が追書き処理を行う場合、追書き用の記憶領域の先頭から順にデータを書き込んでいく。ストレージ装置は、直前に行われた追書き処理でデータが書き込まれた終端アドレスを記憶しており、追書き処理を行う際には、この終端アドレスの次のアドレスから、データを書き込む。
(1)システム構成
図1は、第1の実施例に係るストレージ装置1を含む計算機システムの構成例を示している。ストレージ装置1は、ストレージコントローラ10と、ストレージコントローラ10に接続された複数の記憶デバイス20を有する。
記憶デバイス20は、ストレージ装置1がホスト2などの上位装置からのライトデータを記憶するために用いられる。記憶デバイスとしては、たとえば磁気ディスクを記憶媒体として用いるHDD(Hard Disk Drive)25や、フラッシュメモリ等の不揮発性半導体メモリを記憶媒体として採用したSSD(Solid State Drive)21が用いられる。あるいはDVD−RW(22)等のリムーバブルストレージメディアが用いられてもよい。記憶デバイス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を有する。そしてプロセッサ11、ホストI/F12、デバイスI/F13、メモリ14、管理用I/F15、圧縮部16は、内部スイッチ(内部SWとも呼ばれる)17を介して相互接続されている。図1ではこれらの構成要素がそれぞれ1つだけ示されているが、高性能化及び高可用性の確保のため、これらの構成要素のそれぞれがストレージコントローラ10内に複数搭載されていてもよい。また内部SW17ではなく、共通バスを介して各構成要素が相互接続された構成にしてもよい。
デバイスI/F13は少なくとも、インタフェースコントローラと転送回路を有する。インタフェースコントローラは、記憶デバイス20で用いられているプロトコル(一例ではSAS)をストレージコントローラ10内部で用いられている通信プロトコル(一例としてPCI−Express)に変換するためのコンポーネントである。転送回路は、ストレージコントローラ10が、記憶デバイス20に対してデータの転送(リード、ライト)を行う際に用いられる。
ホストI/F12は、デバイスI/F13と同様に、少なくともインタフェースコントローラと転送回路を有する。ホストI/F12が有するインタフェースコントローラは、ホスト2とストレージコントローラ10間のデータ転送経路で用いられている通信プロトコル(たとえばファイバチャネル)と、ストレージコントローラ10内部で用いられている通信プロトコルを変換するためのものである。
プロセッサ11は、ストレージ装置1の各種制御を行う。メモリ14は、プロセッサ11が実行するプログラム(ストレージ制御プログラムと呼ぶ)や、プロセッサ11が使用するストレージ装置1の各種管理情報を記憶するために用いられる。
本明細書では、ストレージ装置1(またはストレージコントローラ10)が、デステージ処理や移動判定処理(後述)等の処理を実施する、という表現が用いられている箇所がある。これをより正確に表現すると、ストレージ制御プログラムがプロセッサ(CPU)11で実行されることによって、CPU11がホストI/F12、デバイスI/F13、メモリ14や圧縮回路16を用いてこれらの処理を行う、という表現になるが、説明が冗長になることを避けるため、以下の説明では、ストレージコントローラ10(またはストレージ装置1)がこれらの処理を実施する、と表現することもある。
またメモリ14は、記憶デバイス20に対するI/O対象データを一時的に記憶するためにも用いられる。以下、記憶デバイス20に対するI/O対象データを一時的に記憶するために用いられる、メモリ14中の記憶領域のことを、「キャッシュメモリ」または「キャッシュ」と呼ぶ。メモリ14には、DRAM、SRAM等の揮発性記憶媒体が用いられるが、別の実施形態として、不揮発性メモリを用いてメモリ14を構成してもよい。また、メモリ14に揮発性記憶媒体が用いられる場合、ストレージ装置1にバッテリ等の補助電源を搭載し、停電時にメモリ14の記憶内容を維持できるように構成されていてもよい。
管理ホスト5は、ストレージ装置1の管理操作を行うための計算機である。管理ホスト5は、キーボードやディスプレイ等の入出力デバイス(非図示)を備え、ユーザ(管理者)は入出力デバイスを用いてストレージ装置1に対する設定指示を行うことができる。また管理ホスト5は、ストレージ装置1の状態等の情報をディスプレイ等の出力デバイスに表示することもできる。
圧縮部(圧縮回路)16は、データの圧縮、または圧縮されたデータの伸長を行う機能を備えたハードウェアである。ストレージ装置1は、記憶デバイス20に格納されるデータの一部(または全部)を、圧縮部16を用いて圧縮することができる。圧縮部16は、ASIC(Application Specific Integrated Circuit)等のハードウェアで実装される.ただし、圧縮部16にプロセッサとメモリを設け、プロセッサでデータ圧縮を行うためのプログラムを実行させることで、圧縮部16がデータの圧縮または伸長を行うように構成されていてもよい。あるいは、圧縮部(圧縮回路)16のような専用のハードウェアをストレージコントローラ10に設けずに、CPU11でデータ圧縮を行うためのプログラムを実行させることで、CPU11にデータの圧縮または伸長を行わせるようにしてもよい。
(2)記憶領域の管理
続いて、本実施例に係るストレージ装置1が管理する記憶領域について説明する。本実施例に係るストレージ装置1が有する1以上の記憶デバイス20は、所定サイズの記憶空間をストレージコントローラ10に提供する。ストレージコントローラ10は、記憶デバイス20の提供する記憶空間を直接ホスト2には提供しない。ストレージコントローラ10はホスト2に、記憶デバイス20の提供する記憶空間とは異なる、1以上の仮想的な記憶空間を提供する。この仮想的な記憶空間を「仮想ボリューム」と呼ぶ。なお、ストレージコントローラ10は複数の仮想ボリュームをホスト2に提供可能だが、以下では特に断りのない限り、ストレージコントローラ10が仮想ボリュームを1つ、ホスト2に提供する例について説明する。
ストレージ装置1は、仮想ボリュームの記憶空間を、複数の所定サイズ(一例として42MB)の部分領域に分割して管理している。本実施例では、この部分領域のことを「仮想ページ」と呼ぶ。なお、以下では仮想ページのサイズが42MBの場合について説明するが、仮想ページのサイズはこれ以外のサイズであってもよい。仮想ボリュームは、公知のThin Provisioning技術などを用いて形成されるボリュームであり、ストレージ装置1は仮想ボリュームの仮想ページに対するアクセス要求を受け付けた時点で、記憶デバイス20の記憶領域を動的に仮想ページに割り当てる(マップする)。
ストレージ装置1がホスト2から、仮想ボリュームの仮想ページに対するライト要求を受信すると、ストレージ装置1は、記憶デバイス20の記憶領域のうち未使用の領域(まだ仮想ページに割り当てられていない領域)を選択し、アクセス対象の仮想ページに、選択された領域を割り当てる(マップする)。ホスト2からのライトデータは、このアクセス対象仮想ページにマップされた領域(ページ)に格納される。またストレージ装置1は、仮想ページと、仮想ページに割り当てられた記憶領域との対応関係(マッピング)をマッピングテーブル(本実施例では仮想ボリューム管理テーブル100と呼ばれる)に記憶している。仮想ページに対するリード要求を受け付けた時には、ストレージ装置1はマッピングテーブルを参照することで、仮想ページに割り当てられた記憶領域を特定し、特定された記憶領域からデータを読み出す。
図2に、仮想ボリュームと、仮想ボリュームに割り当てられる記憶領域の関係の例を示す。本実施例では、複数の記憶デバイス20の記憶領域のうち、仮想ボリュームに割り当てるための記憶領域の集合を「プール」と呼ぶ。プール内の記憶領域は、仮想ページと同サイズの部分領域に区分されて管理される。この仮想ページと同サイズの部分領域のことを、「物理ページ」または「ページ」と呼ぶ。
図2に示されている長方形状のオブジェクト40は、仮想ボリュームの記憶空間を表す。また円柱状のオブジェクト50はプールを表す。
各仮想ページには、仮想ページ番号(VP#と表記されることもある)と呼ばれる、一意な識別番号(識別番号には非負の整数値が用いられる)が付される。以下では、仮想ページ番号がn(nは非負の整数値)の仮想ページのことを、「VP#n」と表記する。同様に各物理ページには、物理ページ番号(またはページ#)と呼ばれる、ストレージ装置1内で一意な識別番号が付される(この識別番号も非負の整数値である)。以下では、物理ページ番号がn(nは非負の整数値)の物理ページのことを、「ページ#n」と表記する。
仮想ボリュームが定義された直後は、仮想ボリュームの各仮想ページには、ページがマップされていない。ストレージコントローラ10は、ホスト2から仮想ページ上の領域に対するライト要求を受信した時にはじめて、当該領域を含む仮想ページに対して割り当てるべき物理ページを決定する。ここで決定される物理ページは、まだどの仮想ページにも割り当てられていないページ(未使用ページ)のなかから、任意の1つのページが選択される。図2の例では、VP#0にページ#1がマップされ、VP#1にページ#0がマップされた例が示されている。
ストレージ装置1がホスト2から、仮想ページ内の領域(1または複数のブロック)に対するライト要求(及びライトデータ)を受け付けた場合、仮想ページにマップされている物理ページ内のブロックにライトデータが格納される。本実施例に係るストレージ装置1では原則として(後述する、圧縮データ格納のケースを除いて)、仮想ページの先頭からn番目のブロックに対してライト要求のあったライトデータは、仮想ページにマップされている物理ページの先頭からn番目のブロックに格納されるという関係にある。そのため、ストレージ装置1は、仮想ページと、仮想ページに割り当てられた記憶領域(物理ページ)とのマッピングだけを、マッピングテーブルに記録しておけば、仮想ボリューム上の任意のブロックにマップされている、記憶デバイス20上記憶領域を一意に特定できる。
ただし、ページに圧縮データが格納される場合には、この限りではない。図2において、VP#2、VP#3は、圧縮データが格納される場合の例を表しているが、その場合、仮想ページの先頭からn番目のブロックに対して書き込まれたデータが、物理ページのn番目のブロックに書き込まれるというような、規則的な関係は維持されない。詳細は後述する。
図3はプール管理テーブル200の例を示している。プール管理テーブル200は、プール、つまり仮想ボリュームに割り当てるための記憶領域の集合を管理するテーブルで、メモリ14に格納されている。プール管理テーブル200の各行(レコード)には、プール内の物理ページの情報が格納される。各レコードは、ページ#(201)、DEV#(202)、Addr(203)、type(204)、use(205)の欄を有する。ページ#(201)には、物理ページのページ番号が格納される。つまりページ#(201)がnのレコードは、ページ#nの情報を管理するレコードである。
DEV#(202)とAddr(203)には、物理ページの属する記憶デバイスの識別番号及び記憶デバイス内のアドレスが格納される。type(204)には、物理ページの属する記憶デバイスの種別(たとえばHDD、SSD等)が格納される。use(205)には、物理ページの使用状況を表す情報が格納される。物理ページが仮想ページにマップされている場合、use(205)には“1”が格納される。逆に物理ページが仮想ページにマップされていない場合、use(205)には“0”が格納される。
なお、本実施例では、プール50に、記憶デバイス20(たとえばHDD)の記憶領域が登録され、各ページが、1つの記憶デバイス20内の記憶領域から構成される例を示しているが、これ以外のプールの構成方法もあり得る。たとえばストレージ装置1がRAID(Redundant Arrays Of Independent (or Inexpensive) Disks)技術を用いて、複数の記憶デバイス20から1つの論理的な記憶デバイス(論理デバイスと呼ぶ)を形成する場合、論理デバイスの記憶領域がプールに登録されるようにしてもよい。その場合、プール管理テーブル200のDEV#(202)とAddr(203)には、論理デバイスの識別番号と、論理デバイス内のアドレスが格納される。
図4は、仮想ボリューム管理テーブル100の例を示している。仮想ボリューム管理テーブル100もメモリ14に格納されている。仮想ボリューム管理テーブル100の各レコードには、仮想ボリューム内の仮想ページについての情報が格納される。具体的には各レコードには、仮想ページ#(101)、ホストLBA(102)、ページ配置(103)、ページ#(104)、更新有無(105)、連続更新無し期間(107)、割当量(111)の情報が格納される。
仮想ページ#(101)には、仮想ページの仮想ページ番号が格納される。ホストLBA(102)には、仮想ページ内の先頭ブロックに対応するLBA(ホストLBA)が格納される。つまり仮想ボリューム管理テーブル100の各レコードは、仮想ページ#(101)で特定される仮想ページが、ホストLBA(102)を開始アドレスとする1ページ分(42MB)の領域に相当することを表している。図4の例では、仮想ページ#(101)が1のレコードのホストLBA(102)は“00015000”であるから、仮想ボリュームのホストLBAが00015000〜00019fffの領域がVP#1に対応することを表している。
ページ#(104)には、仮想ページに割り当てられている物理ページのページ#が格納される。物理ページが割り当てられていない場合、ページ#(104)には無効値(null。たとえば“−1”等の、通常はページ番号として用いられない値)が格納される。
なお、ここで説明している仮想ボリューム管理テーブル100の例は、ストレージ装置1に仮想ボリュームが1つ定義された場合の例を示している。ストレージ装置1に仮想ボリュームが複数定義される場合、仮想ボリューム上の領域を一意に特定可能にするために、ホストLBA(102)の他に、仮想ボリュームの識別子(たとえばホスト2がボリュームを特定するために用いる識別番号であるLogical Unit Number(LUN)等)も、仮想ボリューム管理テーブル100に含まれる。
更新有無(105)には、所定期間(たとえば1日間)仮想ページにライト要求がなかった場合には「無」が格納され、所定期間の間に仮想ページにライト要求があった場合には「有」が格納される。連続更新無し期間(107)には、仮想ページにライト要求がなかった期間が格納される。
ページ配置103と割当量(111)について説明する前に、本実施例に係るストレージ装置1で行われるページ圧縮についての説明を行う。ストレージ装置1が、ホスト2から仮想ボリュームの仮想ページに対するデータの書き込み要求を受け付けると、その仮想ページにページがマッピングされていない場合には、その仮想ページにページをマッピングした後、データをそのまま(圧縮処理を行わずに)ページに書き込む。その後ストレージ装置1は、ページの状態に応じて、ページ内のデータを圧縮する。
本実施例では、ストレージ装置1が、「ある定められた期間以上、ページに書き込み(更新)が行われなかった状態」のページを検出した場合、そのページ内のデータを圧縮する例を説明する。ただし、ページ内データの圧縮を行う条件として、これ以外の条件が用いられてもよい。たとえば外部(管理ホスト5やホスト2等)から、圧縮を行うページが指定された場合に、そのページ内のデータを圧縮するようにしてもよい。
ページに格納された、圧縮処理の行われていない状態のデータ(非圧縮データ)を圧縮した場合、圧縮されたデータは、非圧縮データの格納されていたページとは異なるページに格納される。以下では、非圧縮データの格納されるページのことを「上書きページ」と呼び、圧縮データの格納されるページは「追書きページ」と呼ぶ。追書きページは、圧縮ページと呼ばれることもある。本実施例に係るストレージ装置1では、追書きページもプール50内のページ(プール管理テーブル200で管理されているページ)である。ただしストレージ装置1は、上書きページと追書きページを区別できるよう、追書きページのみを管理するテーブル(追書きページ管理テーブル)を持つ。詳細は後述する。
データを圧縮する際、ストレージ装置1は仮想ページ(または上書きページ)内の所定サイズの部分領域ごとに圧縮を行う。本実施例に係るストレージ装置1では、仮想ページ内の領域を、仮想ページの先頭から順に8KBの部分領域に区分し、この部分領域ごとにデータ圧縮を行う。本実施例では、この8KBの部分領域は「セグメント」と呼ばれる。なお、部分領域の大きさには、8KB以外の大きさが採用されてもよい。
たとえばVP#2にマッピングされているページ(上書きページ)のデータを圧縮する場合、ストレージコントローラ10はVP#2にマッピングされているページの先頭からデータを8KBずつ読み出して、圧縮回路16を用いて、読み出された8KBのデータをそれぞれ圧縮する。8KBのデータを圧縮することで生成されたデータの塊(チャンク)を「圧縮セグメント」と呼ぶ。そしてストレージコントローラ10は圧縮セグメントを追書きページへと格納する。原則として、上書きページのデータを圧縮する場合、上書きページ内の全データが圧縮され、追書きページへと移動される。
1つの追書きページには、複数の上書きページのデータ(圧縮セグメント)を格納することができる。図2の例では、VP#2に書き込まれたデータ(正確にはVP#2にマッピングされている上書きページに格納されたデータ)とVP#3に書き込まれたデータが、追書きページであるページ#2に移される例を示している。
図4のページ配置103と割当量(111)の説明に戻る。あるレコードのページ配置103に「上書き」が格納されている場合、そのレコードで管理されている仮想ページのデータは、上書きページに格納されていることを意味する。またレコードのページ配置103に「追書き」が格納されている場合、そのレコードで管理されている仮想ページのデータは、追書きページに格納されていることを意味する。レコードのページ配置103に「追書き」が格納されている場合、そのレコードのページ#(104)には無効値(null)が設定される。
各レコードの割当量111には、そのレコードで管理されている仮想ページのデータ量が格納される。仮想ページのデータが圧縮されていない場合には、割当量111にはページ(または仮想ページ)のサイズと同サイズ(たとえば42MB)が格納される。仮想ページのデータが圧縮されている場合には、割当量111には仮想ページのデータの圧縮後のサイズが格納される。図4の例では、仮想ページ#(101)が“2”のレコード(つまりVP#2の管理情報が格納されたレコード)の割当量111は10MBであるから、VP#2のデータは10MBに圧縮されたことを意味している。
仮想ページのデータが追書きページに移された場合、仮想ページにマッピングされている記憶領域の管理を行うには、ページよりも細粒度での管理が必要になる。そのため本実施例に係るストレージ装置1は、データが追書きページに移された仮想ページについてのマッピング情報を管理するためのテーブル(LBA管理テーブル)を有する。図5にLBA管理テーブル120の例を示す。LBA管理テーブル120は、ホストLBA121、データ長122、データ格納位置123のカラムを有する。LBA管理テーブル120もメモリ14に格納される。
LBA管理テーブル120の各レコードには、仮想ページ内のセグメントにマッピングされている記憶領域の情報が格納される。ホストLBA121には、仮想ページ内セグメントの先頭ブロックのホストLBAが格納される。データ格納位置123には、追書きページ上の位置情報が格納される。データ格納位置123に格納される位置情報として、物理ページ番号と、物理ページ内の相対アドレスのセットが用いられる。物理ページ内の相対アドレスとは、物理ページ内先頭ブロックのアドレスを0としたときのオフセットアドレスである。たとえばページ#n(nは整数値)の先頭からk番目のブロックの位置情報が格納される場合、(n,(k−1))が格納される。
データ長122には、圧縮データのサイズが格納される。つまり各レコードは、仮想ボリューム(仮想ページ)内の領域のうち、ホストLBA121で特定されるアドレスから始まる8KBの領域に対して、データ格納位置123から始まる、長さがデータ長122の領域がマッピングされている(かつこの領域に圧縮されたデータが格納されている)ことを表している。
図6に追書きページ(圧縮ページ)管理テーブル130と最終書き込み位置134の例を示す。追書きページ管理テーブル130は、追書きページとして確保されているページを管理するためのテーブルで、メモリ14に格納されている。追書きページ管理テーブル130は、相対アドレス131、ページ#(132)、ホストLBA(133)のカラムを有する。ページ#(132)カラムに記録されているページ番号の物理ページが、追書きページとして確保されていることを表す。相対アドレス131は、ページ#(132)で特定される物理ページ内の相対アドレスが格納される。
そして相対アドレス131、ページ#(132)で特定されるブロックが、ホストLBA(133)を開始アドレスとする、8KBの仮想ボリューム上領域にマッピングされていることを表す。なお、圧縮データのサイズは不定のため(データ内容により変動する)、ホストLBA(133)を開始アドレスとする、8KBの仮想ボリューム上領域に、複数のブロックがマッピングされることもある。たとえば圧縮データのサイズが1KBの場合、ホストLBA(133)が同じで、相対アドレス131、ページ#(132)が異なるレコードが2つ存在する。
仮想ボリューム管理テーブル100、プール管理テーブル200、追書きページ管理テーブル130を維持することで、ストレージ装置1は、プール内の記憶領域を追書きページと上書きページに分けて管理することができる。仮想ボリューム管理テーブル100の中で、ページ配置(103)が「上書き」の仮想ページにマッピングされているページ(ページ#(104)で特定されるページ)が上書きページであり、また追書きページ管理テーブル130内のページ#(132)にページ番号が記録されているページが追書きページである。上書きページでも追書きページでもないページ(プール管理テーブル200内で、use(205)が“0”のページ)は、上書きページにも追書きページにもなり得る。
なお、上書きページとして用いられる記憶領域と、追書きページとして用いられる記憶領域は、同一の記憶デバイス20に属する記憶領域でもよい。ただし、上書きページとして用いられる記憶領域と、追書きページとして用いられる記憶領域が、それぞれ異なる記憶デバイス20に属する記憶領域になるようにしてもよい。また追書きページの集合を「追書きプール」と呼ぶこともある。
また、ストレージコントローラ10は、最終書き込み位置134も管理する(メモリ14上に保持される)。最終書き込み位置134は、最後に圧縮セグメントが書き込まれた領域の位置を示しており、ストレージコントローラ10は追書き時に、最終書き込み位置134に基づいて圧縮セグメントの書き込み先を決定する。最終書き込み位置134の次のアドレスが追書きページの未使用領域の先頭位置に相当し、最終書き込み位置134以前の領域は、圧縮セグメントが格納されている領域(あるいは過去に圧縮セグメントが格納されていた領域)である。ストレージコントローラ10が追書きページに圧縮セグメントを書き込む際、最終書き込み位置134の次のアドレスから圧縮セグメントを書き込む(つまり追記する)。圧縮セグメントの書き込みの後、ストレージコントローラ10は最終書き込み位置134を更新する。
続いて、ストレージコントローラ10が追書きページに対するリード・ライトを行う時に、どのように上で説明した各管理テーブル(LBA管理テーブル120や追書きページ管理テーブル130等)を用いるか、概説する。まずストレージ装置1がホスト2から、追書きページにマッピングされた仮想ページ上領域へのリード要求を受領した時の処理の概要を説明する。
ストレージ装置1がホスト2からリード要求を受領すると、ストレージコントローラ10はリード要求に含まれるリード先アドレス(LBA)からVP#を算出する。以下では仮に、VP#がkであった場合の例を説明する。続いてストレージコントローラ10は仮想ボリューム管理テーブル100を参照し、VP#kのページ配置103が「追書き」であった場合には、LBA管理テーブル120を参照することによりリード対象データの格納位置(データ格納位置123、データ長122)を特定する。リード対象データのデータ格納位置123とデータ長122が特定されると、これとプール管理テーブル200を参照することで、ストレージコントローラ10は、リード対象データがどの記憶デバイスのどの領域に格納されているかを特定することができる。
ストレージコントローラ10は特定された記憶デバイスからリード対象データを読み出す。読み出されたデータは圧縮されているので、ストレージコントローラ10は圧縮回路16を用いてデータを伸長し、伸長されたデータをホスト2に返却する。
またストレージ装置1は、データが追書きページに移された仮想ページへの、ホスト2からの更新要求も受け付け可能である。ストレージ装置1がホスト2から、追書きページのマッピングされている仮想ページへの書き込み(更新)要求を受け付けた場合に行われる処理について概説する。なおここでは、書き込み要求で指定されたデータ書き込み範囲は、セグメント境界に一致している場合を想定する。
この時、ストレージコントローラ10はホスト2から受領したライトデータ(更新データ)を圧縮して圧縮セグメントを生成する。以下では、この圧縮セグメントのことを「更新後圧縮セグメント」と呼ぶ。一方ライトデータ(更新データ)の更新前データは、追書きページに圧縮状態で記録されている。この追書きページに記録されている圧縮状態の更新前データのことは「更新前圧縮セグメント」と呼ぶ。
上で述べたように、更新後圧縮セグメントは、追書きページに格納されている終端の圧縮セグメントの後に追記される。そしてストレージコントローラ10はLBA管理テーブル120と追書きページ管理テーブル130の更新を行う。
LBA管理テーブル120と追書きページ管理テーブル130の更新について概説する。以下では、ライトデータ(更新データ)の書き込み先のホストLBAがx、そして更新後圧縮セグメントの書き込み先のページ番号と相対アドレスの組が(y、z)の場合、そして更新前圧縮セグメントが格納されている領域のページ番号と相対アドレスの組が(y’、z’)であった場合の例について説明する。この場合、LBA管理テーブル120のレコードのうち、ホストLBA(121)がxのレコードについて、データ格納位置123には(y、z)が書き込まれ、データ長122には、圧縮セグメントのサイズが格納される。
また、追書きページ管理テーブル130中の、ページ#(132)がy、相対アドレス(131)がzのレコードの、ホストLBA(133)にxが格納される。そして追書きページ管理テーブル130中の、ページ#(132)がy’、相対アドレス(131)がz’のレコードの、ホストLBA(133)の値は“null”に変更される。つまり更新前圧縮セグメントの格納されていた領域は、仮想ページにマッピングされていない領域に変更される。
更新前圧縮セグメントが格納されている記憶領域に更新後圧縮セグメントを格納(上書き)しない理由は、更新後圧縮セグメントのサイズが、更新前圧縮セグメントのサイズと異なる場合があるためである。特に更新後圧縮セグメントのサイズが、更新前圧縮セグメントのサイズより大きい場合、更新前圧縮セグメントが格納されている記憶領域に更新後圧縮セグメントを上書きできない。本実施例に係るストレージ装置1では、更新後圧縮セグメントを追書きページに追記格納することで、この問題を解決している。
なお、ライトデータのサイズがセグメントのサイズより小さい場合、ストレージコントローラ10は追書きページに格納された圧縮セグメントを読み出し、圧縮回路16を用いて伸長し、キャッシュメモリ上に伸長されたデータを格納する。そしてストレージコントローラ10は、ホスト2から受領したライトデータをキャッシュメモリ上の伸長データに上書きし、圧縮回路16を用いて上書きされた伸長データを圧縮することで、更新後の圧縮セグメントを作成する。更新後の圧縮セグメントはやはり、追書きページの未使用領域に追記される。
また、上の説明は、各管理テーブル(LBA管理テーブル120や追書きページ管理テーブル130等)の使用方法を中心に説明するためのものである。そのため、特に仮想ページに対してホスト2からの書き込み(更新)要求を受け付けた場合に、ストレージコントローラ10で実際に行われる処理は、上で説明したものとやや異なる点もある。たとえば、データが追書きページに移された仮想ページに対してホスト2からの書き込み(更新)要求を受け付けた場合、条件によっては、データが追書きページから上書きページへと移される等、ここで説明した処理とは異なる処理が行われる。ストレージ装置1が、ホスト2からの書き込み(更新)要求を受け付けた時に行う処理の詳細は後述する。
続いて、ガベージコレクションについて説明する。最終書き込み位置134が追書きページ管理テーブル130で管理されている領域の終端に達した場合、追書きページへのデータ書き込みはできなくなる。そのためストレージ装置1は、未使用の追書きページを新たに確保するか、追書きページのガベージコレクションを行う必要がある。ガベージコレクションは、追書きページの領域のうち、仮想ページにマッピングされていない領域(未使用領域)を回収し、データのパッキング(追書きページの前方にデータを移動)を行う処理である。
図6を参照すると、相対アドレス131が1、ページ#(132)が2のブロックに対応するホストLBA133がnullである。そのため、ガベージコレクション処理では、次のブロック(相対アドレス(131)が2、ページ(132)が2のブロック)のデータを、相対アドレス131が1、ページ#(132)が2のブロックに移動し、さらに次のブロック(相対アドレス(131)が3、ページ(132)が2のブロック)のデータを、相対アドレス131が2、ページ#(132)が2のブロックに移動する...、という処理が繰り返し実行されることにより、データのパッキングが行われる。同時にLBA管理テーブル120の更新も行われる。なお、ここではガベージコレクションの概念を簡単に説明するために、1ブロックずつデータを移動する例を説明したが、ここで説明した以外の方法でガベージコレクションが行われてもよい。たとえば処理の効率化のために、複数ブロックをまとめて読み出して移動するようにしてもよい。
(3)閾値、及び空き領域サイズの管理
図7に、本実施例に係るストレージ装置1が管理する、閾値テーブル300の内容を示す。閾値テーブル300はメモリ14に格納されている。閾値テーブル300には、圧縮許可閾値301、CM上ページ更新量閾値302が格納される。閾値テーブル300に格納される値は、管理者が管理ホスト5等を用いて設定または変更することになっている。あるいは別の実施形態として、推奨値があらかじめ閾値テーブル300に設定されていても良い。圧縮許可閾値301には、日数(または時間)が格納される。本実施例に係るストレージ装置1は、上書きページが、圧縮許可閾値301で指定される期間以上更新されていなかった場合、その上書きページ内のデータを追書きページに移動する。図7の例では、圧縮許可閾値301に「7日」が格納されているので、この場合ストレージ装置1は、7日以上更新が行われなかった上書きページのデータを、追書きページに移動する。
CM上ページ更新量閾値302は、追書きページのデータを上書きページに移動する際の契機に関する情報が格納される。本実施例に係るストレージ装置1は、ある追書きページに対する(ホスト2からの)更新データ量が、CM上ページ更新量閾値302で指定されている量以上存在する場合、その追書きページのデータを上書きページに移動する。CM上ページ更新量閾値302には、1ページサイズに対する更新データ量の比率(百分率)が格納される。ただし、比率に代えて、データ量(バイト、MB等)を格納するようにしてもよい。
図7の例では、CM上ページ更新量閾値302に「70%」が格納されている。そのためストレージ装置1は、追書きページがマッピングされている1つの仮想ページに対し、ホスト2からの更新データを29.4MB(42MB(1ページのサイズ)×70%=29.4MB)以上受領し、それらのデータがキャッシュメモリ上に蓄積された場合、その仮想ページには追書きページに代えて上書きページをマップし、追書きページに格納されていたデータを上書きページに格納するとともに、キャッシュメモリ上の更新データを上書きページに書き込む。詳細は後述する。
続いて図8に、本実施例に係るストレージ装置1が管理する、空き領域管理テーブル400の内容を示す。空き領域管理テーブル400はメモリ14に格納されている。空き領域管理テーブル400には、空き領域確保割合401、追書きデータ量402、更新用確保可能量403、空き領域使用量404、更新用空き容量405の情報が格納される。空き領域管理テーブル400に格納される情報のうち、空き領域確保割合401はあらかじめ設定されている値(この値は変更不可能な固定値でもよいし、あるいは管理者が管理ホスト5等を用いて設定または変更可能な値であってもよい)であるが、それ以外の値は、上書きページから追書きページに移動されたデータの量などに基づいて、ストレージ装置1が決定(算出)する値である。
追書きデータ量402は、上書きページから追書きページに移動されたデータの量である。なお本実施例では、このデータ量は圧縮時のデータ量を表す。ただし非圧縮時のデータ量が追書きデータ量402に用いられてもよい。また、追書きページのデータの更新が発生した時、追書きデータ量402の値は再計算される。詳細は後述する。
空き領域確保割合401は、追書きページ内データに対する更新データを格納するためのページの量を算出するための情報である。この、更新データを格納するためのページ(の集合)のことを、「空き領域」と呼ぶ。本実施例に係るストレージ装置1は、空き領域として確保可能なページの量を追書きデータ量402に基づいて決定する。空き領域確保割合401に格納される値は、追書きデータ量402に対する空き領域のサイズの比率(百分率)である。図8の例では追書きデータ量402が4200MB、空き領域確保割合401は10%であるので、ストレージ装置1は420MB(4200MB×10%)に相当する数のページを空き領域として確保可能である。更新用確保可能量403には、この値(つまり420MB)が格納される。
空き領域使用量404には、追書きページのうち、更新データの格納されている領域の量が格納される。これには、上書きページから追書きページに移動されたデータの量は含まれない。そのため、上書きページから追書きページに移動されたデータに対する更新が発生しなかった場合には、空き領域使用量404は0である。また空き領域使用量404は追書きページに実際に書き込まれたデータ(更新データ)の合計サイズを表す。そのため、圧縮された更新データが格納される時には、空き領域使用量404は、追書きページに書き込まれた圧縮後更新データの合計サイズに等しい。
更新用空き容量405には、更新用確保可能量403と空き領域使用量404の差が格納される。なお、更新用確保可能量403は追書きページとして確保してよいページ量の上限値であり、更新用確保可能量403を超える量のページは、空き領域として確保されない。もし追書きページに書き込まれる更新データの量の総和が、更新用確保可能量403以上になる場合(これは更新用空き容量405が0以下になる場合と同じである)、更新データを追書きページに格納(追記)できない。このような場合には、ストレージ装置1は更新が行われた追書きページ内のデータを上書きページに戻す。ストレージ装置1はこのような制御を行うことにより、追書きページを過度に確保しないようにし、また更新頻度が高くなったページが追書きページに留まり続けることを抑制している。
(4)ライト処理
続いてストレージ装置1が、ホスト2から仮想ボリュームに対するライト要求及びライトデータを受領した時の処理(ライト処理)の流れを、図9を用いて説明する。なお、ホスト2が発行するライト要求には、ライトデータの書き込み先位置の情報(ホストLBA及びデータ長)が含まれている。ストレージコントローラ10がライト要求を受領すると、CPU11はライト要求に含まれる書き込み先位置の情報から、ライトデータの書き込み先となる仮想ページの仮想ページ番号を算出する(s51)。
続いてCPU11は、仮想ボリューム管理テーブル100を参照し、s51で特定された仮想ページにページが割り当てられているか判定する(s52)。仮想ボリューム管理テーブル100の仮想ページ#(101)が、s51で特定された仮想ページ番号と等しいレコードのページ#(104)に有効な値(nullでない値)が格納されている場合、あるいは仮想ボリューム管理テーブル100の仮想ページ#(101)が、s51で特定された仮想ページ番号と等しいレコードのページ配置(103)が「追書き」に設定されている場合、s51で特定された仮想ページにページが割り当てられていることを意味する。
s51で特定された仮想ページにページが割り当てられていない場合(s52:No)、CPU11は、プール管理テーブル200から、未使用のページ(use(205)が“0”のページ)を1つ選択し、選択されたページをライト対象仮想ページに割り当てる(s53)。またs53でCPU11は、選択されたページのページ番号(ページ#(201))を、仮想ボリューム管理テーブル100内のライト対象仮想ページのページ#(104)に格納し、またライト対象仮想ページのページ配置(103)に「上書き」を格納することで、選択されたページをライト対象仮想ページに割り当てる作業を行う。また選択されたページのuse(205)は、“1”に変更される。
s54でCPU11は、ホスト2から受領したライトデータを一時格納するためのキャッシュメモリ領域の確保を行い、s55でCPU11は、s54で確保されたキャッシュ領域にライトデータを格納する。最後にCPU11は、ライト対象仮想ページの更新有無(105)をセット(「有」を設定)し(s56)、処理を終了する。キャッシュメモリ領域の確保等の処理は公知の処理であるため、説明は略す。また、CPU11はキャッシュメモリ上に格納されたライトデータを管理するための情報(たとえばライトデータの格納先仮想ボリュームのLBA等)も有するが、これも公知の情報であるので、説明を略す。
図9のライト処理は、ホスト2から受領したライトデータをキャッシュメモリに格納するまでの処理であり、この処理の内容は、書き込み先の仮想ページに上書きページ、追書きページのいずれがマッピングされていても、同じである。また、本実施例に係るストレージ装置1では、キャッシュメモリをいわゆるライトバックキャッシュとして用いる。そのため、ライトデータをキャッシュメモリに格納した直後(図9のs55またはs56の完了後)に、ホスト2にライト処理が完了した旨を通知する。ライトデータがキャッシュメモリに格納されて、しばらく時間が経過した後、CPU11はキャッシュメモリ上のライトデータを記憶デバイス20へ格納する。この処理は、「デステージ」と呼ばれる。
(5)デステージ処理
図10を用いてデステージ処理の流れを説明する。図10の処理は定期的に実施される。あるいはキャッシュメモリ上の未使用領域が所定量を下回った時にデステージ処理が実行されるようにしてもよい。最初にCPU11は、キャッシュメモリ上に格納された各データの中から、処理対象のデータを選択する(s501)。データの選択方法は、様々な方法がありえる。一例として、ホスト2からライトされた時刻が最も古いデータを選択する方法がある。その場合、ストレージコントローラ10は、キャッシュメモリ上に格納された各データについて、ホスト2からライトされた時刻を記憶しておく必要がある。
続いてCPU11は、s501で選択されたデータの書き込み先仮想ページの仮想ページ番号を特定し、その仮想ページのページ配置(103)が「上書き」か「追書き」か判定する(s502)。ページ配置(103)が「上書き」の場合(s502:No)、データの書き込み先仮想ページには上書きページがマッピングされている。そのためCPU11は、s501で選択されたデータのデステージ先の領域、つまり仮想ページにマッピングされている上書きページ上領域(記憶デバイス20上の領域である)を特定し、特定されたデステージ先領域にデータをデステージし(s511)、処理を終了する。デステージ先の領域を特定するには、仮想ボリューム管理テーブル100のページ#(104)を参照することでページ#を特定し、その後プール管理テーブル200の中から、ページ#(201)が特定されたページ#と等しいレコードの、DEV#(202)、Addr(203)を参照すればよい。
ページ配置(103)が「追書き」の場合(s502:Yes)、データの書き込み先仮想ページには追書きページがマッピングされている。この場合CPU11は、キャッシュメモリ上のデータのうち、書き込み先仮想ページがs501で選択されたデータの書き込み先仮想ページと同じであるデータをすべて選択する。以下では、ここで選択されたデータを「デステージ対象データ」と呼び、また選択されたデータの書き込み先仮想ページのことを「デステージ対象仮想ページ」と呼ぶ。そしてデステージ対象データの量が、CM上ページ更新量閾値302以上であるかを判定する(s503)。デステージ対象データの量がCM上ページ更新量閾値302以上の場合(s503:Yes)、CPU11はデステージ対象仮想ページにマッピングされている追書きページのデータを上書きページに移動する(s504)。
s504では、具体的には以下の処理が行われる。CPU11は追書きページ(に相当する記憶デバイス20上領域)から、s501で選択されたデータの書き込み先仮想ページと同じ仮想ページに属するデータをキャッシュメモリ上に読み出す。この時、キャッシュメモリ上にデータが格納されている領域については、追書きページから読み出す必要はない。またデータをキャッシュメモリ上に読み出す際に、CPU11は圧縮回路16を用いてデータの伸長を行い、キャッシュメモリには伸長されたデータを格納する。
続いてCPU11はデステージ対象仮想ページへのページ割り当てを実施する。ここで割り当てられるページは上書きページであり、ここではs53と同じ処理が行われる。その後CPU11は割り当てた上書きページにデータをデステージし、処理を終了する。なお、s504のデステージと同時に、LBA管理テーブル120、追書きページ管理テーブル130の更新も行われる。具体的には、ホストLBA121が、デステージ対象仮想ページの範囲内の値であるレコードを、LBA管理テーブル120から削除する。また、追書きページ管理テーブル130内のレコードのうち、ホストLBA133の値がデステージ対象仮想ページの範囲内に含まれるレコードについて、ホストLBA133をnullに変更する。
s504の処理の概念について、図11を用いて説明する。図11は、追書きページから上書きページにデータを移動する処理の概念図である。図11(1)は、追書きページがマッピングされている仮想ページに対するホスト2からの更新データが、キャッシュメモリに所定量(CM上ページ更新量閾値302)以上蓄積されている状態を表している。仮想ページ上の領域A、B、C、Dのうち、領域B、C、Dに対してホスト2から書き込みがあり、ライトデータ(更新データ)がキャッシュメモリ上に蓄積されている(領域A、B、C、Dはそれぞれ、1つのセグメント、あるいは複数セグメントの集合である)。また図11(1)に記載の仮想ページには追書きページがマッピングされており、仮想ページ上の領域A、B、C、Dに対応付けられる圧縮セグメントはそれぞれ、圧縮セグメント(a)、(b)、(c)、(d)である。
仮想ページ、キャッシュメモリ上のデータ、追書きページが、図11(1)の状態にある場合、s504で行われるデータ移動の方法を表した図が、図11(2)である。CPU11は圧縮セグメント(a)を追書きページから読み出し、伸長した後、上書きページ(の領域(A))に書き込む(この時、伸長したデータを一旦キャッシュメモリ上に格納してもよい)。一方追書きページの圧縮セグメント(b)、(c)、(d)は、追書きページから読み出す必要はない。代わりに、キャッシュ上のデータ(B、C、Dのデータ)が上書きページにデステージされる。
s504ではこのように、更新データ量が多い仮想ページについて、追書きページから上書きページへのデータ移動が行われるので、データ圧縮処理のオーバヘッドを削減することができる。また記憶デバイス上の追書きページから読み出される圧縮データの量は最小限に抑えられるので、記憶デバイスからのデータ読み出し処理のオーバヘッド及び読み出したデータの伸長処理のオーバヘッドを削減することができる。
図10の説明に戻る。s503の判定において、データの量が所定値未満の場合(s503:No)、CPU11はデステージ対象データを圧縮し(s505)、圧縮データのサイズを更新用空き容量405と比較することで、デステージ対象データ(圧縮後)を格納可能な空き領域が存在するか判定する。デステージ対象データを格納可能な空き領域が存在しない場合(s506:Noのケース。これは言い換えれば、デステージ対象データを格納すると更新用確保可能量403を超過してしまう場合である)、CPU11はデステージ対象データの書き込み先仮想ページにマッピングされている追書きページのデータを伸長して上書きページに戻す(s509)。s509の処理はs504と同じである。つまり、キャッシュメモリ上にデステージ対象データが格納されている領域については追書きページから読み出す必要はない。
それからCPU11は、空き領域管理テーブル400の内容の更新を行い(s510)、処理を終了する。
なお、s501で処理対象のデータが複数選択され、かつそれぞれのデータの書き込み先仮想ページが異なる仮想ページであることもあり得る。その場合s509で追書きページからデータを上書きページに移動する際、CPU11は圧縮率の低いページを優先的に選択して、そのページのデータを上書きページに移動するとよい。圧縮率の高いページを優先的に追書きページ(圧縮ページ)に格納するほうが、記憶領域を節約できるからである。
図4(仮想ボリューム管理テーブル100)の例では、仮想ページ#(101)が4〜7の仮想ページ(VP#4〜VP#7)にマッピングされているページ(追書きページ)のデータが、上書きページへの移動対象データである(更新有無(105)が「有」だからである)。これらを圧縮率の低い順(割当量(111)が大きい順)に並べ替えると、VP#6、VP#5、VP#7、VP#4である。そのため、VP#6にマッピングされている追書きページを最優先で上書きページに戻し、その後、VP#5、VP#7、VP#4の順で、上書きページにデータを戻す処理を行うとよい。
デステージ対象データ(圧縮後)を格納可能な空き領域が存在する場合(s506:Yes)、CPU11は、デステージ対象データ(圧縮後)を追書きページに追記し(s507)、空き領域管理テーブル400の内容を更新し(s508)、処理を終了する。s507では追書きページへのデータ(圧縮セグメント)の追記が行われるので、CPU11は先に述べた要領で、LBA管理テーブル120と追書きページ管理テーブル130の更新も行う。
なお、上では、更新データ(デステージ対象データ)を圧縮してから追書きページに格納(追記)する例(図10のs505〜s508)を説明してきた。ただし別の実施形態として、ストレージ装置1は更新データを圧縮せずに追書きページに追記してもよい。その場合、s505の処理は不要で、圧縮処理のオーバヘッドを削減できる。
(6)上書きページの追書きページへの移動
続いて、上書きページの移動判定処理について図12を用いて説明する。ここでは、所定の条件(所定期間更新がないか?)を満たしている上書きページを特定し、その上書きページのデータを追書きページに移動する処理が行われる。この処理はCPU11が定期的に、たとえば1日に1回の頻度で実行する。
最初にCPU11は、仮想ボリューム管理テーブル100を検索することで、上書きページがマッピングされた仮想ページ(つまりページ配置(103)が「上書き」の仮想ページ)を1つ選択する(s1010)。以下、図12の説明において、s1010で選択された仮想ページのことを、「対象仮想ページ」と呼ぶ。続いてCPU11は、対象仮想ページの更新有無(105)が「無」か「有」か判定する(s1020)。
更新有無(105)が「有」の場合(s1020:No)、CPU11は対象仮想ページの連続更新無し期間(107)を0にする(s1120)。そしてCPU11は対象仮想ページの更新有無(105)を「無」に変更する(s1095)。その後CPU11は、全ての仮想ページに対して処理が行われている場合には(s1100:Yes)、処理を終了し、まだ処理が行われていない仮想ページが残っている場合には(s1100:No)、s1010から処理を繰り返す。
s1020の判定で、更新有無(105)が「無」の場合(s1020:Yes)、CPU11は対象仮想ページの連続更新無し期間(107)を更新する(s1030)。具体的には、たとえば図12の処理が24時間(1日)ごとに行われる場合には、対象仮想ページの連続更新無し期間(107)に“1”を加算する。
続いてCPU11は、対象仮想ページの連続更新無し期間(107)が圧縮許可閾値301以上か判定する。対象仮想ページの連続更新無し期間(107)が圧縮許可閾値301以上の場合(s1060:Yes)、CPU11は対象仮想ページにマッピングされている上書きページからデータを読み出して、圧縮回路16を用いて読み出されたデータを圧縮する。そしてCPU11は圧縮されたデータを追書きページに追記し、また先に述べた要領でLBA管理テーブル120と追書きページ管理テーブル130の更新も行う(s1080)。なお、追書きページに追記する前に、CPU11は追書きページ管理テーブル130と最終書き込み位置134を参照することで、圧縮データを追記するために必要な量の未使用追書きページがあるか判定する。未使用追書きページがない場合にはCPU11は、プール管理テーブル200で管理されているページの中から未使用ページ(use(205)が“0”のページ)を選択し、追書きページ管理テーブル130に、選択された未使用ページを登録する。
その後CPU11は、対象仮想ページの、ページ配置103を「追書き」に、ページ#(104)をnullに、割当量(111)をs1080で圧縮したデータのサイズ(圧縮後のサイズ)に変更する(s1090)。さらにs1090では、CPU11は空き領域管理テーブル400の内容を更新する。なお、これまで対象仮想ページにマッピングされていたページ(上書きページ)について、対象仮想ページへのマッピングが解除される。そのためCPU11は、プール管理テーブル200のレコードのうち、対象仮想ページにマッピングされていたページのuse(205)欄を“0”に更新する。
s1090の後(あるいは対象仮想ページの連続更新無し期間(107)が圧縮許可閾値301未満の場合(s1060:No)にはs1060の後)、CPU11はs1095、s1100を実行する。全ての仮想ページに対して処理が行われている場合には(s1100:Yes)、処理を終了し、まだ処理が行われていない仮想ページが残っている場合には(s1100:No)、s1010から処理を繰り返す。
(7)空き領域管理テーブルの更新
空き領域管理テーブル400の更新が行われる箇所、つまりs504、s508、s510、そしてs1080での処理内容について、図13を用いて説明する。図13は、ある仮想ページ(以下では、「仮想ページV」と呼ぶ)にマッピングされている上書きページのデータが追書きページに移動された時の、ページ(特に追書きページ)の状態変化を概念的に表している。図13(1)は、仮想ページVにマッピングされている上書きページを表している。
図13(1)の領域A、B、Cはそれぞれ、1または複数セグメントで構成されている。図13(2)は、図13(1)の上書きページのデータ移動先となる追書きページを表している。図13(2)の領域(a)、(b)、(c)にはそれぞれ、領域A、B、Cから移動されたデータ(圧縮後)が格納されている。
そして図13(3)は、図13(2)の領域(b)への更新が発生し(ホスト2から、領域(b)がマッピングされている仮想ページV上領域に対する更新データを受け付けた場合である)、更新データが領域(b’)に追記された場合の例を表している。この時、領域(b)は無効な領域(仮想ページにマッピングされていない領域)になる。図13(4)は、追書きページのデータ(領域(a)、(b’)、(c)内のデータ)が上書きページに移動された場合の例を表している。
以下、図13(1)〜(4)のようにページの状態が変化する時の、空き領域管理テーブル400の内容の変化について説明する。なお、以下の説明では、領域(a)、(b)、(b’)、(c)のサイズをそれぞれ、a、b、b’、cとし、空き領域確保割合401をpとする。また以下では説明を簡単にするため、仮想ページVにマッピングされたページのデータだけが、追書きページに格納されている場合の例を説明する。
まず、上書きページから追書きページにデータが移動される場合(ページの状態が図13の(1)から(2)の状態に遷移する時)について説明する。これは図12のs1080、s1090が実行される時である。CPU11はs1090で、空き領域管理テーブル400の追書きデータ量402に、“a+b+c”(上書きページから移動された1ページ分のデータの圧縮後のサイズである)を格納(加算)する。
また追書きデータ量402が変更されることに伴い更新用確保可能量403も更新される。更新用確保可能量403には、追書きページに移動されたデータ量(a+b+c)に、空き領域確保割合401(p)を乗じた値が格納(加算)される。その結果、更新用確保可能量403は、“(a+b+c)×p”になる。さらに更新用空き容量405は、更新後の更新用確保可能量403から、空き領域使用量404を減算した値(つまり“(a+b+c)×p”である)に更新される。
続いて、追書きページのデータが更新された場合(ページの状態が図13の(2)から(3)の状態に遷移する時)について説明する。これは図10のs507、s508が実行される時である。図13(3)の状態の時、領域(b)は無効になり、領域(b)に代わって領域(b’)が格納されている。この場合には、追書きデータ量402からは領域(b)のサイズが減算され、代わりに領域(b’)のサイズが加算される。これは、図13(3)の状態の時は、領域(a)、(b)、(c)が仮想ページVにマッピングされているのではなく、領域(a)、(b’)、(c)が仮想ページVにマッピングされているからである。そのためs508でCPU11は、追書きデータ量402の値を“a+c+b’”に更新する。
また、追書きページに更新データが追記された(領域(b’)にデータが追記された)ため、CPU11は空き領域使用量404に、“b’”を加算する。また追書きデータ量402が変更されることに伴い更新用確保可能量403も更新される。更新用確保可能量403には、追書きデータ量402(つまり“a+c+b’”)に空き領域確保割合401(p)を乗じた値が格納される。さらに更新用空き容量405は、更新後の更新用確保可能量403から、空き領域使用量404(b’)を減算した値(つまり“(a+c+b’)×p−b’”)に更新される。
次に、追書きページから上書きページにデータが移動される場合(ページの状態が図13の(3)から(4)の状態に遷移する時)について説明する。これは図10のs504またはs510が実行される時である。ここでは、領域(a)、(b’)、(c)のデータが上書きページに移動される。そのためs504またはs510では、CPU11は空き領域管理テーブル400の追書きデータ量402から、領域(a)、(b’)、(c)のサイズ(つまり“a+c+b’”)を減算し、そして更新用確保可能量403から、(a+c+b’)×pを減算する。また空き領域使用量404は変更されない。更新用空き容量405はその他のケースと同様、更新後の更新用確保可能量403から、空き領域使用量404を減算した値に更新される。図13(4)の場合のように、更新用空き容量405が負の値になることもある。
図13(4)の状態に遷移する場合、空き領域使用量404は変更(削減)されない(b’のままである)。領域(b’)には有効なデータは格納されていないが、追書きページへのデータ書き込みは追記書きしか許されていないため、領域(b’)に更新データを書き込めないためである。空き領域使用量404の削減される契機は、ガベージコレクションが行われる時である。ガベージコレクションが行われた後、CPU11は空き領域使用量404を0に変更し、併せて更新用空き容量405も変更する(更新用確保可能量403から空き領域使用量404を減算した値に変更する)。
またガベージコレクションで、未使用領域の回収とデータのパッキングのみが行われる場合、追書きデータ量402は変動しないため、追書きデータ量402、更新用確保可能量403の値は更新されない。ただしガベージコレクションで、追書きデータ量402の変動が発生する処理(たとえば圧縮率の低いデータを上書きページに移動する等の処理)が併せて行われる場合には、追書きデータ量402、更新用確保可能量403の値の更新も行われる。
本実施例に係るストレージ装置1は、ガベージコレクションを定期的に実行する。ただし、上で説明してきた処理の途中でガベージコレクションが実行されてもよい。たとえばCPU11は、図10のs506で、デステージ対象データを格納可能な空き領域が存在しないと判定されたことを契機にガベージコレクションを実行してもよい。
以上が、実施例1に係るストレージ装置の説明である。実施例1に係るストレージ装置では、所定条件に合致する仮想ページ(たとえば所定期間以上更新が発生しなかった仮想ページ)にマッピングされているページ(上書きページ)のデータを圧縮し、圧縮データを別のページ(追書きページ)へと移動する。これにより、ストレージ装置のアクセス性能を維持しつつ、記憶領域を節約することができる。
また実施例1に係るストレージ装置では、追書きページへデータが移動されると、追書きページに移動されるデータ量に基づいて、追書きページ内データに対する更新データを書き込む(追記する)ための空き領域の量を決定する。更新データ量が増加し空き領域がなくなった場合、追書きページのデータを伸長し、上書きページへと戻す。空き領域は更新データの書き込みに用いられ、上書きページ(非圧縮データを格納するページ)へのライトデータの格納には用いられない領域であるため、空き領域を多く確保するとストレージ装置の記憶効率が実質的に減少する。一方空き領域が少ない場合、追書きページのガベージコレクション時の効率(性能)が低下する。実施例1に係るストレージ装置のように空き領域のサイズを制御することで、記憶効率の維持とガベージコレクション性能の両立を図ることができる。
また実施例1に係るストレージ装置は、ホストからの仮想ページに対する書き込みデータを一旦キャッシュメモリに蓄積する。そして追書きページがマッピングされている(つまり圧縮データが格納されている)仮想ページに対する、キャッシュメモリ上の蓄積データ量が閾値(CM上ページ更新量閾値302)を超過する場合、データを追書きページから読み出して上書きページに移動する。その際、ホストからのライトデータがキャッシュメモリ上に蓄積されている領域については追書きページからの読み出しを行わない。そのため、追書きページから上書きページへのデータ移動効率が良い。
続いて実施例2に係るストレージ装置の説明を行う。実施例2に係るストレージ装置のハードウェア構成は実施例1で説明したものと同じである。
実施例1に係るストレージ装置では、ある仮想ページにマッピングされていた上書きページから追書きページにデータが移動された後、その追書きページ(のマッピングされた仮想ページ)に対して多量のライト(更新)が発生すると、追書きページのデータが上書きページへと戻される。たとえば1仮想ページに対してCM上ページ更新量閾値302以上のデータ書き込みが発生し、そのデータがキャッシュメモリに蓄積された場合、その仮想ページに追書きページがマッピングされていても、上書きページに戻される。
このような事象はたとえば、ホスト2から仮想ボリュームに対してシーケンシャルライト要求を受領した場合が考えられる。たとえばホスト2が仮想ボリュームをデータバックアップ先ボリュームとして使用する場合、ホスト2は仮想ボリュームに大量のデータをシーケンシャル書込みする。
ここで、たとえば圧縮許可閾値301が28日で、かつホスト2が1か月(30日)に1回の頻度で、仮想ボリュームをバックアップ先ボリュームに使用するケースを想定する。その場合、ホストが仮想ボリュームにデータを書き込んでから28日を経過すると、29日目には、その仮想ボリュームの仮想ページにマッピングされているページ(上書きページ)から、追書きページへのデータ移動が発生する。
しかしその翌日(30日目)には、ホスト2がバックアップのために、仮想ボリュームに大量のデータをシーケンシャル書込みするため、データは追書きページから上書きページへと移動される。そのためこのケースでは、30日のうち、データが圧縮されて格納されている期間は2日間のみに限定され、圧縮による記憶領域の節約の効果は殆ど得られない。且つこのケースでは、データ更新は30日のうち1日しか発生しないため、このケースで書き込まれるデータは圧縮状態で保存されることが望ましい。
実施例2に係るストレージ装置では、データアクセスパターンの学習を行い、上で説明したようなケースの場合に、データが圧縮されて保存される期間を長くする。またデータアクセスパターンの学習を行うことで、データ更新が発生する時(日)を事前予測し、その日の前にデータが上書きページに移動されるようにする。
図14は、実施例2に係るストレージ装置が管理する、仮想ボリューム管理テーブル100’の構成例である。仮想ボリューム管理テーブル100’は、仮想ページ#(101’)、ホストLBA(102’)、ページ配置(103’)、ページ#(104’)、更新有無(今回)(105’)、更新有無(前回)(106’)、連続更新無し期間(現在)(107’)、連続更新無し期間(退避)(108’)、連続更新無し期間(学習移動後)(109’)、学習移動フラグ(110’)、割当量(111’)のカラムを有する。
仮想ページ#(101’)、ホストLBA(102’)、ページ配置(103’)、ページ#(104’)、更新有無(今回)(105’)、連続更新無し期間(現在)(107’)、割当量(111’)に格納される情報の内容は、実施例1で説明した仮想ボリューム管理テーブル100の、仮想ページ#(101)、ホストLBA(102)、ページ配置(103)、ページ#(104)、更新有無(105)、連続更新無し期間(107)、割当量(111)と同じである。これ以外の情報については、後述する。
図15は、実施例2に係るストレージ装置が管理する、閾値テーブル300’の構成例である。閾値テーブル300’には、圧縮許可閾値301、CM上ページ更新量閾値302、学習移動閾値303が格納される。圧縮許可閾値301、CM上ページ更新量閾値302は、実施例1で説明したものと同じである。学習移動閾値303の内容については、上書きページの移動判定処理の説明の過程で述べる。
実施例2に係るストレージ装置では、上で述べた仮想ボリューム管理テーブル100’と閾値テーブル300’の内容が異なる他、上書きページの移動判定処理の内容が、実施例1で説明したもの(図12)と相違する。また、実施例2に係るストレージ装置では、学習結果に基づいて、追書きページのデータを上書きページに移動する処理が追加される。また、ライト処理の流れは基本的に実施例1で説明したもの(図9)と同様だが、ライト処理の最後にCPU11は、更新有無(105)に代えて更新有無(今回)(105’)に対して「有」を設定する点が異なる。その他の点については、実施例2に係るストレージ装置は実施例1に係るストレージ装置と同じである。たとえば実施例1で説明したデステージ処理(図10)は、実施例2に係るストレージ装置でも実施される。
以下では、実施例2に係るストレージ装置で行われる、上書きページの移動判定処理(以下、「移動判定処理」と呼ぶ)の流れを、図16、図17を用いて説明する。多くの処理は実施例1(図12)で説明したものと共通であるため、以下では、図12の処理と相違する点を中心に説明する。
図16のs1010、s1020、s1030は、実施例1(図12)で説明したものと同様である。ただし実施例2における移動判定処理では、s1020でCPU11は、s1010で選択された仮想ページ(以下、この仮想ページを「対象仮想ページ」と呼ぶ)の更新有無(今回)(105’)に基づいて判定を行う。以下ではまず、s1020の判定で、対象仮想ページの更新有無(今回)(105’)が「有」の場合(s1020:No)について説明する。
対象仮想ページの更新有無(今回)(105’)が「有」の場合、CPU11は対象仮想ページの連続更新無し期間(現在)(107’)の値を、連続更新無し期間(退避)(108’)に格納する(s1110)。その後CPU11は、対象仮想ページの連続更新無し期間(現在)(107’)と連続更新無し期間(学習移動後)(109’)とを0にする(s1120’)。そしてCPU11は、対象仮想ページの更新有無(今回)(105’)の値を、更新有無(前回)(106’)に退避した後、更新有無(今回)(105’)の値を「無」に変更する(s1095’)。この後、全ての仮想ページに対して処理が行われている場合には(s1100:Yes)、CPU11は処理を終了し、まだ処理が行われていない仮想ページが残っている場合には(s1100:No)、s1010から処理を繰り返す。
対象仮想ページの更新有無(今回)(105’)が「無」の場合(s1020:Yes)、CPU11はs1030を実行する。s1030の後、CPU11は対象仮想ページの学習移動フラグ110’がONか判定する。学習移動フラグ110’がONの場合(s1040:Yes)、CPU11は連続更新無し期間(学習移動後)(109’)を更新する(s1050)。たとえば移動判定処理(図16、図17の処理)が24時間(1日)ごとに行われる場合には、対象仮想ページの連続更新無し期間(学習移動後)(109’)に“1”を加算する。その後s1060の処理が行われる。学習移動フラグ110’がOFFの場合(s1040:No)、s1050の処理はスキップされる。
続いてCPU11は、対象仮想ページの連続更新無し期間(現在)(107’)が圧縮許可閾値301以上か判定する(s1060)。対象仮想ページの連続更新無し期間(現在)(107’)が圧縮許可閾値301以上の場合(s1060:Yes)、CPU11は学習移動フラグ110’がONか判定する(s1070)。学習移動フラグ110’がOFFの場合(s1070:No)、実施例1と同じくCPU11はs1080とs1090を実施する。そしてCPU11はs1095’を実施した後、全ての仮想ページに対して処理が行われている場合には(s1100:Yes)処理を終了し、まだ処理が行われていない仮想ページが残っている場合には(s1100:No)、s1010から処理を繰り返す。
学習移動フラグ110’がONの場合(s1070:Yes)、CPU11は連続更新無し期間(学習移動後)(109’)が、学習移動閾値303以上か判定する(s1072)。s1072の判定がYesの場合、CPU11は学習移動フラグ110’をOFFに変更し(s1074)、その後s1080以降の処理を行う。連続更新無し期間(学習移動後)(109’)が、学習移動閾値303以上か判定する(s1072)。s1072の判定がNoの場合、つまり連続更新無し期間(学習移動後)(109’)が、学習移動閾値303未満の場合、s1074、s1080、s1090の処理はスキップされる(つまり対象仮想ページのデータ移動は行われない)。
s1060の判定で、対象仮想ページの連続更新無し期間(現在)(107’)が圧縮許可閾値301未満の場合(s1060:No)、CPU11は更新有無(前回)(106’)が「有」か「無」かを判定する(s1062)。更新有無(前回)(106’)が「無」の場合(s1062:No)、CPU11はs1095’以降の処理を行う。
一方s1062の判定で、更新有無(前回)(106’)が「有」の場合(s1062:Yes)、CPU11は連続更新無し期間(退避)(108’)が、学習移動閾値303以上か判定する(s1064)。s1064の判定がYesの場合、CPU11は学習移動フラグ110’をOFFに変更し(s1066)、その後s1080以降の処理を行う。s1064の判定がNoの場合、CPU11はs1095’以降の処理を行う。
続いて、実施例2に係るストレージ装置で実施される、学習結果に基づいた、追書きページのデータの上書きページへの移動処理の流れを、図18を用いて説明する。この処理は定期的、たとえば1日に1回等の頻度で実行される。
最初にCPU11は仮想ボリューム管理テーブル100を検索することで、追書きページがマッピングされた仮想ページ(つまりページ配置(103)が「追書き」の仮想ページ)のうち、学習移動フラグ110’がONの仮想ページを1つ選択する(s1510)。以下、図18の説明において、s1510で選択された仮想ページのことを、「対象仮想ページ」と呼ぶ。そして対象仮想ページにマッピングされている追書きページのことを、「対象追書きページ」と呼ぶ。
続いてCPU11は、対象仮想ページの更新有無(今回)(105’)が「有」か「無」かを判定する(s1520)。対象仮想ページの更新有無(今回)(105’)が「無」の場合(s1520:Yes)、対象仮想ページの連続更新無し期間(現在)(107’)を更新する(s1530)。この処理はs1030と同じである。
s1550では、CPU11は対象仮想ページの連続更新無し期間(現在)(107’)が連続更新無し期間(退避)(108’)と同じか否か判定し(s1550)、同じ場合には対象仮想ページにマッピングされている追書きページのデータを伸長して上書きページに移動する(s1560)。s1560では、実施例1のs509とs510と同様の処理が行われる。その後CPU11は対象仮想ページの連続更新無し期間(学習移動後)(109’)を0にし(s1570)、また更新有無(前回)(106’)に退避した後、更新有無(今回)(105’)の値を「無」に変更する(s1575)。追書きページがマッピングされている全ての仮想ページについて、図18の処理が行われた場合には(s1580:Yes)、処理を終了する。まだ図18の処理が行われていない仮想ページがある場合には、再びCPU11はs1510から処理を繰り返す。
s1520の判定で、対象仮想ページの更新有無(今回)(105’)が「有」の場合(s1520:No)、CPU11は連続更新無し期間(現在)(107’)の内容を連続更新無し期間(退避)(108’)にコピー(退避)し(s1610)、連続更新無し期間(現在)(107’)と連続更新無し期間(学習移動後)(109’)の内容を0にし(s1620)、学習移動フラグ(110’)をOFFに設定する(s1630)。その後s1580の判定が行われる。
以上が、実施例2に係るストレージ装置の説明である。実施例2に係るストレージ装置は仮想ページの更新周期(更新パターン)を学習し、更新頻度の少ない仮想ページのデータが上書きページを占有することを抑制する。具体的にはストレージ装置は、(n+1)日に1回更新が発生する(n日間連続して更新がなく、(n+1)日目に更新が行われる)、という更新パターンの仮想ページを特定する。ここでnは、学習移動閾値303以上の値である。そのような仮想ページがあった場合、ストレージ装置はその仮想ページのデータを上書きページから追書きページに移動する(図17:s1062〜s1090の処理)。同時にストレージ装置はその仮想ページに対して更新の発生しなかった期間を記憶しておく(連続更新無期間(退避)108’に)。つまりストレージ装置は、その仮想ページの更新周期が(1+連続更新無期間(退避)108’)日であるという学習結果(推定結果)を記憶する。
追書きページにデータが移動された後、その追書きページがマッピングされた仮想ページに対して所定期間(連続更新無期間(退避)108’に記憶された期間)、更新がなかった場合、ストレージ装置は、まもなくその仮想ページに対する更新が発生すると判断し、更新が発生する前に、その仮想ページにマッピングされている追書きページのデータを上書きページへと移動する(図18:s1550〜s1570)。そのため、データ更新が発生する時のアクセス性能を向上させることができる。
また実施例1に係るストレージ装置の場合、先に述べたように、仮想ページの更新頻度が低い場合でも、データが圧縮されて格納される(追い書きページに格納される)期間が短くなる。実施例2に係るストレージ装置では、上書きページへと移動されたデータは、更新周期に変動がない限り、図17の処理(s1062〜s1090等の処理)が実行されることによって、圧縮許可閾値301が経過するのを待つことなく追書きページへと移される。そのため、データ更新のない期間はデータが圧縮状態で記憶デバイスに格納されるため、ストレージ装置の性能と記憶効率の両立を図ることができる。
以上、本発明の実施例を説明したが、これらは、本発明の説明のための例示であって、本発明の範囲をこれらの実施例にのみ限定する趣旨ではない。すなわち、本発明は、他の種々の形態でも実施する事が可能である。
上では、ストレージ装置が使用するいくつかの情報が、プール管理テーブル200等のテーブル構造で管理される例を説明したが、テーブル構造で情報を管理する態様に限定されるわけではない。ストレージ装置はテーブル以外のデータ構造、例えばリスト構造などを用いて、情報を管理してもよい。
また、上で説明した実施例では、追書きページに格納されるデータは圧縮データであったが、追書きページに格納されるデータは圧縮データに限定されなくともよい。たとえばストレージ装置が、暗号化等のデータ変換を行う機能を有し、かつそのデータ変換機能によってデータサイズが変動するようなデータ変換が行われる場合、変換後のデータを追書きページに格納し、追書きページから上書きページにデータを戻す時にはデータを逆変換するようにしてもよい。
また、追書きページに格納されるデータは、圧縮や暗号化等のデータ変換が施されているデータに限定されない。上書きページと追書きページに格納されるデータがいずれも、非圧縮データあるいはデータ変換等の行われていないデータでもよい。一例として記憶デバイスとして、ランダムライト性能が高くないがシーケンシャルライト性能は高い記憶デバイスがストレージ装置に用いられる場合を想定する。この場合、ストレージ装置が各仮想ページのアクセス特性(ライト頻度、シーケンシャル・ランダムライト比率等)を観測し、観測結果に基づいて、ランダムライト頻度の高い仮想ページのデータは追書きページに移動し、シーケンシャルライトされることが多い仮想ページには上書きページを割り当てるように制御すると、ランダムライトデータが追書きページに格納されることにより、記憶デバイスへのデータ書き込み時にシーケンシャルライトされる。そのため、アクセス性能の向上が見込める。
また別の例として、複数の異なる種類の記憶デバイスが搭載されるストレージ装置の場合にも、上の実施例で説明した制御方法は有効である。たとえば記憶デバイスとして、追記型の記憶デバイス(DVD−RWあるいはフラッシュメモリなどのように、上書き不可で、再書き込みには記憶領域の消去が必要な記憶媒体を用いた記憶デバイス)と、上書き可能な記憶デバイス(HDD等)の両方を搭載するストレージ装置の場合、ストレージ装置は、上書き可能な記憶デバイスの記憶領域を上書きページとして用い、追記型記憶デバイスの記憶領域を追書きページとして用いるように制御するとよい。そして、上の実施例のように、更新頻度の低いデータを追書きページに移動するように制御すると、追記型記憶デバイスで記憶媒体の消去頻度が低く抑えられ、ストレージ装置のアクセス効率向上が見込める。この場合も、追書きページに格納されるデータは、圧縮等のデータ変換が行われるデータであってもよいし、非圧縮データであってもよい。