本発明の実施形態を図面に基づいて説明する。尚、本発明は、以下に説明する実施形態に限定されるものではない。尚、半導体記録素子としてNAND型フラッシュメモリ(以下、FM)を例に説明するが、本発明はFMに限定されるものではなく、不揮発性のメモリの全てを対象とする。また、本実施例では、データの圧縮を専用のハードウェア回路で実施する形態について記述するが、本発明はこの形態に限定されるものではなく、汎用プロセッサによるデータ圧縮演算処理にてデータを圧縮するとしてもよい。また、本実施例では、パリティ(冗長データ)を専用のハードウェア回路で実施する形態について記述するが、本発明は、この実施例に限定されるものではなく、汎用プロセッサによるパリティ生成演算処理にてRAID Parityを生成するとしてよい。
まず本発明の概要について、図1を用いて説明する。本発明のストレージ装置1では、ホスト計算機3から書き込まれたデータを圧縮して最終記憶媒体であるSSD(Solid State Drive)11またはHDD(Hard Disk Drive)12に格納するが、圧縮後のデータサイズはデータ内容によって変動するため、データ格納位置を一意に定めることが難しい。そのため、ストレージ装置1は2種類の論理ボリュームを作成、管理する。第1の種類の論理ボリュームは、ホスト計算機3に提供される論理ボリュームで、当該論理ボリュームには非圧縮データが格納されているようにホスト計算機3から認識される。第2の種類の論理ボリュームは、ホスト計算機3から認識されない論理ボリュームで、当該論理ボリュームは、ストレージコントローラ10が圧縮データを最終記憶媒体(SSD11またはHDD12)に格納する際に用いる。以下、この第1の論理ボリュームのことを「伸長VOL」と呼び、第2の論理ボリュームのことを「圧縮VOL」と呼ぶ。
伸長VOL(図1の「伸長VOL5000」)は、ホスト計算機3に論理的(仮想的)な記憶領域を提供するだけのもので、伸長VOL上の各アドレスに対応する物理記憶領域(最終記憶媒体であるSSD11またはHDD12の記憶領域)は存在しない。一方圧縮VOL(図1の「圧縮VOL5500」)は、(圧縮VOL上の)各記憶領域が、最終記憶媒体であるSSD11またはHDD12の記憶領域と1:1に対応付けられたボリュームである。本発明のストレージ装置1は、複数(たとえば4台)の最終記憶媒体を1つのRAIDグループとして管理し、当該1つのRAIDグループの各記憶領域を圧縮VOLの各記憶領域に対応付けている。
ホスト計算機3から伸長VOLに対してデータのライト要求及びライトデータが送信されると、ライトデータはキャッシュメモリ26上に格納される。本発明のキャッシュメモリ26は圧縮機能を備えており、キャッシュメモリ26上にライトデータを格納する際に、圧縮された状態で格納する。またキャッシュメモリ26上の圧縮データを読み出す(出力する)際には、圧縮機能によりデータを伸長した状態で読み出すこともでき、ホスト計算機3に対して、データが圧縮されて格納される状態を見せない(認識させない)ようにしている。
本発明の目的は、データを圧縮した状態で最終記憶媒体に格納することであるため、キャッシュメモリ26に格納された圧縮データを、圧縮された状態のまま最終記憶媒体に書き込む。本発明のストレージ装置1では、更新データを更新前データの格納されていた領域と同一の領域には書き込まず、最終記憶媒体11(12)に追記書きする構成をとる。また圧縮データを格納、管理するために、伸長VOLとは別のボリューム(圧縮VOL5500)を用意し、伸長VOLに書き込まれたデータ(実体はキャッシュ26にのみ格納されている)を疑似的に圧縮VOL5500に移動する処理を行う。
伸長VOL上の領域と圧縮VOLとの領域との間には固定的な対応関係はなく、伸長VOLから圧縮VOLへデータを移動する際、圧縮VOL上のデータ格納位置は動的に決定される。一例として、伸長VOLにデータa、b、c、d、eがランダムに書き込まれた場合、ストレージ装置1は、伸長VOLに書き込まれたデータを圧縮VOL上の領域に移動する(対応付ける)処理を行うが、その際、最終記憶媒体へのデータ書き込みの前に行われるRAIDパリティ生成処理の際に更新前データを読み出す必要がないように、圧縮VOL上にデータa、b、c、d、eを、圧縮VOLの先頭から追記書きの要領で書き込まれるように、対応付けしていく。伸長VOL上に書き込まれた各データの、圧縮VOL上の記憶位置は、ボリューム間マッピングテーブル650で管理する。圧縮VOLにデータa、b、c、d、e(の圧縮データ)が対応付けられた後、このデータからRAID技術により、冗長データ(パリティ)が生成され、データ(圧縮データ)とパリティは、圧縮VOLを構成する最終記憶媒体へと書き込まれる。
データを圧縮せずに格納する一般的なストレージ装置では、ボリュームに対するデータ更新要求と更新データを受け取った時、当該更新データの更新前データの格納されている領域に当該更新データを上書きして格納する。しかし、圧縮データを最終記憶媒体に格納する構成の場合、更新データの圧縮の結果、当該更新データの圧縮データのサイズは、更新前データの圧縮データのサイズよりも大きくなることもある。そのため最終記憶媒体に対する上書き時の処理が複雑化し、処理性能が悪化する。
本発明の実施例におけるストレージ装置では、ホスト計算機等の上位装置に対しては、最終記憶媒体との直接の対応関係(マッピング)を持たない伸長VOLを提供して、上位装置には伸長VOLに対するアクセスを行わせる。そして伸長VOLに書き込まれたデータをキャッシュメモリでオンライン圧縮し、圧縮されたデータを、最終記憶媒体と直接対応付けられた圧縮VOLに追記書きの要領で格納することで、データ更新時の処理オーバヘッドが発生しないようにしている。また、非圧縮データの格納された伸長VOLの領域と、圧縮データの格納された圧縮VOLの領域とのマッピング情報を維持することにより、上位装置から伸長VOLに対するリード要求が来た時も、マッピング情報に基づいて、リード要求で指定された伸長VOL上の位置情報を、圧縮VOLの位置情報へと変換して、圧縮VOL(最終記憶媒体)から圧縮データを読み出し、そして圧縮データをキャッシュメモリで伸長して上位装置に転送することで、応答時間を短縮することを可能にしている。
図2は、本発明の実施例に係るストレージ装置(ストレージシステム)の構成を示す図である。
ストレージ装置1は1以上のストレージコントローラ10(以下、「コントローラ10」と略記することもある)を備えている。各コントローラ10は、ホスト計算機(上位装置)3と接続するためのホストインタフェース(図中では「Host I/F」と記載)24と、記録装置を接続するためのディスクインタフェース(図中では「Disk I/F」と記載)23を備えている。ホストインタフェース24は例えば、FC(Fibre Channel)、iSCSI(internet Small Computer System Interface)、FCoE(Fibre Channel over Ether)等のプロトコルに対応したデバイスが使用され、ディスクインタフェース107は例えば、FC、SAS(Serial Attached SCSI)、SATA(Serial Advanced Technology Attachment)、PCI(Peripheral Component Interconnect) −Express等の各種プロトコルに対応したデバイスが使用される。また、以降では、ホストインタフェース24のことを「ポート24」と呼ぶこともある。更に、ストレージコントローラ10はプロセッサ(図中では「MPU」と記載)21やDRAM25などのハードウェア資源を備え、プロセッサ21の制御の下、ホスト計算機3からのリード/ライト要求に応じて、SSD11やHDD12等の最終記憶媒体へのリード/ライト要求を行う。また、キャッシュメモリ26を内部にもち、キャッシュメモリ26は内部スイッチ(図では「内部SW」と記載)22を介してプロセッサ21から制御可能となっている。また、ストレージコントローラ10間でデータや制御情報を相互に通信するためのノードI/F27も備えている。
ストレージ装置1は管理装置4とネットワークを介して接続している。このネットワークの伝送媒体としては、例えばイーサネット(登録商標)などが用いられる。なお、図2では簡略化の為に省略したが、このネットワークはストレージ装置1内部の各ストレージコントローラ10に接続している。尚、このネットワークはSAN2と同じネットワークによって接続してもよい。
管理装置4は、プロセッサやメモリ、ネットワークインターフェース、ローカル入出力デバイス等のハードウェア資源と、管理プログラム等のソフトウェア資源を備えたコンピュータである。管理装置4では、管理プログラムが動作し、当該管理プログラムが実行されることによってストレージ装置1から情報を取得し、またシステム管理者の管理操作用のGUIを提供する。システム管理者は、この管理操作用のGUIを用いて、ストレージ装置1のボリュームの作成やストレージ装置1の監視等の操作を行う。
SSD11、HDD12はそれぞれ、ストレージ装置1内に複数(例えば16個)あり、同じくストレージ装置内に複数あるストレージコントローラ10とディスクインタフェース23を介して接続されている。SSD11、HDD12は、ストレージコントローラ10からのライト要求に応じて転送されるデータを格納し、リード要求に応じて格納済みのデータを取り出しストレージコントローラ10に転送する。尚、このときディスクインタフェース107は、データのリード/ライト位置を論理ブロックアドレス(Logical Block Address。以下、「LBA」と呼ぶ)によって指定する。また、ストレージ装置1は、複数のSSD11、HDD12を、所定台数(たとえば4台、8台、16台など)単位でRAIDグループとして管理し、RAIDグループ内の1台(あるいは2台)のディスクが故障した場合でも、データの復元が可能な構成としている。
ホスト計算機(上位装置)3は、プロセッサやメモリ、ネットワークインターフェース、ローカル入出力デバイス等のハードウェア資源を備え、デバイスドライバやオペレーティングシステム(OS)、アプリケーションプログラムなどのソフトウェア資源を備えている。これによりホスト計算機3は、プロセッサ制御の下、各種プログラムを実行することで、ストレージ装置108との通信及び、データのリード/ライト要求を行う。また、プロセッサ制御の下、各種プログラムを実行することで、ストレージ装置1の使用状況、動作状況等の管理情報を取得する。また、記録装置の管理単位や記録装置制御方法、データ圧縮設定等を指定し、変更を行うことができる。
次に図3を用いて、キャッシュメモリ26の内部構成について説明する。
本発明の実施例におけるキャッシュメモリ26は、フラッシュメモリ(Flash Memory)を記憶媒体として使用する。キャッシュメモリ26は内部に、FMコントローラ(FM CTL)410と複数(例えば32個)のFM420を備える。
FMコントローラ410は、その内部にプロセッサ415、RAM413、データ圧縮/伸長ユニット418、Parity生成ユニット419、データバッファ416、I/Oインタフェース(I/F)411、FMインタフェース417、及びデータ転送を相互に行うスイッチ414を備えている。
I/Oインタフェース411は、ストレージ装置1内のストレージコントローラ10が備える内部スイッチ22と接続し、スイッチ414を介してフラッシュコントローラ410の各部位と接続する。I/Oインタフェース411は、ストレージ装置1内のストレージコントローラ10が備えるプロセッサ21から、キャッシュメモリ26に対する各種コマンドを受け付ける、あるいはデータ転送を行うためのものである。
プロセッサ415は、スイッチ414を介してFMコントローラ410の各部位と接続し、RAM413に記録されたプログラム及び管理情報を基にFMコントローラ410全体を制御する。データバッファ416は、フラッシュコントローラ410でのデータ転送処理途中のデータを一時的に格納するために用いられる。
FMインタフェース(I/F)417は、複数バス(例えば16)によってFM420と接続する。各バスには複数(例えば2)のFM420が接続される。
データ圧縮/伸長ユニット418は、可逆圧縮のアルゴリズムを処理する機能を有する。データ圧縮/解凍ユニット418は、プロセッサ415からの指示に従って、I/Oインタフェース411から到来してFM420に書き込まれるデータを圧縮する、またはFM420からI/Oインタフェース411へ送出されるデータを伸長する。尚、データ圧縮/伸長ユニットは、論理回路として実装してもよいし、圧縮/伸長のプログラムをプロセッサで処理することで、同様の機能を実現してもよい。
Parity生成ユニット419は、RAID技術で必要とされる冗長データであるパリティの生成機能を有しており、具体的には、RAID5、6等で用いられるXOR演算、RAID6で用いられるリードソロモン符号またはEVENODD法により算出される対角パリティ(Diagonal Parity)の生成機能を有している。
以上説明した、スイッチ414、ディスクインタフェース411、プロセッサ415、データバッファ416、FMインタフェース417、データ圧縮/伸長ユニット418、Parity生成ユニット419は、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)として、一つの半導体素子内で構成してもよいし、複数の個別専用IC( Integrated Circuit)を相互に接続した構成であってもよい。
RAM413は具体的にはDRAMなどの揮発性メモリが挙げられる。RAM413は、キャッシュメモリ26内で用いられるFM420の管理情報、各DMAが用いる転送制御情報を含んだ転送リスト等を格納する。尚、データを格納するデータバッファ416の役割の一部または全てをRAM413に含ませて、RAM413をデータ格納に用いる構成としてもよい。
なお、本実施例では図3に示すように、フラッシュメモリ(Flash Memory)を搭載したキャッシュメモリ26について記述するが、キャッシュメモリ26に搭載する記憶媒体はフラッシュメモリに限定されるものではない。Phase Change RAMやResistance RAMであってもよい。また、FM420の一部または全部を揮発性のRAM(DRAM等)とする構成であってもよい。
続いて、本実施例におけるキャッシュメモリ26がストレージコントローラ10に対して提供する記憶空間について説明する。
本実施例におけるキャッシュメモリ26は、自身が接続されるストレージコントローラ10(のプロセッサ21)に対して、論理的な記憶空間を提供する。ここで、「記憶空間を提供する」とは、ストレージコントローラ10に対してアクセスさせる各記憶領域にアドレスが付けられており、キャッシュメモリ26が接続されるストレージコントローラ10のプロセッサ21が、当該アドレスを指定したアクセス要求(コマンド)を発行することにより、当該アドレスで特定された領域に格納されているデータの参照・更新が可能な状態にされていることを意味する。キャッシュメモリ26のプロセッサ415は、FM420により構成される物理記憶領域を、キャッシュメモリ26内部のみで用いる一次元のアドレス空間に一意に対応づけて管理する。以降、このキャッシュメモリ26内部のみで用いる物理領域指定用アドレス空間(物理アドレス空間)を、PBA(Physical Block Address)空間と呼び、PBA空間内の各物理記憶領域(セクタ。本発明の実施例では、1セクタは512バイトとする)の位置(アドレス)をPBA(Physical Block Address)と記す。
従来のSSD等の記憶装置は、記憶装置が接続される上位装置(ホスト計算機等)に対して一つの記憶空間を提供している。一方で本実施例のキャッシュメモリ26は、キャッシュメモリ26が接続されるストレージコントローラ10に2つの論理記憶空間を提供することを特徴とする。この2つの論理記憶空間とPBA空間の関係について図4を用いて説明する。
キャッシュメモリ26は、LBA0空間701とLBA1空間702という2つの論理記憶空間を提供する。なお、これ以降、LBA0空間701上の各記憶領域に付されたアドレスのことを「LBA0」または「LBA0アドレス」と呼び、LBA1空間702上の各記憶領域に付されたアドレスのことを「LBA1」または「LBA1アドレス」と呼ぶ。また、本発明の実施例では、LBA0空間701のサイズ及びLBA1空間702のサイズはいずれも、PBA空間のサイズ以下とするが、LBA0空間701のサイズがPBA空間のサイズよりも大きい場合でも、本発明は有効である。LBA0空間701は、物理記憶領域に記録された圧縮データを非圧縮データとして、ストレージコントローラ10のプロセッサ21にアクセスさせるための論理領域である。プロセッサ21が、LBA0空間701上のアドレス(LBA0)を指定してキャッシュメモリ26にライト要求を発行すると、キャッシュメモリ26は、ストレージコントローラ10からライトデータを取得し、データ圧縮/伸長ユニット418にて圧縮した後、キャッシュメモリ26が動的に選択したPBAにより指定されるFM420上の物理記憶領域にデータを記録し、LBA0とPBAの対応付けを行う。また、プロセッサ21がLBA0を指定してキャッシュメモリ26にリード要求を発行すると、キャッシュメモリ26は、LBA0に対応付けられたPBAが示すFM420の物理記憶領域からデータ(圧縮データ)を取得し、データ圧縮/伸長ユニット418にて伸長した後、この伸長したデータをリードデータとしてストレージコントローラ10に転送する。このLBA0とPBAとの間の変換は、RAM413上にLBA0とPBAの対応関係の管理情報を保持し、それを用いて実現する。
LBA1空間702は、FM420により構成される物理記憶領域に記録される圧縮データを圧縮データのまま(伸長せず)、ストレージコントローラ10にアクセスさせるための論理領域である。プロセッサ21が、LBA1を指定してキャッシュメモリ26にライト要求を発行すると、キャッシュメモリ26は、ストレージコントローラ10よりデータ(圧縮済みのライトデータ)を取得し、キャッシュメモリ26が動的に選択したPBAにより指定されるFMの記憶領域にデータを記録し、LBA1とPBAの対応付けを行う。また、プロセッサ21がLBA1を指定してリード要求を発行すると、キャッシュメモリ26は、LBA1に対応付けられたPBAが示すFM420の物理記憶領域よりデータ(圧縮データ)を取得し、ストレージコントローラ10にリードデータとして圧縮済みデータを転送する。尚、このLBA1とPBAとの間の変換も、RAM413上にLBA1とPBAの対応関係の管理情報を保持し、それを用いて実現する。
尚、図4に示すとおり、圧縮データ713が記録された物理記憶領域を示すPBA空間は、同時にLBA0空間の領域とLBA1空間の領域の両方に対応づけられることもある。例えば、圧縮データ713の伸長されたデータが伸長データ711として対応づけられ、圧縮データ713の非伸長のデータが圧縮データ712として対応づけられる。この対応づけは、ストレージコントローラ10からの指示で行われる。たとえばプロセッサ21が、LBA0(仮にLBA0が0x00000001000とする)を指定してキャッシュメモリ26にデータをライトすると、当該データはキャッシュメモリ26内のデータ圧縮/伸長ユニット418により圧縮され、圧縮されたデータがキャッシュメモリ26が動的に選択したPBA空間上(具体的には、FM420の複数のページ中の、いずれかの未書き込みページ)に配置され、またそのデータはLBA0空間のアドレス0x00000001000に対応付けられた状態で管理される。その後プロセッサ21が、0x00000001000に対応づけられたデータを、LBA1空間のアドレス(仮に0x80000000010とする)に対応付ける要求をキャッシュメモリ26に発行することで、このデータはLBA1空間にも対応づけられ、プロセッサ21がLBA1アドレス0x80000000010のデータをリードする要求(コマンド)をキャッシュメモリ26に対して発行すると、プロセッサ21は、自身がLBA0アドレス0x00000001000に対して書き込んだデータを、圧縮した状態で読み出すことが出来る。
なお、本実施例におけるキャッシュメモリ26では、ストレージコントローラ10のプロセッサ21からライト指示された非圧縮データを、4KB単位で圧縮する。たとえばプロセッサ21から、LBA0空間のアドレス(0x000_0000_0000)を開始アドレスとする8KBのデータ(非圧縮データ)のライト要求があった場合、(LBA0空間の)アドレス範囲0x000_0000_0000〜0x000_0000_0007の4KBのデータを単位として圧縮して圧縮データを生成し、続いてアドレス範囲0x000_0000_0008〜0x000_0000_000Fの4KBのデータを単位として圧縮して圧縮データを生成し、それぞれの圧縮データをFM420の物理記憶領域に書き込む。ただし、本発明はデータを4KB単位で圧縮する態様に限定されるものではなく、その他の単位でデータが圧縮される構成であっても本発明は有効である。
また、生成される圧縮データのサイズは、512バイト(1セクタ)の倍数のサイズに限定され、また非圧縮データのサイズを超えないサイズになるようにしている。つまり4KBのデータを圧縮した場合、最小サイズが512バイトで、最大サイズが4KBになる。
続いて、本発明が適用されるキャッシュメモリ26が用いるコマンドについて説明する。本実施例におけるキャッシュメモリ26は、ストレージコントローラ10のプロセッサ21からコマンドを受理すると、当該受理したコマンドの内容を解析して所定の処理を行い、処理完了後に応答(応答情報)をストレージコントローラ10に返答する。なお、コマンドには、キャッシュメモリ26が所定の処理を行うために必要となる情報の集合が含まれており、たとえばキャッシュメモリ26にデータの書き込みを指示するライトコマンドであれば、コマンド中には、そのコマンドがライトコマンドであることを示す情報及びライト処理の実行に必要となる情報(ライトデータの書き込み位置やデータ長など)を含んでいる。キャッシュメモリ26は複数種類のコマンドをサポートしているが、最初に各コマンドに共通の情報について説明する。
各コマンドには、共通の情報として、オペレーションコード(Opcode)とコマンドIDという情報が、先頭に含まれている。そしてコマンドIDの後に、各コマンドに固有の情報(パラメータ)が付加されて、1つのコマンドが形成される。たとえば図5は、本実施例におけるキャッシュメモリ26のライトコマンドのフォーマットと、そのライトコマンドに対する応答情報のフォーマットを示した図であるが、図5の要素(フィールド)1011がOpcode、要素1012がコマンドIDである。そして要素1013以降の各情報が、ライトコマンドに固有のパラメータである。また、各コマンドの処理完了後に返送される応答情報として、コマンドIDとステータス(Status)が、全応答情報に共通に含まれる情報であり、ステータスの後に各応答情報に固有の情報が付加されることもある。
オペレーションコード(Opcode)は、コマンドの種別をキャッシュメモリ26に通知するための情報であり、コマンドを取得したキャッシュメモリ26は、この情報を参照することにより、通知されたコマンドの種類を認識する。たとえばライトコマンドの場合、0x01というOpcodeで、リードコマンドの場合、0x02というOpcodeであると決められている。
コマンドIDは、コマンドの固有のIDを格納するフィールドであり、コマンドの応答情報には、どのコマンドに対する応答情報であるかを、ストレージコントローラ10に認識させるために、このフィールドに、指定されたIDが付与される。ストレージコントローラ10は、コマンド作成時にコマンドを一意に識別可能なIDを生成して、このコマンドIDのフィールドにこのIDを格納したコマンドを作成し、キャッシュメモリ26にコマンドを送信する。そして、キャッシュメモリ26では、受信したコマンドに対応した処理が完了すると、当該コマンドのコマンドIDを応答情報に含めてストレージコントローラ10に返送する。ストレージコントローラ10は、この応答情報を受領した際、応答情報に含まれるIDを取得することで、当該コマンドの完了を認識する。また、応答情報に含まれるステータス(図5の要素1022)は、コマンドの処理が正常に完了したか否かを表す情報が格納されるフィールドである。コマンドの処理が正常に完了しなかった(エラー)場合、ステータスには、例えばエラー原因等を識別できる番号が格納される。
(1)ライトコマンド
図5は、本実施例におけるキャッシュメモリ26のライトコマンドとそのライトコマンドに対する応答情報を示した図である。本実施例におけるキャッシュメモリ26のLBA0ライトコマンド2010は、コマンド情報として、オペレーションコード1011、コマンドID1012、LBA0/1開始アドレス1013、LBA0/1長1014、圧縮要否フラグ1015、ライトデータアドレス1016により構成される。尚、本実施例では、上記の情報から構成されるコマンドの例について記すが、上記以上の付加的な情報があってもよい。例えば、DIF(Data Integrity Field)等に関連する情報がコマンドに付与されていたとしてもよい。
LBA0/1開始アドレス1013は、ライト先の論理空間の先頭アドレスを指定するフィールドである。なお、本発明の実施例におけるLBA0空間はアドレス0x000_0000_0000から0x07F_FFFF_FFFFの範囲の空間であり、LBA1空間はアドレス0x800_0000_0000以降0xの空間と定められているので、キャッシュメモリ26は、ライトコマンドのLBA0/1開始アドレス1013に0x000_0000_0000から0x07F_FFFF_FFFFの範囲のアドレスが格納されていた場合、LBA0空間のアドレスが指定されたと認識し、0x800_0000_0000以降のアドレスが指定されていた場合、LBA1空間のアドレスが指定されたと認識する。ただLBA0空間とLBA1空間のいずれのアドレス空間に従うアドレスが指定されたかを認識する方法は、上で説明した方法以外の方法を採用することも可能である。たとえばOpcode1011の内容によってLBA0空間とLBA1空間を識別する方法などもありえる。
LBA0/1長1014は、LBA0/1開始アドレス1013から始まる記録先LBA0またはLBA1の範囲(長さ)を指定するフィールドで、セクタ数で表された長さが格納される。キャッシュメモリ26は、前述のLBA0/1開始アドレス1013とLBA0/1長1014で特定される範囲のLBA0/1領域に対して、ライトデータを格納したPBA領域を対応づける処理を行う。
圧縮要否フラグ1015は、このコマンドが指示するライト対象データの圧縮要否を指定するフィールドである。本実施例のストレージ装置1では、プロセッサ21が圧縮が不要であることを明示的に伝える場合、LBA1アドレスを指定したライトコマンドを発行するため、この圧縮要否フラグ1015は使用しない。ただしストレージコントローラ10がライトコマンドを作成する際、ホスト計算機3から到来するライト対象データにデータ圧縮によるサイズ削減効果が見込めない(例えば既に画像圧縮等で圧縮されたデータと認識している場合)ことが事前に分かっている場合、このフラグの値をONにする(「1」を格納する)ことで、キャッシュメモリ26に圧縮が不要であることを通知することを可能にする。このフラグがONの場合には、キャッシュメモリ26は圧縮を実行しないという機能を持つ。
ライトデータアドレス1017とライトデータ長1018はそれぞれ、このコマンドが指示するライト対象データの現在の格納先(本発明の実施例ではDRAM25のアドレス)の先頭アドレス、そしてデータの長さを格納するフィールドである。ライト対象データがDRAM25の連続領域に格納されている場合、ライトコマンド中には、ライトデータアドレス1017とライトデータ長1018の組は1つだけ格納されており、その時リスト数1016には「1」が格納される。一方、ライト対象データがDRAM25内の複数の領域に離散的に格納されている場合、ライトコマンド中にはライトデータアドレス1017とライトデータ長1018の組が複数格納され、リスト数1016には、ライトデータアドレス1017とライトデータ長1018の組が格納されている数が格納される。キャッシュメモリ26は、このフィールドに指示されたDRAM25上領域から、LBA0/1長(1014)に格納されているサイズの領域のデータを取得することでライトデータの取得を行う。尚、ライトコマンド中にライトデータアドレス1017とライトデータ長1018の組を複数格納するフォーマット以外に、別のコマンドフォーマットを採用してもよい。たとえば、複数のアドレス(ライトデータアドレス1017とライトデータ長1018の組)が格納されたリストのポインタ情報(リストが格納されているアドレス(たとえばDRAM25内のアドレス))をライトコマンドに格納し、キャッシュメモリ26が当該ポインタ情報を参照してライトデータアドレス1017とライトデータ長1018を取得する態様もあり得る。
ライト応答情報1020は、コマンドID1021、ステータス1022、圧縮データ長1023により構成される。コマンドID1021とステータス1022は、各コマンド共通の応答情報であるので説明を省略する。圧縮データ長1023は、ライトしたデータの圧縮後のデータ長を記録するフィールドである。ストレージコントローラ10は、このフィールドを取得することで、ライトしたデータの圧縮後のデータサイズを把握できる。また、本実施例では、ライト先(LBA0/1開始アドレス1013)がLBA1であるとき、圧縮済みのデータを記録することとなっている為、本フィールドは無効となる。
なお、ライトコマンドのLBA0/1開始アドレス1013、LBA0/1長1014で指定されるLBA0空間(またはLBA1空間)の領域には、PBAが対応付けられている場合もあれば、PBAが対応付けられていない場合もある。PBAが対応付けられていない場合は、キャッシュメモリ26は新たにPBAを対応付けて、そのあと当該PBAで指定される領域にデータを書き込む。PBAが対応付けられている場合、当該対応付けられていたPBAで指定される領域は未使用領域として管理し、新たなPBAを対応付け、そのあと当該PBAで指定される領域にデータを書き込む。これは、本発明の実施例におけるキャッシュメモリ26の記憶媒体がフラッシュメモリを採用しており、フラッシュメモリは原則上書きが不可能(上書きする場合、一旦データの書き込まれているブロックを消去する処理が必要)であるためである。そして未使用領域として管理する領域が一定数以上になった場合(あるいは書き込み可能なページが不足してきた場合)、キャッシュメモリ26ではいわゆるガーベッジコレクションを行って、未書き込みページを作成する。ただしこれらの処理は、周知のフラッシュメモリを用いた記憶デバイスで行われている処理と同様であるため、本実施例では詳細な説明は省略する。そして、重要な点は、本発明の実施例におけるストレージコントローラ10(プロセッサ21)は、キャッシュメモリ26内で記憶領域がPBAというアドレス空間で管理されていることは認識せず(認識不要である)、ライトコマンドのLBA0/1開始アドレス1013、LBA0/1長1014で指定されるLBA0空間(またはLBA1空間)の領域には、PBAが対応付けられている・いないにかかわらず、見かけ上LBA0またはLBA1を指定した上書きが可能ということである。
(2)リードコマンド
図6は、本実施例におけるキャッシュメモリ26がサポートする、リードコマンドとそのリードコマンドへの応答情報を示した図である。本実施例におけるキャッシュメモリ26のリードコマンド1610は、コマンド情報として、オペレーションコード1011、コマンドID1012、LBA0/1開始アドレス1613、LBA0/1長1614、伸長要否フラグ1615、リードデータアドレス1616により構成される。尚、本実施例では、上記の情報によるコマンドの例について記すが、上記以上の付加的な情報があってもよい。尚、コマンドID1012は先のLBA0ライトコマンドと同一の内容の為、説明は省略する。
オペレーションコード1011は、コマンドの種別をキャッシュメモリ26に通知するフィールドであり、コマンドを取得したキャッシュメモリ26は、このフィールドにより通知されたコマンドがリードコマンドであることを認知する。
LBA0/1開始アドレス1613は、リード先の論理空間の先頭アドレスを指定するフィールドである。LBA0/1長1614は、LBA0/1開始アドレス1613から始まる記録先LBA0またはLBA1の範囲を指定するフィールドである。キャッシュメモリ26は、前述のLBA0またはLBA1開始アドレス1613とLBA0/1長1614が示す範囲のLBA0空間またはLBA1空間の領域に対して対応付けられたPBAからデータを取得し、取得したデータを(必要に応じて伸長して)ストレージコントローラ10に転送することでリード処理を行う。
伸長要否フラグ1615は、このコマンドが指示するリード対象データの伸長要否を指定するフィールドである。ストレージ装置がリードコマンドを作成する際、このフラグを制御することで、キャッシュメモリ26に伸長が不要であることを通知する。尚、このフィールドは、リードコマンドに含まれていなくても良い。本実施例のキャッシュメモリ26の場合、LBA1を指定してリードする際、取得データの伸長を行わないため、伸長要否フラグ1615は必須ではない。ただし別の実施形態として、キャッシュメモリ26がLBA1を指定したリードコマンドを受信した時、伸長要否フラグ1615がOFF(0)の場合にはデータを伸長し、伸長要否フラグ1615がON(1)の場合にはデータを伸長せずにデータリードを行うようにしてもよい。
リードデータアドレス1616は、リード対象データの出力先領域の先頭アドレスが指定される(たとえばDRAM25内のアドレス)。リードされたデータはリードデータアドレス1616で指定されたアドレスの領域から、連続的にLBA0/1長1614で指定された長さのデータが格納されることになる。なお、ライトコマンドと同様に、リードデータアドレス1616とデータ長の組を複数、リードコマンドのパラメータとして指定できるようにし、離散的な領域にデータを出力することを可能とする態様もありえる。
リード応答1620は、その他のコマンドの応答情報と共通の情報(コマンドID1021、ステータス1022)のみを含むものであるため、説明は省略する。なお、共通の情報以外の付加的な情報がリード応答1620に含まれている構成でもよい。
(3)フルストライプParity生成コマンド
RAID技術におけるパリティの生成方法には大きく2通りある。1つは、パリティを生成するために必要なすべてのデータによって、XOR等のパリティデータの演算を行ってパリティ生成を行う方法で、この方法を本明細書では「フルストライプParity生成方法」と呼ぶ。もう一方は、RAID構成された記憶媒体群に対して更新データの書き込みが行われる場合、当該更新データに加えて、記憶媒体に格納されている更新前のデータ及び当該更新前のデータに対応する更新前パリティとのXOR演算等を行って、更新データに対応するパリティ(更新後パリティ)を生成する方法で、この方法を本明細書では「更新Parity生成方法」と呼ぶ。図7は、本実施例におけるキャッシュメモリ26がサポートする、フルストライプParity生成コマンドとフルストライプParity生成コマンドへの応答情報を示した図である。本実施例におけるキャッシュメモリ26のフルストライプParity生成コマンド1310は、コマンド情報として、オペレーションコード1011、コマンドID1012、LBA1長1313、ストライプ数1314、LBA0開始アドレス0〜X(1315〜1317)、LBA1開始アドレス(XOR Parity用)1318、LBA1開始アドレス(RAID 6 Parity用)1319により構成される。尚、本実施例では、上記の情報によるコマンドの例について記すが、上記以上の付加的な情報があってもよい。
キャッシュメモリ26は、Opcode1011フィールドの内容から、ストレージコントローラ10から受け取ったコマンドがフルストライプParity生成コマンドであることを認知する。また、生成すべきParityの種類は、RAIDレベルによって異なる。そのため、本実施例におけるキャッシュメモリ26では、Opcode1011の内容によって、生成されるパリティを変えるものとする。たとえばOpcodeに0x11,0x12,0x13のいずれかが指定された場合、いずれもフルストライプParity生成を行うが、Opcodeに0x11が指定された場合にはRAID4、5で用いられるパリティ(XORデータ)を1つ生成し、Opcodeに0x12が指定された場合にはRAID6(リードソロモンコード使用)で用いられる2つのパリティ(いわゆるPパリティとQパリティ)を生成し、Opcodeに0x13が指定された場合にはRAID6(いわゆるEVENODD方式、Row−Diagonalパリティ方式)で用いられる2つのパリティ(水平パリティ、対角パリティ)を生成する。
LBA1長1313は、生成するParityの長さあるいはParity生成元データの長さ(RAID Parityは、ParityとParity生成元データの長さは同一)を指定するフィールドである。ストライプ数1314は、パリティを生成のために使用するデータの個数を指定する。たとえば6つのデータに対してParityを生成する場合、ストライプ数1314には6が格納される。
LBA1開始アドレス1315〜1317は、Parity生成元のデータが対応づけられているLBA1の開始アドレスを指定するフィールドである。このフィールドの個数はストライプ数1314で指定された個数と一致している(一致していないコマンドが発行された場合、キャッシュメモリ26はエラーを返却する)。例えば、6つのデータに対して2つのParityを作成する構成(6D+2PのRAID6構成)では、6つのLBA1開始アドレスを指定する。
LBA1開始アドレスY1(XOR Parity用)1318は、生成するRAID Parity(XOR Parity)の格納先を指定するフィールドである。この開始アドレスからLBA1長1313に指定された範囲の領域に、生成されたParity(RAID5のパリティ、あるいはRAID6のPパリティ、水平パリティ)が格納される。
LBA1開始アドレス(RAID6用)1319は、生成するRAID6用のParityの格納先を指定するフィールドである。RAID6用のParityは先に述べたとおり、リードソロモン符号のQパリティ、EVENODD方式におけるDiagonal Parityである。本発明では、LBA1開始アドレス(RAID6用)1319からLBA1長1313に指定された範囲の領域に生成されたParityが格納される。もちろん、OpcodeにRAID5用のパリティ生成コマンドが指定された(たとえば0x11が指定された)場合には、LBA1開始アドレス(RAID6用)1319の指定は不要である。
本実施例のキャッシュメモリ26はフルストライプParity生成コマンドを受け付けると、前述のLBA1開始アドレス1315〜1317に指定された領域に対応付けられたPBAにより特定されるFM420上領域から複数の圧縮データを取得し、キャッシュメモリ26内部のParity生成ユニット419を使って、Parity(1つまたは2つ)を生成する。その後、生成したParityをFM420上領域に記録する。生成したParityの書き込みは、ライトコマンドにおけるデータ書き込みと同様、LBA1開始アドレス(XOR Parity用)1318及び/またはLBA1開始アドレス(RAID6 Parity用)1319で特定されるLBA1空間に対して動的にPBAを割り当てて、当該割り当てたPBAにより特定される領域にパリティの書き込みを行う。
フルストライプParity生成応答1320は、コマンドID1021、ステータス1022、により構成されるが、いずれも他のコマンドと共通の情報であるため、説明は省略する。
(4)更新Parity生成コマンド
本発明の実施例におけるキャッシュメモリ26が実行する更新Parity生成は、既にParityが作成されている最終記憶媒体(SSD11、HDD12)の領域に更新データを記録する際、更新データ、更新データにより更新される領域の更新前データ(旧データ)、旧データに対応する旧Parityの3つのデータが、キャッシュメモリ26のLBA1空間上にマッピングされているときに実行できる。本実施例のストレージコントローラ10は、あとで述べるように、原則としてParity生成はフルストライプParity生成方法によって行うため、更新Parity生成方法によるParity生成が行われる機会はないが、キャッシュメモリ26は更新Parity生成を行う機能も一応は備えている。更新Parity生成を行う際、RAID構成されている最終記憶媒体から旧データと旧Parityを読み出し、キャッシュメモリ26のLBA1空間に対して格納し、その後更新データ、更新データにより更新される領域の旧データ、旧データを保護している旧Parity、更新パリティのLBA1アドレスを指定した更新Parity生成コマンドを発行することで、更新Parity生成を行う。
図8は、本実施例におけるキャッシュメモリ26がサポートする、更新Parity生成コマンドと更新Parity生成コマンドへの応答情報を示した図である。更新Parityコマンド1410は、コマンド情報として、オペレーションコード1011、コマンドID1012、LBA1長1413、LBA1開始アドレス0(1414)、LBA1開始アドレス1(1415)、LBA1開始アドレス2(1416)、LBA1開始アドレス3(1417)、LBA1開始アドレス4(1418)、LBA1開始アドレス5(1419)により構成される。尚、本実施例では、上記の情報によるコマンドの例について記すが、上記以上の付加的な情報があってもよい。
オペレーションコード1011は、コマンドの種別をキャッシュメモリ26に通知するフィールドであり、コマンドを取得したキャッシュメモリ26は、このフィールドにより通知されたコマンドが更新Parity生成コマンドであることを認知する。またフルストライプParity生成コマンドと同様、Opcode1011の内容によって、生成されるパリティの種類が変わる。
LBA1長1413は、生成するParityの長さ(RAID Parityは、ParityとParity生成元データの長さは同一)を指定するフィールドである。LBA1開始アドレス0(1414)は、Parity更新のための新データがマッピングされているLBA1の領域の開始アドレスを示すフィールドである。ストレージコントローラ10はこのフィールドを用いて、LBA1開始アドレス0(1414)からLBA1長1413で特定される長さの領域のデータが新データであることをキャッシュメモリ26に通知する。LBA1開始アドレス1(1415)は、Parity更新のための旧データがマッピングされているLBA1の領域の開始アドレスを示すフィールドである。ストレージコントローラ10はこのフィールドを用いてLBA1開始アドレス1(1415)からLBA1長1413で特定される長さの領域のデータが旧データであることをキャッシュメモリ26に通知する。
LBA1開始アドレス2(1416)は、Parity更新のための更新前のXOR ParityがマッピングされているLBA1の領域の開始アドレスを示すフィールドである。ストレージ装置はこのフィールドを用いてLBA1開始アドレス2(1416)からLBA1長1413で特定される長さの領域のデータがXOR Parityであることをキャッシュメモリ26に通知する。LBA1開始アドレス3(1417)は、Parity更新のための更新前のRAID6用の ParityがマッピングされているLBA1の領域の開始アドレスを示すフィールドである。ストレージ装置1はこのフィールドを用いてLBA1開始アドレス3(1417)からLBA1長1413で特定される長さの領域のデータが更新前のRAID6用 Parityであることをキャッシュメモリ26に通知する。
LBA1開始アドレス4(1418)は、更新によって新たに作成するXOR Parityを対応付けるLBA1の領域の開始アドレスを示すフィールドである。ストレージ装置はこのフィールドを用いてLBA1開始アドレス4(1418)からLBA1長1413で特定される長さの領域に新たなXOR Parityをマッピングするようにキャッシュメモリ26に指示する。LBA1開始アドレス5(1419)は、更新によって新たに作成するRAID6用のParityを対応付けるLBA1の領域の開始アドレスを示すフィールドである。ストレージ装置はこのフィールドを用いてLBA1開始アドレス5(1419)からLBA1長1413で特定される長さの領域に新たなRAID6用のParityをマッピングするようにキャッシュメモリ26に指示する。なお、LBA1開始アドレス3(1417)、LBA1開始アドレス5(1419)は、RAID5用のパリティ生成の場合には指定不要で、プロセッサ21からキャッシュメモリ26に送信されてくるコマンドの当該フィールド中に格納されている値は無視される。
本実施例のキャッシュメモリ26が更新Parity生成コマンドを受け付けた時の処理は、フルストライプParity生成コマンドを受け付けた場合に行われる処理と同様である。前述のLBA1開始アドレス1414〜1417に指定された領域に対応付けられたPBAが示すFM420上記憶領域から複数の圧縮データを取得し、キャッシュメモリ26内部のParity生成ユニット419を使って、1または2つのParityを生成する。その後、生成したParityをLBA1開始アドレス4(1418)、LBA1開始アドレス5(1419)で特定される領域に記録する。
(5)LBA1マッピングコマンド
本実施例におけるキャッシュメモリ26では、LBA0の領域を指定してライトしたデータを、キャッシュメモリ26が圧縮してFM420に記録する。そしてその後、この圧縮データに対してRAID Parityを生成し、また圧縮データを圧縮状態のまま最終記憶媒体へ書き込むため、LBA0とは異なるLBA1にマッピングする。LBA1マッピングコマンドは、その時に用いられる。
図9は、本実施例におけるキャッシュメモリ26でサポートされる、LBA1マッピングコマンドと、そのLBA1マッピングコマンドに対する応答情報を模式的に示した図である。LBA1マッピングコマンド1210は、コマンド情報として、オペレーションコード1011、コマンドID1012、LBA0開始アドレス1213、LBA0長1214、LBA1開始アドレス1215、により構成される。尚、本実施例では、上記の情報によるコマンドの例について記すが、上記以上の付加的な情報があってもよい。
LBA0開始アドレス1213は、LBA1に圧縮データをマッピングする対象データのLBA0領域を指定する先頭アドレスを指定するフィールドである。LBA0長1214は、LBA1へのマッピング対象となるLBA0開始アドレス1213から始まるLBA0の範囲を指定するフィールドである。なお、LBA0開始アドレス1213とLBA0長1214は、8セクタ(4KB)の倍数に限定される。
LBA1開始アドレス1215は、マッピングするLBA1の開始アドレスを指定するフィールドである。ストレージコントローラ10のプロセッサ21は、予めマッピングするデータサイズを把握しており、このデータサイズがマッピング可能なLBA1の領域を確保し、この先頭アドレスをLBA1開始アドレス1215フィールドに格納して、当該コマンドをキャッシュメモリ26に発行する。
本実施例のキャッシュメモリ26は、前述のLBA0開始アドレス1213とLBA0長1214が示す範囲のLBA0領域に対応づけられている圧縮データを、LBA1開始アドレス1215から、圧縮データサイズ分の領域に渡ってマッピングを行う。これにより、この後プロセッサ21が当該コマンドによりマッピングしたLBA1アドレスを指定したリードコマンドをキャッシュメモリに発行すると、当該LBA1アドレスにマッピングされた圧縮データを読み出すことができる。
LBA1マッピング応答1220は、コマンドID1021、ステータス1022、により構成される。尚、本実施例では、上記の情報による応答情報の例について記すが、上記以上の付加的な情報があってもよい。
(6)LBA0マッピングコマンド
本実施例のストレージ装置1は、最終記憶媒体からデータ(圧縮データ)を読み出すと、LBA1の領域を指定したライトコマンドをキャッシュメモリ26に発行して、キャッシュメモリ26(のFM420)に圧縮データを格納する。また、FM420に記録された圧縮データは、ホスト計算機3からのリード要求等があった場合には、伸長した状態でホスト計算機3に送信される必要がある。LBA0マッピングコマンドはそのために用いられる。
図10は、本実施例におけるキャッシュメモリ26がサポートするLBA0マッピングコマンドと、当該LBA0マッピングコマンドへの応答情報を示した図である。本実施例におけるキャッシュメモリ26のLBA0マッピングコマンド1210は、コマンド情報として、オペレーションコード1011、コマンドID1012、LBA1開始アドレス1913、LBA1長1914、LBA0開始アドレス1915、により構成される。尚、本実施例では、上記の情報によるコマンドの例について記すが、上記以上の付加的な情報があってもよい。
LBA1開始アドレス1913は、マッピング対象となる圧縮データのLBA1空間上の範囲の先頭アドレスを指定するフィールドである。LBA1長1914は、LBA0へのマッピング対象となるLBA1開始アドレス1913から始まるLBA1の範囲を指定するフィールドである。
LBA0開始アドレス1915は、マッピングするLBA0の開始アドレスを指定するフィールドである。ストレージコントローラ10は、ストレージ装置1が管理する管理情報により、LBA1に記録した圧縮データの伸長後のデータサイズを知っており、LBA0マッピングコマンドの発行前に、このデータサイズがマッピング可能なLBA0の領域を確保し、LBA0マッピングコマンドの作成時には、この先頭アドレスをLBA0開始アドレス1915フィールドに格納する。また、LBA0開始アドレス1915に指定できるアドレスは、8セクタ(4KB)の倍数に限定される。
本実施例のキャッシュメモリ26は、ストレージコントローラ10からLBA0マッピングコマンドを受け付けると、前述のLBA1開始アドレス1913とLBA1長1914が示す範囲のLBA1領域に対応づけられている圧縮データをLBA0開始アドレス1915から、伸長後のデータサイズ分の領域に渡ってマッピングを行う。これにより、この後プロセッサ21が当該コマンドによりマッピングしたLBA0アドレスを指定したリードコマンドをキャッシュメモリに発行すると、当該LBA0アドレスにマッピングされた圧縮データを、伸長された状態で読み出すことができる。
LBA0マッピング応答1920は、その他のコマンドの応答情報と共通の情報(コマンドID1021、ステータス1022)のみを含むものであるため、説明は省略する。なお、共通の情報以外の付加的な情報がLBA0マッピング応答1920に含まれている構成でもよい。
(7)圧縮データサイズ取得コマンド
図11は、本実施例におけるキャッシュメモリ26がサポートする、圧縮データサイズ取得コマンドとその圧縮データサイズ取得コマンドへの応答情報を示した図である。本実施例におけるキャッシュメモリ26の圧縮データサイズ取得コマンド1110は、コマンド情報として、オペレーションコード1011、コマンドID1012、LBA0開始アドレス1113、LBA0長1114により構成される。尚、本実施例では、上記の情報によるコマンドの例について記すが、上記以上の付加的な情報があってもよい。尚、コマンドID1012は先のLBA0ライトコマンドと同一の内容の為、説明は省略する。
以下、圧縮データサイズ取得コマンドに固有の情報について説明する。
LBA0開始アドレス1113は、圧縮後のデータサイズ取得の対象となるLBA0領域の先頭アドレスを指定するフィールドである。LBA0長1114は、LBA0開始アドレス1113から始まるLBA0の範囲を指定するフィールドである。キャッシュメモリ26は、前述のLBA0開始アドレス1113とLBA0長1114が示す範囲のLBA0領域に対応づけられているデータのサイズ(圧縮時サイズ)を算出し、ストレージ装置に通知する。なお、LBA0開始アドレス1113に指定できるアドレスは、8セクタ(4KB)の倍数に限定される。同様にLBA0長1114に指定できる長さも8セクタ(4KB)の倍数に限定される。8セクタ境界と一致しないアドレス(たとえば0x000_0000_0001など)や長さが、LBA0開始アドレス1113またはLBA0長1114に指定された場合には、エラーが返却される。
圧縮データサイズ取得応答1120は、コマンドID1021、ステータス1022に加えて、圧縮データ長1123により構成される。尚、本実施例では、上記の情報による応答情報の例について記すが、上記以上の付加的な情報があってもよい。圧縮データ長1123は、圧縮データサイズ取得コマンドにて指示されたLBA0領域に対応づけられた圧縮データのサイズを格納するフィールドである。ストレージコントローラ10は、伸長VOLから圧縮VOLにデータの移し替えを行う際に、この圧縮データ長の値を取得する処理を行う。
(8)マッピング解除コマンド
本実施例では、ストレージコントローラ10は圧縮して記録したライトデータを圧縮した状態で取得する為、または圧縮データに対してParityを生成する為、データをLBA1にマッピングする。また、圧縮した情報を伸長して取得するために、LBA1を指定してキャッシュメモリ26に記録したデータをLBA0にマッピングする。こうしてマッピングした領域は、処理が終了し不要となった場合、マッピングを解除する。本実施例のストレージ装置は、マッピング解除コマンドを用いて、PBAに対応付けたLBA0またはLBA1の領域の対応付けを解除する。
図12は、本実施例におけるキャッシュメモリ26がサポートする、マッピング解除コマンドとそのマッピング解除コマンドへの応答情報を示した図である。本実施例におけるキャッシュメモリ26のマッピング解除コマンド1710は、コマンド情報として、オペレーションコード1011、コマンドID1012、LBA0/1開始アドレス1713、LBA0/1長1714、により構成される。尚、本実施例では、上記の情報によるコマンドの例について記すが、上記以上の付加的な情報があってもよい。以下、マッピング解除コマンドに固有のパラメータの内容と、マッピング解除コマンドをキャッシュメモリ26が受け付けた時に行われる処理について説明する。
LBA0/1開始アドレス1713は、マッピングを解除する論理空間の先頭アドレスを指定するフィールドで、LBA0空間、LBA1空間の両方のアドレス空間のアドレスが指定可能である。ただし、LBA0空間のアドレスが指定される場合には、そのアドレスは4KB(8セクタ)境界のアドレスでなければならず、4KB(8セクタ)境界でないアドレスが指定された場合、キャッシュメモリ26はエラーを返す。LBA0/1長1714は、LBA0/1開始アドレス1713から始まる記録先LBA0またはLBA1の範囲を指定するフィールドである。
次に、本発明の実施例に係るキャッシュ管理データ構造について説明するが、その前に、本発明のストレージ装置1が管理するボリューム、及びボリューム(論理ボリューム)とキャッシュ管理データとの関係について、概要を説明する。
本発明のストレージ装置1では、ホスト計算機3から書き込まれたデータは、最終記憶媒体であるSSD11またはHDD12に格納されるが、最終記憶媒体であるSSD11またはHDD12の記憶空間は、直接ホスト計算機3には提供されない。ホスト計算機3には、論理的な記憶空間を持つ論理ボリュームが提供される。また、ホスト計算機3から書き込まれたデータは、圧縮された状態で最終記憶媒体に格納されるが、データが圧縮された状態で格納されることも、ホスト計算機3には認識させず、ホスト計算機3には、(ホスト計算機3から認識可能な)論理ボリュームには非圧縮のデータが格納されているようにしか認識されない。このような状態を実現するために、冒頭で述べたように、ストレージ装置1は2種類の論理ボリュームを作成、管理する。第1の種類の論理ボリュームは、先に述べたとおりホスト計算機3に提供される論理ボリュームで、非圧縮データが格納されているようにホスト計算機3から認識される伸長VOLである。第2の種類の論理ボリュームは圧縮VOLである。
ストレージ装置1は、ホスト計算機3に伸長VOLを提供するために、図13に示すような伸長VOL管理テーブル500を維持管理する。ストレージ装置1は複数の伸長VOLをホスト計算機3に提供可能で、各伸長VOLには一意な識別番号(論理ボリューム番号)を付して管理する。VVOL#503は伸長VOLに付された識別番号を示す。サイズ504は当該伸長VOLの容量を表す。また、ホスト計算機3では各伸長VOLを識別する場合、論理ボリューム番号は用いられず、ホストインタフェース(ポート)24の識別子(たとえばホストインタフェース24がFCインタフェースの場合には、FCのWWN(World Wide Name)である)と、論理ユニット番号(LUN)とを用いるので、論理ボリューム番号と、(ポートの識別子、LUN)の組の対応付けを管理する必要がある。ポート#501とLUN502には、ホスト計算機3が各伸長VOLを識別するためのポート識別子(WWN)とLUNが格納され、VVOL#503と対応付けられる。ストレージ装置1の管理者は、ボリューム(伸長VOL)を新規作成する際、管理装置4のGUIを用いて、新規に作成すべき伸長VOLのポート#とLUN、そしてサイズを指定する。ストレージ装置1はこの指定を受けると、伸長VOL管理テーブル500内に新規のエントリを作成し、新規作成したエントリのポート#501、LUN502、サイズ504の欄に、管理者から指定された情報を格納する。同時に未使用のVVOL#503を自動生成し、VVOL#503の欄に格納することで、伸長VOLの作成(定義)が行われる。
続いて圧縮VOLについて説明する。先に説明した伸長VOLは、ホスト計算機3に論理的(仮想的)な記憶領域を提供するためのもので、定義された時点では伸長VOLの各アドレスに対応する物理記憶領域(最終記憶媒体であるSSD11またはHDD12の記憶領域)は存在しない。一方圧縮VOLは、定義された時点で、(圧縮VOL上の)各記憶領域が、最終記憶媒体であるSSD11またはHDD12の記憶領域と1:1に対応付けられたボリュームである。本発明のストレージ装置1は、複数(たとえば4台)の最終記憶媒体を1つのRAIDグループとして管理し、RAIDグループ内の1つまたは2つの最終記憶媒体に障害が発生した場合でもデータ復旧を可能にしているが、本発明のストレージ装置1では、1つのRAIDグループを1つの圧縮VOLとして管理する。
図14は、ストレージ装置1が管理する圧縮VOL管理テーブル550を示す。LDEV#551が、ストレージ装置1内で定義されている圧縮VOLの識別番号であり、PDEV#552、RAIDレベル553、サイズ554はそれぞれ、圧縮VOLを構成している最終記憶媒体(SSD11またはHDD12)の識別番号、PDEV#552で特定される最終記憶媒体により構成されるRAIDグループのRAIDレベル、圧縮VOLの容量(RAIDパリティにより消費される領域の容量は除く)を表している。なお、本発明の実施例では、1つの圧縮VOLは1つのRAIDグループに対応するため、圧縮VOLの容量はRAIDグループを構成する全最終記憶媒体の合計容量からパリティデータの記憶容量を除いた容量である。なお、本発明は1つのRAIDグループと1つの圧縮VOLとを1:1に対応付ける構成には限定されない。1つのRAIDグループを分割して、分割されたRAIDグループの各領域をそれぞれ1つの圧縮VOLに対応付ける、あるいは、複数のRAIDグループを1つの圧縮VOLに対応させる構成をとっても良い。ストレージ装置1の管理者は、ボリューム(圧縮VOL)を新規作成する際、管理装置4が提供するGUIを用いて、新規に作成すべき圧縮VOL(RAIDグループ)を構成するための最終記憶媒体(の識別番号)、RAIDレベルを指定する。ストレージ装置1はこの指定を受けると、圧縮VOL管理テーブル550内に新規のエントリを作成し、新規作成したエントリのPDEV#552、RAIDレベル553の欄に、管理者から指定された情報を格納する。同時に未使用の圧縮VOL用識別番号を自動生成してLDEV#551の欄に格納し、RAIDグループのサイズを算出して、サイズ(Size)554の欄に格納することで、圧縮VOLの作成(定義)が行われる。
続いて伸長VOLと圧縮VOLとの関係について、図15を用いて説明する。ホスト計算機3から伸長VOL5000をライト対象ボリュームとして指定したライト要求、及び当該ライト要求におけるライト対象データ(ライトデータ)が送信されると、ライトデータはキャッシュメモリ26(図15では非図示)上に圧縮された状態で格納される。以下、この状態のことを、「データ(ライトデータ)が伸長VOLに書き込まれた」状態と呼ぶ。ただしホスト計算機3からは、データが圧縮された状態は見えない(認識されない)。
本発明の実施例におけるストレージ装置1では、伸長VOL5000に対して書き込まれたライトデータを最終記憶媒体(SSD11、HDD12)に格納するために、伸長VOL5000から圧縮VOL5500へと移し替える(移動する)。ここでの「移動」処理の詳細は後述するが、「移動」とはデータを物理的に移動・複製する処理ではなく、伸長VOL5000上のデータの書き込まれた記憶領域のアドレスと、圧縮VOL5500上の記憶領域のアドレスとの対応付けを行う処理のことを意味する。また、伸長VOL5000上の、データの書き込まれたアドレスと、当該アドレスが対応付けられる圧縮VOL5500上のアドレスの対応関係は、固定的なものではなく、伸長VOLにデータが書き込まれる毎に変動する。
伸長VOL5000上に書き込まれたデータを圧縮VOL上に対応付ける方法について概要を説明する。伸長VOL5000にデータa、b、c、d、eがランダムに(不連続な領域に)書き込まれた状態で、かつ圧縮VOL5500にはまだ何もデータが対応付けられてない状態である場合を想定する。伸長VOL5000に対してデータが所定量書き込まれた後、ストレージコントローラ10は、データを圧縮VOL5500に移動する処理、つまりデータa、b、c、d、eの書き込まれた伸長VOL5000上の領域を圧縮VOL5500上の領域に対応付ける処理を行うが、その際、最終記憶媒体(SSD11、HDD12)へのデータ書き込み処理のオーバヘッドを小さくするため、データa、b、c、d、eを、圧縮VOL5500の先頭から連続的に格納されるように対応付けしていく(図15参照)。
また、圧縮VOL上のデータを上書きすることはしない。たとえば図15に示すように、データa、b、c、d、eが圧縮VOLに移動された(対応付けられた)後、ホスト計算機3からデータaの格納されている伸長VOL5000上の領域に対して、データ内容をa’に更新するライト要求が到来すると、伸長VOL上ではデータaの書き込まれていた領域のデータ内容は、a’に更新されるが、この更新データa’は、圧縮VOL上のデータa(の圧縮データ)の書き込まれている領域とは別の領域(たとえばデータeの格納されている領域の直後)に追記書き込みの要領で書き込まれる。
圧縮VOLにデータa、b、c、d、e(の圧縮データ)が対応付けられた後、このデータからRAID技術により、冗長データ(パリティ)が生成され、データ(圧縮データ)とパリティとは圧縮VOLを構成する最終記憶媒体(SSD11、HDD12)へと書き込まれる。以下、データ(又はパリティ)を最終記憶媒体(SSD11、HDD12)へと書き込む処理を「デステージ」と呼ぶ。
なお、先に述べたとおり、伸長VOLのデータを圧縮VOLに移動する処理では最終記憶媒体(SSD11、HDD12)へのデータ書き込み処理のオーバヘッドが小さくなるように、圧縮VOL上にデータを配置するが、その配置方法について具体的に説明する。図16は圧縮VOL5500と圧縮VOLに対応する最終記憶媒体(SSD11、HDD12)との対応関係を示す概念図である。ここでは説明の簡単化のため、RAIDグループが4台の最終記憶媒体で構成され、そのRAIDレベルが4の場合について説明するが、その他のRAIDレベルであっても同様である。
図中の要素5501は、一例として16KB(32セクタ)の大きさの領域で、本発明の実施例では「スロット」と呼ばれる。またスロット5501中に、「0(D)」と記載されているスロット5501は、データが格納されているスロット(以下、データスロットと呼ぶ)を表し、「3(P)」と表記されているスロット5501は、パリティ(つまり0(D)、1(D)、2(D)の排他的論理和)が格納されているスロット(以下、パリティスロットと呼ぶ)を表している。ストレージコントローラ10が伸長VOL5000に書き込まれたデータを圧縮VOL5500に移動する際には、データスロットに圧縮データを移動するとともにパリティスロットを確保する処理を行う。なお、以下では、1つのパリティスロット分のパリティを生成するために必要となるデータスロットの集合(たとえばパリティスロット「3(P)」を生成するために必要なデータスロットは「0(D)」、「1(D)」、「2(D)」である)のことを、「ストライプグループ」と呼ぶ。
ストレージ装置1が複数のライトデータからパリティを生成する場合、パリティを生成するために必要なデータがストレージコントローラ10上のキャッシュメモリ26にない場合には、最終記憶媒体(SSD11、HDD12)からデータを読み出してくる必要がある。たとえば図16で、スロット0(D)のデータが更新されたとすると、スロット0(D)に対応するパリティ3(P)を生成するためには、最終記憶媒体(SSD11、HDD12)から、更新前のデータ0(D)とパリティ3(P)(あるいはデータ1(D)とデータ2(D))を読み出してくる必要がある(データ書き込み時のオーバヘッドが大きくなる)。しかしデータ0(D)、1(D)、2(D)がすべてキャッシュメモリ26上に存在する場合、キャッシュメモリ26上に格納されているデータ0(D)、1(D)、2(D)の排他的論理和を計算すればよいだけであるから、最終記憶媒体(SSD11、HDD12)からデータを読み出すオーバヘッドは発生しない。
そのため、本発明のストレージ装置1では、最終記憶媒体から更新前データや更新前パリティを読み出す必要がないように、伸長VOL5000に、1ストライプグループに相当する量のデータ(図16の例では、データ0(D)、1(D)、2(D)の合計サイズ、つまり48KB分のデータ)が書き込まれた後に、データを伸長VOL5000から圧縮VOL5500に移動する処理を行う。そしてデータを圧縮VOL5500に移動する(対応付ける)際には、ストライプグループの先頭(図16の例では、データ0(D)あるいは4(D)の位置)から順にデータを対応付けていき、ストライプグループの最後尾(図16の例では、データ3(D)あるいは6(D)の位置)まで、データの対応付けが完了した時点で、圧縮VOLへのデータ移動を終了し、パリティ(3(P)または7(P))の生成を行う。そして伸長VOLに1ストライプグループに相当する量(48KB)のデータが書き込まれたら、再び伸長VOLから圧縮VOLへのデータ移動を行う。もちろん1ストライプグループに相当する量(48KB)のデータが伸長VOLに書き込まれるたびに、伸長VOLから圧縮VOLへのデータ移動を行う必要はなく、複数ストライプグループに相当する量(96KB、480KBなど)のデータが書き込まれるまで待ってから伸長VOLから圧縮VOLへのデータ移動を行うようにしてもよい。
図17はボリュームマッピングテーブル600、図18はアドレスマッピングテーブル650の内容を示している。本発明の実施例では、伸長VOLと圧縮VOLは1:1の関係にあり、1つの伸長VOLに書き込まれたデータの移動先は、あらかじめ定められた1つの圧縮VOLにのみに限定されている。、ボリュームマッピングテーブル600は、VVOL#601で特定される伸長VOLの領域は、LDEV#602で特定される圧縮VOLの領域に対応付けられることを表している。ボリュームマッピングテーブル600の内容は、ストレージ装置1の管理者が管理装置4を用いて、伸長VOLの識別番号(VVOL#)に対応付けられる圧縮VOLの識別番号(LDEV#)を指定することで、ストレージ装置1によってボリュームマッピングテーブル600のVVOL#601、LDEV#602の欄に指定された識別番号が格納される。これによって、伸長VOLと圧縮VOLの対応関係が設定される。またボリュームマッピングテーブル600内の最終書き込み位置603の欄は、伸長VOLから圧縮VOLにデータが移動(対応づけ)された時、最後に移動されたデータの圧縮VOL上の位置(圧縮VOL上のLBA)を格納するための欄である。ストレージ装置1は、伸長VOLから圧縮VOLへデータを移動するときに、最終書き込み位置603の欄に格納されている圧縮VOL上のLBAの次のLBAからデータを格納する(つまりデータの追記書きを実現する)ために、この情報を保持している。
図18のアドレスマッピングテーブル650は、VVOL#651、LBA652で特定される伸長VOL上の領域が、LDEV#653、LBA654で特定される圧縮VOL上の領域(セクタ)に対応付けられるものであることを管理するテーブルである。このテーブルは、ストレージコントローラ10が伸長VOL上に書き込まれたデータを圧縮VOLに対応付ける際に更新する。アドレスマッピングテーブル650の各行(エントリ)は、伸長VOLの8セクタ(1セクタは、ホスト計算機3から伸長VOLにアクセスする際の、記憶領域の最小アクセス単位で、通常512バイト)分の領域が圧縮VOLのどのセクタに対応付けるかを表している。また、アドレスマッピングテーブル650の各行(エントリ)に対応付けられる圧縮VOLのディスク領域の数(セクタ数)は、データの圧縮状態によって異なるが、最小で1セクタ、最大で8セクタの領域が対応付けられる。
アドレスマッピングテーブル650を維持管理することにより、ストレージコントローラ10はホスト計算機3から伸長VOLに対するリード要求を受け付けた場合、アドレスマッピングテーブル650を参照して、リード要求で指定された伸長VOL上の領域(アドレス)を圧縮VOL上のアドレスへと変換し、圧縮VOLを構成する最終記憶媒体(SSD11、HDD12)から、リード要求で指定された伸長VOL上のアクセス対象データを読み出し、キャッシュメモリ26で伸長し、伸長したデータをホスト計算機3に返却することで、リード処理を実現できる。この処理の詳細は後述する。
なお、伸長VOLと圧縮VOLは、必ずしも同一サイズでなくてもよい。ストレージ装置1では、データは圧縮された状態で圧縮VOLに格納されるため、圧縮VOLのサイズを伸長VOLよりも小さいサイズとして定義しても、本発明は実施可能である。
続いてキャッシュメモリ26の管理方法について説明する。図19は、本発明の実施例におけるボリューム、スロット、キャッシュセグメントの関係を示す概念図である。なお、先に述べたとおり、本発明のストレージ装置1では、伸長VOLと圧縮VOLの2種類のボリュームを管理するが、伸長VOLと圧縮VOLはいずれもよく似たデータ構造を用いて管理される。そのため以下では、まず伸長VOLのデータをキャッシュメモリ26にキャッシュする場合に用いられるキャッシュ管理データのデータ構造について中心に説明する。
本発明の実施例では、ボリュームへの最小アクセス単位はセクタ(たとえば512バイト)であり、ボリュームの各セクタには、論理ブロックアドレス(LBA。あるいは本明細書では、論理アドレスと呼ぶこともある)が付与されている(図19の要素2010はLBAを表している)。また、本発明の実施例におけるストレージ装置1では、ボリューム上の記憶領域へのアクセス時等に排他制御を行うが、ストレージ装置1では、スロット2100という領域ごとに排他制御を行う。スロット2100のサイズは、本発明の実施例では、16KB(つまり32セクタ)としているが、その他のサイズを採用しても良い。ボリューム内の各スロット2100には先頭から一意な識別番号が付与されており、それをスロットIDと呼ぶ。ボリューム内の先頭のスロット2100のスロットIDを0番として、以降のスロットには順に、1番、2番、…のスロットIDが付与されている。なお、図19において、要素2110がスロットIDであり、論理ブロックアドレス2010とスロットID2110との関係は図19に示されたとおりである。例えばホスト計算機3から受信したI/Oコマンドで指定されている論理ブロックアドレスをスロットIDに変換する時には、指定された論理ブロックアドレスを32(1スロットを構成するセクタ数)で除算して得られた値がスロットIDになる。またこの除算を行った時に剰余が0の場合には、I/Oコマンドで指定されている論理ブロックアドレスは、(スロットIDで特定される)スロットの先頭に位置することが分かり、剰余が0でない値(仮に、この値をRとする)の場合、この剰余Rは、論理ブロックアドレスで特定されるブロックが、(スロットIDで特定される)スロットの先頭ブロックから(R+1)番目の位置に存在するブロックであることを表す情報となる(以下、この情報Rのことを、スロット内相対アドレスと呼ぶ)。
またボリューム上のデータをキャッシュメモリ26に格納する場合、ストレージコントローラ10のプロセッサ21はキャッシュメモリ26上の未使用記憶領域の中から所定サイズの領域をキャッシュ領域として確保するが、キャッシュセグメント(またはセグメントと呼ぶ)という領域単位でキャッシュ領域を確保する(図19中の要素2201、2202、2203、2204がキャッシュセグメントである。以下、キャッシュセグメント2201、2202、2203、2204を総称する場合、「キャッシュセグメント2200」と表記する)。本発明の実施例においては、伸長VOLに対して書き込まれたデータをキャッシュメモリ26上で管理する際に用いられるキャッシュセグメント2200のサイズは8セクタ、つまり4KB(ただし非圧縮時のサイズである)で、各スロットに対して4つのキャッシュセグメント2201、2202、2203、2204が対応付けられる。図19は、キャッシュメモリ26上の領域(キャッシュセグメント2200)がスロット2100に対応付けられる概念を表している。ストレージ装置1がこの対応付けを管理する方法の詳細は後述するが、ストレージ装置1は、スロットを管理する情報としてスロット制御テーブル110(詳細は後述。なおスロット制御テーブル110は、スロット2100ごとに1つ存在する)を有しており、スロット制御テーブル110内に、当該スロットに対応付けられているキャッシュセグメント2200の情報(正確には、キャッシュセグメント2200を管理するための情報へのポインタ)が格納されている。ストレージ装置1は、このスロット制御テーブル110を作成、管理することによって、スロット2100とキャッシュセグメント2200の対応付けを管理する。なお、本発明の実施例においてキャッシュセグメント2200のサイズを4KBにしているのは一例であって、4KB以外のサイズにすることも可能である。ただし本発明の実施例におけるキャッシュメモリ26では、圧縮機能により4KB単位で非圧縮データを圧縮するため、キャッシュセグメント2200のサイズ(非圧縮時)を4KBとすると、管理が複雑化しないという利点があるため、4KBのキャッシュセグメントサイズを採用している。また1つのスロット2100に対応付けられるキャッシュセグメント2200の数を、4つ以外の値にすることも可能である。
ホスト計算機3がボリューム5000上の領域にアクセス(リードまたはライト等)する際の、キャッシュ領域の管理に関連する処理の概要は以下の通りである。ホスト計算機3はストレージ装置1に対し、LUNとLBA(図19中の要素2010に相当)を指定したI/Oコマンドを発行する。ストレージ装置1は、受信したI/Oコマンドに含まれるLBAを、スロットID2110とスロット内相対アドレスの組に変換し、当該変換で得られたスロットID2110で特定されるスロット制御テーブル110を参照する。そしてスロット制御テーブル110の情報に基づき、I/Oコマンドで指定されたボリューム上領域(LBAで特定される領域)に対してキャッシュセグメント2200が確保されているか否かを判定し、キャッシュセグメント2200が確保されていなければ、新規にキャッシュセグメント2200を確保する処理を行う。
続いてキャッシュ管理データ構造についての説明を行う。図20は、ストレージ装置1で管理する、キャッシュ管理データ構造の概念図である。
キャッシュ管理データ構造は、キャッシュディレクトリ100(図21で詳述)と、フリーキュー200と、ダーティキューおよびクリーンキュー(図22で詳述)とを含む。各キャッシュセグメントは、セグメント制御テーブル120(SGCT:Segment Control Table)で管理される。SGCT120は、キャッシュメモリ26内のLBA0空間上の全てのキャッシュセグメント(非圧縮時4KBの領域)のそれぞれに対して1つ存在する。
キャッシュディレクトリ100は、ボリューム上の論理ブロックアドレス(LBA)と、当該論理ブロックアドレス上のデータがキャッシュされている、キャッシュメモリ上のアドレス(LBA0空間上アドレス)との対応関係を管理するデータ構造で、1つの伸長VOLに対して1つのキャッシュディレクトリ100が存在する。キャッシュディレクトリ100は、例えば、キャッシュ対象データが格納されているボリューム上のLBA(又はスロットIDのような、LBAから導かれる情報)をキーとするハッシュテーブルであり、SGCT120を示すためのポインタをエントリとして持っている。SGCT120は、そのSGCT120に対応するキャッシュセグメント325へのポインタ(キャッシュメモリ126上のアドレス[LBA0空間上アドレス])を管理している。したがって、ボリューム上のLBAを用いてキャッシュディレクトリ100内の情報を探索することで、当該論理ブロックアドレスに対応するデータがキャッシュされているキャッシュセグメントを特定することができる。なお、SGCT120の詳細な構成については、後述する。
フリーキュー200は、キャッシュメモリ26のフリーセグメント、すなわちいずれのデータも格納していないキャッシュセグメント325を管理する制御情報である。本発明の実施例では、フリーキュー200はキャッシュメモリ26のフリーセグメントに対応するSGCT120をエントリに持つ双方向のリンクリストとして構成されるが、それには限定されない。
SGCT120は、そのSGCT120に対応するキャッシュセグメントの状態および種類によって、キャッシュディレクトリ100、フリーキュー200のいずれかに接続された状態をとる。未使用のキャッシュセグメント325に対応するSGCT120はフリーキュー200に接続され、当該キャッシュセグメント325がデータ格納用に割り当てられると、キャッシュディレクトリ100に接続される。
図21は、キャッシュディレクトリ、SLCT、SGCTの関係を示す図である。
キャッシュディレクトリ100は、複数のディレクトリエントリポインタ100aの集合からなる。各ディレクトリエントリポインタ100aは、スロットIDに対応するスロット制御テーブル110(SLCT:Slot Control Table)を指し示すポインタ(アドレス情報)を格納する。先に述べた通り、キャッシュディレクトリ100はたとえばスロットIDをキーとするハッシュテーブルであり、たとえばあるスロットIDのハッシュ値を計算した結果が3であるスロットのSLCT110は、キャッシュディレクトリ100の3番目のディレクトリエントリポインタ100aで直接的または間接的に指し示される。
SLCT110は、ディレクトリエントリポインタ110aと、前方ポインタ110bと、後方ポインタ110cと、スロットID110dと、スロットステータス110eと、ダーティ量110fと、SGCTポインタ110gとを含むデータ構造である。ディレクトリエントリポインタ110aは、ハッシュテーブルの次のエントリに対応するSLCT110を指すポインタである。前方ポインタ110bは、SLCT110がクリーンキュー又はダーティキューに接続されている場合に用いられる情報で、クリーンキュー又はダーティキュー内における前の順番のSLCT110を示すポインタである。後方ポインタ110cは、SLCT110がクリーンキュー又はダーティキューに接続されている場合に用いられる情報で、クリーンキュー又はダーティキューにおける後の順番のSLCT110を示すポインタである。スロットID110dは、SLCT110に対応するスロットの識別情報(スロットID)である。スロットステータス110eは、スロットの状態を示す情報である。スロットの状態としては、例えば、当該スロットがロックされていることを示す「ロック中」等がある。ダーティ量110fは、当該スロットに含まれるキャッシュセグメント内に格納されているデータのうち、最終記憶媒体(SSD11、HDD12)に未反映のデータ(ダーティデータ)の量が格納される。SGCTポインタ110gは、当該スロットに含まれるキャッシュセグメントに対応するSGCT120を指すポインタである。当該スロットにキャッシュセグメントが割り当てられていないときは、SGCTポインタ110gは、ポインタ(アドレス)が無効であることを表す値(例えばNULL)となっている。またスロットに含まれるキャッシュセグメントが複数ある場合には、各SGCT120はリンクリストとして管理され、SGCTポインタ110gは、リンクリストにおける先頭のキャッシュセグメントに対応するSGCT120を指すポインタである。
SGCT120は、SGCTポインタ120aと、セグメントID120bと、セグメントアドレス120cと、ステージングビットマップ120dと、ダーティビットマップ120eと、ダーティ量120fとを含む。
SGCTポインタ120aは、同じスロットに含まれる次のキャッシュセグメントに対応するSGCT120を指すポインタである。セグメントID120bは、キャッシュセグメントの識別情報で、スロット内の何番目に位置づけられるキャッシュセグメントであるかを表す情報である。本実施例では、1スロットに最大で4つのキャッシュセグメントが割り当てられるので、各キャッシュセグメントのセグメントID120bには、0、1、2、3のいずれかの値が格納される(スロットの先頭に位置するキャッシュセグメントのセグメントID120bは0となり、以下順に1、2、3のセグメントID120bが付与される。たとえば図19におけるキャッシュセグメント2201〜2204を例にとると、スロット2100の先頭に対応付けられているキャッシュセグメント2201のセグメントID120bは0で、以下キャッシュセグメント2202、2203、2204のセグメントID120bはそれぞれ、1、2、3となる)。
セグメントアドレス120cは、当該SGCT120に対応付けられているキャッシュセグメントのアドレス、つまりキャッシュメモリ26のLBA0空間上のアドレスである。説明が前後するが、本発明の実施例におけるストレージコントローラ10(のプロセッサ21)は、伸長VOL5000に対して書き込まれたデータが格納されるキャッシュ領域(キャッシュセグメント)を管理するために、各キャッシュセグメントのアドレスにLBA0空間上のアドレスを用いる。つまり各キャッシュセグメントがLBA0空間に存在するものとして管理する。これにより、ストレージコントローラ10(のプロセッサ21)は、キャッシュメモリ26上に圧縮状態で格納されたデータのサイズを考慮する必要がなくなり、あたかもキャッシュメモリ26上に非圧縮状態のデータがキャッシュメモリ26に格納されているものとして、キャッシュメモリ26上のデータを管理することができる。また、圧縮VOL5500上のデータをキャッシュしているキャッシュ領域(キャッシュセグメント)の管理には、LBA1空間アドレスを用いる。
ステージングビットマップ120dは、キャッシュセグメントの中でクリーンデータ、つまり最終記憶媒体(SSD11、HDD12)のデータと一致しているデータがキャッシュされている領域を示すビットマップである。クリーンデータ(最終記憶媒体内格納データと同じデータ)がキャッシュされている領域に対応するステージングビットマップ120dのビットはON(1)に設定され、クリーンデータがキャッシュされていない領域に対応するビットはOFF(0)に設定される。ダーティビットマップ120eは、キャッシュセグメントの中でダーティデータがキャッシュされている領域を示すビットマップである。ダーティビットマップ120eは、ステージングビットマップ120dと同様、各ビットがキャッシュセグメント内各領域(セクタ)に対応し、ダーティデータがキャッシュされている領域に対応するビットはON(1)に設定され、ダーティデータがキャッシュされていない領域に対応するビットはOFF(0)に設定される。本発明の実施例では、ステージングビットマップ120d、ダーティビットマップ120eはいずれも1ビットとする。つまり1つのキャッシュセグメント内の各セクタ(8セクタ)はいずれもダーティあるいはクリーンの状態にあるとして管理するが、ステージングビットマップ120d、ダーティビットマップ120eのビット数を1セグメント内セクタ数と等しくする(8ビットにする)構成をとっても良い。
ダーティ量120fは、当該SGCT120に対応付けられているキャッシュセグメント内に格納されているデータのうち、最終記憶媒体(SSD11、HDD12)に未反映のデータ(ダーティデータ)の量が格納される。なお、上で述べたキャッシュSLCT、SGCTの例では、圧縮後の(ダーティ)データ量の情報をSLCT110とSGCT120の両方で管理しており、SLCT110には当該SLCT110に接続されるSGCT120のダーティ量(120f)の合計が格納される構造である。ただし各SGCT120のみに圧縮後のダーティデータ量の情報を格納するようにしてもよい。
図22は、ダーティキューまたはクリーンキューのデータ構造を示す図である。
各SLCT110は先に述べたように、キャッシュディレクトリ100のディレクトリエントリポインタ100aに接続されるとともに、SLCT110に対応するスロットの状態によっては、ダーティキューまたはクリーンキューにも接続され得る。ダーティキューは、ダーティデータを含むスロットに対応するSLCT110を接続するキューである。クリーンキューは、クリーンデータのみを含むスロットに対応するSLCT110を接続するキューである。ダーティキューは、伸長VOL上のデータ(キャッシュ上データ)を圧縮VOLに移動する、あるいは圧縮VOL上のダーティデータをデステージ(最終記憶媒体への書き込み)する時に、ダーティデータの検索を行うために用いられる。クリーンキューは、キャッシュセグメントを確保する際に、未使用(フリーキュー)に接続されたキャッシュセグメント(SGCT)が存在しない場合に、クリーンデータのみを格納しているキャッシュセグメントを代わりに用いる(キャッシュリプレース)が、そのときのキャッシュ検索を行うために用いられる。
本実施例では、キャッシュリプレースおよびデステージのスケジューリングに用いるアルゴリズムをLRU(Least Recently Used)として説明するが、その他の構造を採用することも可能である。なお、ダーティキューおよびクリーンキューは、接続するSLCT110が違うだけで、キューの基本的な構成は同様であるので、ここでは、ダーティキューを例に挙げて説明する。ダーティキューは、双方向のリンクリストとして構成されている。すなわち、ダーティキューは、MRU(Most Recently Used)ターミナル150の前方ポインタに、最近使用したダーティデータを含むスロット(最終使用時刻の新しいスロット)に対応するSLCT110を接続し、以降、SLCT110の前方ポインタ110bに、次の順番のスロット(次に最近使用したダーティデータを含むスロット)のSLCT110を順次接続し、最後の順番のSCLT110の前方ポインタ110bにLRUターミナル160を接続する一方、LRUターミナル160の後方ポインタに最後の順番のSCLT110を接続し、以降、後ろの順番のSCLT110の後方ポインタ110cに対して、その前の順番のスロットのSLCT110を順次接続し、最初の順番のSLCT110をMRUターミナル150に接続する。ダーティキューでは、MRUターミナル150側から、最終使用時刻の新しい順にSLCT110が並ぶこととなる。なお、ダーティキューもキャッシュディレクトリ100と同様、1つの伸長VOLに対してそれぞれ1つのダーティキューが存在する。クリーンキューは、ストレージコントローラ10内で1つ存在する(より正確には、伸長VOL用の(言い換えればLBA0空間のキャッシュメモリ管理用の)クリーンキューが1つ、そして圧縮VOL用の(言い換えればLBA1空間のキャッシュメモリ管理用の)クリーンキューが1つ存在する)。
続いて図23を用いてフリーキュー200のデータ構造を説明する。フリーキュー200は、キャッシュメモリ26上の空き(未使用)キャッシュセグメント325を管理するためのキューであり、空きキャッシュセグメントのSGCT120をポインタで接続したリンクリストである。フリーキューは、ストレージコントローラ10内で1つ存在する。フリーキュー200のフリーキューポインタ201は、キューの先頭のSGCT120を指す。SGCT120のSGCTポインタ120aは、次の空きキャッシュセグメントのSGCT120を指す。
以上が、伸長VOLのデータをキャッシュメモリ26上で管理するためのキャッシュ管理データの内容であるが、圧縮VOLのデータをキャッシュメモリ26上で管理するためのキャッシュ管理データ構造も、同様である。ただし、本発明の実施例では、圧縮VOLのデータをキャッシュメモリ26上で管理する際に用いるキャッシュ領域(キャッシュセグメント)のサイズを、伸長VOLにおけるサイズ(4KB)とは異なるサイズを用いることとしているため、キャッシュ管理データ構造内に格納される情報の内容が若干異なる。以下では、主な相違点のみ説明する。
圧縮VOLも伸長VOLと同様、スロットごとに排他制御が行われ、またスロットに1以上のキャッシュセグメントが対応付けられる。ただし圧縮VOLのキャッシュデータを管理する際に用いられるキャッシュセグメントのサイズは、1セクタ(512バイト。またこれは圧縮時のサイズである)で、またスロットサイズは16KBである。そのため、1スロットに対応付けられるキャッシュセグメント数は32個となる点が、伸長VOLの場合と異なる。もちろん、スロットサイズを16KB以外のサイズにする、セグメントサイズを1セクタ以外のサイズにしても、本発明は有効である。
また、図20〜図23を用いて、伸長VOLのキャッシュデータを管理するためのキャッシュ管理データ構造(キャッシュディレクトリ、SLCT、SGCT、フリーキュー、ダーティキュー、クリーンキュー)について説明したが、圧縮VOLのキャッシュデータを管理するためのキャッシュ管理データ構造は、基本的には図20〜23を用いて説明したものと同じものが用いられる。異なる点として、以下の点が挙げられる。まず圧縮VOLのキャッシュ管理では、1スロットに32個のセグメントが対応付けられるため、1つのSLCTに接続されるSGCTの数が最大32個になる。そしてSGCT内のセグメントID120bには0〜31までのいずれかの値が格納される。さらに、圧縮VOLのキャッシュ管理では、LBA1空間のアドレスを用いてキャッシュセグメントの管理を行う。そのため、SGCT120内のセグメントアドレス120cには、LBA1空間のアドレスが格納される。また、伸長VOLのキャッシュ管理では、ダーティキューは1つの伸長VOLに対して1つのダーティキューが存在したが、圧縮VOLのキャッシュ管理では、1つの最終記憶媒体(SSD11、HDD12)に対して、1つのダーティキューが定義される。これはダーティデータのデステージ処理は、SSD11またはHDD12単位で行われるためである。
いずれにしても、伸長VOLのキャッシュデータ管理構造と圧縮VOLのキャッシュデータ管理構造は、SGCT120に格納される情報の内容、ダーティキューの数がやや異なるだけで、圧縮VOLのキャッシュデータを管理するためのデータ構造は、図20〜23で説明したものと同じものが用いられる。
また、伸長VOLと圧縮VOLとで異なる点として、スロットに格納されるデータの内容・種類が異なることが挙げられる。伸長VOLの各スロットには、ホスト計算機3からのライトデータのみが格納されるが、圧縮VOLのスロットには、圧縮データが格納されることに加え、一部のスロットには、複数のスロット(圧縮データが格納されたスロット)からRAID技術によって生成されたパリティが格納される。
続いて、ストレージ装置1で行われるデータライト処理について、図24、25、26を用いて説明する。図24では、ホスト計算機3から伸長VOL5000に対するライト要求とライトデータを受信し、受信したライトデータをキャッシュメモリ26に格納する処理を説明する。なお、図24のライト処理では、ホストから指定されるライトアドレス(LBA)が4KB境界と一致し、またライトデータサイズが4KBの場合について説明する。
S1では、ストレージ装置1がホストインタフェース24を介してホスト計算機3からライト要求を受け付ける。ライト要求には、ストレージ装置1のポートを特定する情報(図13のポート#501を導出できる情報)、伸長VOLのLUN、伸長VOLのLBAが含まれている。ストレージコントローラ10のプロセッサ21は、DRAM25上にライトデータを一時的に格納するバッファ領域を確保し、ライトデータをホスト計算機3から受信してバッファ領域に格納する(S1)。
S2では、プロセッサ21はS1で受信したライト要求に含まれる、ポートを特定する情報とLUNと伸長VOL管理テーブル500とから、伸長VOLのVVOL#(図13のVVOL#503に相当する情報)を特定する。また、LBAをスロットIDに変換する。続いて特定されたVVOL#から、今回ライト対象の伸長VOLに対応づけられたキャッシュディレクトリ100を選択し、今回アクセス対象のLBAが属するスロットのロックを行う(キャッシュディレクトリ100をたどって、今回アクセス対象のLBAが属するスロットに対応するSLCT110を検索し、検索されたSLCT110のスロットステータス110eに「ロック中」を示す情報を格納する)。
S3では、プロセッサ21は、(ライト要求で指定された)伸長VOLのLBAに対応するキャッシュセグメントが割り当て済みであるか判定する。具体的には、S2で行われた変換により得られたスロットID110dを有するSLCT110内のSGCTポインタ110fを参照することで、判定を行う。SGCTポインタ110fが無効(たとえばNULL)値である場合には、キャッシュセグメントが未割り当てであることが判明する。SGCTポインタ110fに有効な値が含まれている場合、少なくともキャッシュセグメントが1つ割り当てられていることが判明するので、SGCTポインタ110fをたどって、スロット内相対アドレスで特定されるスロット内の位置にキャッシュセグメントが割り当てられているかを確認する。具体的には、「スロット内相対アドレス÷8」で得られた結果(整数値)と同一のセグメントID120bを有するSGCT120があるかを確認することで、キャッシュセグメントが割り当てられているかを確認することができる(スロット内相対アドレス÷8の計算を行うことで、0〜3のいずれかの整数値が得られるので、スロット内相対アドレスが、0〜3のいずれのセグメントIDが付与されたキャッシュセグメントに対応するアドレスであるかを知ることができる)。この結果、キャッシュセグメントが割り当て済みであれば(ステップS3:YES)、プロセッサ21は、ステップS5へ処理を進める。一方、キャッシュセグメントが未割り当てであれば(ステップS3:NO)、セグメント割り当て処理を実行し(ステップS4)、ステップS5へ処理を進める。ステップS4のセグメント割り当て処理では、フリーキュー200の先頭に繋がっているSGCT120を取得することで、未使用のキャッシュセグメントを割り当てる。また、未使用のキャッシュセグメントがなかった場合、つまりフリーキュー200に繋がっているSGCT120が存在しなかった場合には、クリーンキューに繋がっているSLCT110に接続されているSGCT120を取得する。
S5、S6では、バッファ領域から、割り当てられているキャッシュセグメントへのデータ転送を行う。プロセッサ21は、キャッシュセグメントのアドレス(割り当てられているセグメントに対応するSGCT120のセグメントアドレス120cに格納されているLBA0空間のアドレス)を送信先アドレスとして取得する(S5)。そしてバッファ領域のアドレスを送信元アドレス、S5で取得したアドレスを送信先アドレスとして指定したデータ転送(ライト)コマンドを作成し、キャッシュメモリ26にライトコマンドを送信することでデータ転送を指示する。キャッシュメモリ26にライトコマンドを送信すると、キャッシュメモリ26から処理完了の通知が来るのを待つ。
キャッシュメモリ26から処理完了の通知を受信すると、ライト対象のキャッシュセグメントがダーティ状態になったことを記録するため、ライト対象のキャッシュセグメントに対応するSGCT120のダーティビットマップ120eをONし、またライト対象のキャッシュセグメントの属するスロットのSLCT110をダーティキューに接続する(S7)。また、キャッシュメモリ26から受信するライトコマンド処理完了の通知には、キャッシュメモリ26に書き込まれたデータの圧縮後のサイズ情報が含まれているので、SGCT120のダーティ量120fに、受信したサイズ情報を格納し、またSLCT110のダーティ量110fに、キャッシュメモリ26から受信した当該サイズ情報を加算する。なお、ホスト計算機3からライト要求のあったライトデータ量が4KB以外、たとえば4KBを超えるサイズであった場合、キャッシュメモリ26から受信するライトコマンド処理完了の通知だけでは、キャッシュセグメントごとのデータ量(圧縮後)の情報が得られないため、圧縮データサイズ取得コマンド1110を発行し、キャッシュセグメントごとの圧縮データ量の情報を取得して、SGCT120のダーティ量120f、SLCT110のダーティ量110fに圧縮データ量の情報を反映する。その後キャッシュスロットのロックを解除して(S8)、ホスト計算機3にライト処理が完了したことを通知し、処理を終了する。
S8の終了後、S9の圧縮VOLへのデータ移し替え(移動)処理が行われることもあるが、この処理は必須ではなく、キャッシュメモリ26の状態が所定条件を満たした場合に、圧縮VOLへのデータ移し替え処理が行われる。これについては次に説明する。
続いて図25を用いて圧縮VOLへのデータ移し替え処理について説明する。データ移し替え処理は、図24のS9に相当する処理、つまりホスト計算機3からのデータライト処理の直後に行われる処理だが、圧縮VOLへのデータ移し替え処理が行われる契機は、データライト処理の直後には限定されない。たとえば定期的にキャッシュメモリ26の状態を監視し、キャッシュメモリ26の状態が所定条件を満たした場合にも実行される。なお、圧縮VOLへのデータ移し替え処理は、伸長VOLごとに行う。
S21では、プロセッサ21は、所定条件を満たしたか判定する。一例では、ある伸長VOLについて、当該伸長VOLのキャッシュディレクトリ100に接続されている各スロットのSLCT110に含まれるダーティ量110f(あるいはSGCT120のダーティ量120f)を調べて、キャッシュメモリ26上に格納されているダーティデータ量が、RAIDパリティを生成するために必要な量を上回ったかを判定する。ここで、RAIDパリティを生成するために必要な量とは、先に述べたように、ストライプグループを構成するスロットの集合と同量またはそれより多いデータ量をいう。図16のRAID構成を例にとると、1つの伸長VOL内の3スロット分、つまり16KB×3=48KBのダーティデータ量がキャッシュメモリ26上に存在する場合、パリティを生成できると判断される。条件を満たしていた場合(S21:YES)、S22に進み、条件を満たしていない場合(S21:NO)、S31に移動する。
S22では、移し替え処理を行う対象となるスロットの選択と、選択したスロットのロックを行う。スロットの選択にはさまざまな方法が採用可能である。たとえばダーティキューに接続されている、各SLCT110のダーティ量110fを参照し、ダーティ量110fが多いスロット(SLCT)から順に選択していき、選択したスロット(SLCT)のダーティ量110fの合計が所定量(48KBまたは48KBの倍数)に到達するまでスロット(SLCT)を選択する。あるいはLRU(Least Recently Used)アルゴリズムに基づいてスロットを選択しても良い。なお、以降の説明は、S22の処理で、ダーティ量(圧縮データ)の合計が1ストライプグループ分(48KB)になるようにスロットを選択しているという想定で説明を行うが、本発明はそれに限定されるものではない。同時に、ここで選択したスロットのSLCT110、及びSLCT110に接続されているSGCT120のうち、ダーティビットマップがONになっているSGCT120の内容を参照することにより、移し替え処理を行う対象のキャッシュセグメントのセグメントアドレス120c(つまりキャッシュメモリ26のLBA0)を特定する。また、移し替え処理を行う対象のキャッシュセグメントに対応するSLCT110のスロットID110dとSGCT120のセグメントID120bから、移し替え処理を行う対象のキャッシュセグメントの対応する伸長VOLの領域のLBAを算出する。
続いてS23では、圧縮VOL上のディスク領域割り当てを行う。まずボリュームマッピングテーブル600を参照し、現在処理対象の伸長VOL601に対応する圧縮VOL602及び最終書き込み位置603を選択する。そして圧縮VOL602の最終書き込み位置603の次のLBAから1ストライプグループ分の領域を選択する。続いて今回処理対象の伸長VOLの各領域(S22で選択したスロット内のダーティデータの格納されている領域)を圧縮VOLのどの位置に対応付けるかを決定し、アドレスマッピングテーブル650に、決定した内容を格納する。
S24では、S23で選択した1ストライプグループ分の領域に対応するスロット、及びこの1ストライプグループに対応するパリティスロットのロックを行い、各スロットに対してセグメントの割り当てを行う。この処理はS3と同様である。この処理により、S23で選択した1ストライプグループ分のデータスロット及びパリティスロットに対応するキャッシュセグメント(のアドレス。つまりLBA1)が決定される。
S25では、データの移し替え、つまりS22で選択された伸長VOL上のダーティデータのキャッシュメモリ26上のアドレス(LBA0)を、S24で決定した圧縮VOLの1ストライプグループ分の領域に対応するキャッシュメモリ26上のアドレス(LBA1)に対応付ける(マッピングする)。S23の処理で、伸長VOLの各領域のLBAが圧縮VOLのどのLBAに対応付けられるべきか決定しているので、S23の処理結果に基づいて対応付けを行う。プロセッサ21はキャッシュメモリ26に対し、LBA1マッピングコマンドを発行し、伸長VOL上のダーティデータのキャッシュメモリ26上のアドレス(LBA0)を、圧縮VOLの1ストライプグループ分の領域に対応するキャッシュメモリ26上のアドレス(LBA1)に対応付ける。LBA1マッピングコマンドの発行後、プロセッサ21はキャッシュメモリ26からの処理完了の応答を待つ。
キャッシュメモリ26から処理完了の応答を受信するとS26に進み、S24で確保した圧縮VOLのスロットに対応付けられているキャッシュセグメントをダーティ状態にする。具体的には各キャッシュセグメントに対応するSGCT120のダーティビット120eをONにし、SLCT110をダーティキューに接続する。なお、圧縮VOLのダーティキューは最終記憶媒体ごとに存在するため、SLCT110をダーティキューに接続する場合、SLCT110に対応するスロットがどの最終記憶媒体に対応付けられるものか特定する。たとえば図16に示すように、圧縮VOLの各スロットは、圧縮VOLに対応付けられているRAIDグループのいずれかの最終記憶媒体の所定位置に固定的に対応付けられており、周知のストレージ装置で行われている、論理ボリュームアドレスと物理ディスク(最終記憶媒体であるSSD11またはHDD12)のアドレス変換の計算を行うことで、圧縮VOLの各スロットの対応付けられている最終記憶媒体は容易に特定できる。そしてSLCT110を、当該特定された最終記憶媒体に対応したダーティキューに接続する。
続いてS27で、伸長VOL側のキャッシュセグメントを破棄する。この処理では、伸長VOL側のキャッシュセグメントに対応するSGCT120のダーティビット120eをOFFし、SLCT110からSGCT120を切り離す。続いて、SLCT110から切り離したSGCT120のセグメントアドレス120cを指定したマッピング解除コマンドをキャッシュメモリ26に発行し、キャッシュメモリ26内でLBA0とPBAとの対応付けを解除する。この後SGCT120をフリーキュー201につなぎかえる。
S28では、圧縮VOLのパリティ生成を行う。プロセッサ21はキャッシュメモリ26に対して、S24にてデータスロットに割り当てたキャッシュセグメントのセグメントアドレス(LBA1)と、パリティスロットに割り当てたキャッシュセグメントアドレス(LBA1)を指定した、フルストライプParity生成コマンドを発行する。このコマンドを受けたキャッシュメモリ26は、パリティスロットに割り当てられたキャッシュセグメントにパリティを生成する。キャッシュメモリ26はパリティ生成が終了するとプロセッサ21に処理完了を通知する。プロセッサ21は処理完了の通知を受信すると、パリティスロットのキャッシュセグメントをダーティ状態にする。この処理はS26と同様である。
S29で、圧縮VOL、伸長VOLスロットのロックを解除する。また、ボリュームマッピングテーブル600の最終書き込み位置603を更新する。たとえばS22〜S28の処理で1ストライプグループ分のデータが圧縮VOLに移し替えられたとすると、1ストライプグループを構成するスロット及び当該ストライプグループに対応するパリティスロットのサイズに相当するセクタ数(RAID構成が3D+1Pの構成で、1スロットが16KBであれば、64KBつまり128セクタになる)だけ、最終書き込み位置603の情報を加算する。
S31では、全伸長VOLに対して移し替え処理(S21〜S29)の処理を行ったか判定し、全伸長VOLに対して移し替え処理が行われていれば(S31:YES)、処理を終了するが、移し替え処理が行われていない伸長VOLが残っている場合(S31:YES)には、S21に戻って残りの伸長VOLに対してS21〜S29の処理を行う。
なお、その他の実施形態として、S21の所定条件に、上で挙げた例以外の条件を用いてもよい。たとえばホスト計算機3からのライト要求が、伸長VOLに対して、所定サイズ以上のデータを連続的に書き込む要求が連続して到来している(つまり、シーケンシャルライト要求が行われている)と判断された場合には、伸長VOLのスロットの終端に位置するキャッシュセグメントにデータが書き込まれた時点で、圧縮VOLへのデータ移し替え処理を行う、という条件でもよい。
また、圧縮VOLのダーティデータをデステージする処理が必要になるが、これは任意のタイミングで行えばよい。たとえばキャッシュメモリ26の使用量が所定の閾値を超過したときに実施する、定期的(10分間に1回など)に実施するなどが考えられる。デステージ処理自体は、従来からあるストレージ装置で行われている処理と同様であるため、図26を用いて概要のみ説明する。
最初にS31で、プロセッサ21は最終記憶媒体ごとに設けられているダーティキューのうち1つのダーティキューを選択する。続いてS32で、プロセッサ21はS31にて選択したダーティキューにスロット(SLCT110)が接続されているか判定する。スロットが接続されていなかった場合にはS37に移動するが、スロットが接続されている場合にはS33に進む。
S33では、プロセッサ21はダーティキューに接続されているスロットを、今回のデステージ対象スロットとして選択し、当該スロットのロックを行う。ダーティキューに複数のスロットが接続されている場合、スロットの選択方法、選択するスロットの個数の決定には、様々な周知の技術が適用できるが、ここでは説明を簡単にするため、LRUターミナル160が指すSLCT110を1つ選択するものとする。もちろん、ダーティキューに接続されている所定個数(固定値)のスロットを選択する、LRUターミナル160が指すSLCT110のスロットと隣接する(最終記憶媒体上で)スロットを複数個選択する、あるいはダーティキューに接続されているすべてのスロットを選択する等の方法を採用することもできる。
S34では、プロセッサ21はデステージ対象スロット、つまりS33で選択したスロット(SLCT110)のスロットID110dを、最終記憶媒体のアドレスに変換する。このアドレス変換は先に述べたとおり、周知の技術であるので変換方法の説明は省略する。
S35では、プロセッサ21はデステージ対象スロット(SLCT110)に属するキャッシュセグメントに格納されているデータを最終記憶媒体へ書き込む。まず、プロセッサ21はDRAM25上の領域をバッファ領域として確保し、先に述べたキャッシュメモリ26のリードコマンドを用いて、キャッシュメモリ26からバッファ領域へのデータ読み出しを実行する。そしてバッファ領域に読み出されたデータを、S34の変換処理で算出した最終記憶媒体(SSD11、HDD12)のアドレスに書き込む。また、別の実施形態として、最終記憶媒体(SSD11、HDD12)に対して発行するライトコマンド(SCSI WRITEコマンド)で、ライト元データのアドレスにキャッシュメモリ26のLBA1アドレスを直接指定できるようにすることも可能で、その場合には、一旦DRAM25上にキャッシュメモリ26からデータを読み出す必要がなくなる。
S36では、デステージ対象スロットをクリーンキューに接続し、またスロットのロックを解除する。同時に、デステージ対象スロット(SLCT110)のダーティ量110fを0にし、また当該SLCT110に接続されている全てのSGCT120について、ダーティビットマップ120eをOFF、ステージングビットマップ120dをONにし、またダーティ量120fを0にする。
その後、未処理のダーティキューがあるか否か判定し(S37)、未処理のダーティキューが残っている場合(S37:Yes)、S31に戻る。すべてのダーティキューについて、S31〜S36の処理を行った場合には、デステージ処理を終了する。
以上が、本発明の実施例におけるストレージ装置1が実施するデータライト処理である。なお、この処理の流れからわかる通り、ホスト計算機3から伸長VOLに対して書きこまれたデータはすべて、圧縮VOL上では追記書きされる。そのため、圧縮VOLに書き込まれた更新前データは、再びホスト計算機3からアクセスされないものであるにもかかわらず、圧縮VOLに残された状態になる。そして更新前データの格納されている領域には新たなデータを書き込むことができないから、圧縮VOLの記憶領域を無駄に消費することになる。かかる状態を解消するため、アクセスされないデータを定期的に圧縮VOLから削除し、アクセスされるデータのみを残す(具体的にはアドレスマッピングテーブル650で管理されている伸長VOLのLBAに対応付けられている圧縮VOL上の領域のみを残す)処理、いわゆるガーベッジコレクションを行う必要がある。この処理は、データ書き込み時に追記書き処理を行う記憶媒体、例えばフラッシュメモリなどで採用している処理を利用することで実現できる。
続いて図27、28を用いて、ホスト計算機3からボリューム(伸長VOL)に対するリード要求を受け付けた時の処理の流れを説明する。なお、以下ではリード要求により指定されるボリュームのアクセスアドレスの範囲(先頭アドレスと終端アドレス)は、4KB境界に一致している例について説明する。またリードデータ長は4KBとする。
S51で、ストレージコントローラ10がリード要求(コマンド)をホスト計算機3から受信する。リード要求には、ストレージ装置1のポートを特定する情報(図13のポート#501を導出できる情報)、伸長VOLのLUN、伸長VOLのLBA、リードデータ長が含まれている。
S52では、図24のS2と同様の処理が行われる。S51で受信したポートを特定する情報とLUNと、伸長VOL管理テーブル500から、伸長VOLのVVOL#(図13のVVOL#503に相当する情報)を特定する。また、LBAをスロットIDに変換する。続いて特定されたVVOL#から、今回リード対象の伸長VOLに対応づけられたキャッシュディレクトリ100を選択し、今回アクセス対象のLBAが属するスロットのロックを行う。
S53では、プロセッサ21は、伸長VOLのLBAに対応するキャッシュセグメントが割り当て済みであるか判定する。この判定は、ライト処理のS3と同様の処理である。セグメントが割り当てられていない場合にはS54に進み、S54でセグメントの割り当てを行う。S54の処理はS4と同様の処理である。
S55では、アドレスマッピングテーブル650を参照して、伸長VOLのリード対象LBAに対応する圧縮VOLのLBAを特定する。そして特定されたLBAをスロットIDに変換し、圧縮VOLのディレクトリエントリ100をたどって、圧縮VOLのLBAに対応するスロットのSLCT110を検索し、スロットのロックを行う。
S56では、プロセッサ21は、圧縮VOLのLBAに対応するキャッシュセグメントが割り当て済みであるか判定し、割り当てられていない場合にはセグメントの割り当てを行う(S57)。この処理は、S53、S54と同様の処理である。キャッシュセグメントが既に割り当てられている場合、S61に進む。
S58では、圧縮VOLのLBAを最終記憶媒体(SSD11またはHDD12)のアドレスに変換する。圧縮VOLの各領域(セクタ)は、所定の規則によって、最終記憶媒体のセクタに対応付けられているので、圧縮VOLのLBAを用いれば、圧縮VOLの記憶領域が、どの最終記憶媒体のどの位置に対応付けられているかを算出可能である。この処理は、RAID技術を用いてデータを格納する周知のストレージ装置が、リード・ライト処理時に行う処理と同様であるので、詳細な説明は省略する。
S59では、プロセッサ21はDRAM25にリードデータを一時的に格納する領域を確保する。続いて最終記憶媒体(SSD11、HDD12)に対して、S58で算出された最終記憶媒体のアドレスを指定したリードコマンドを発行することにより圧縮データを読み出し、DRAM25へ転送する。
S53でセグメントが割り当て済みと判定された場合には、S60にて、圧縮VOLのLBAに対応するキャッシュセグメントのSGCT120のセグメントアドレス120c(LBA0が格納されている)を参照して、LBA0を取得する。
S56でセグメントが割り当て済みと判定された場合には、S61にて、当該セグメントに対応するSGCT120のステージングビットマップ120dとダーティビットマップ120eを参照し、いずれかのビットがONであるか判断する。いずれかのビットがONであれば(S61:Yes)、S63に進み、いずれのビットもOFFであれば(S61:No)、S58に進む。
S62では、S59でDRAM25に転送されたデータを、キャッシュメモリ26に転送するため、プロセッサ21は、DRAM25のアドレスを転送元アドレスとして、またキャッシュメモリ26のセグメントのアドレスを転送先アドレスとして指定したデータ転送コマンドをキャッシュメモリ26に発行して、キャッシュメモリ26へのデータ転送を行う。なお、キャッシュメモリ26上の転送先アドレスの情報は、S57で割り当てたキャッシュセグメント(S56ですでにセグメントが割り当て済みと判定された場合には、割り当て済みのセグメント)に対応するSGCT120のセグメントアドレス120cにLBA1が格納されているので、このアドレスが転送先アドレスになる。また、S59、S62の別の実施形態として、最終記憶媒体からのリードデータを、DRAM25を経由せず直接キャッシュメモリ26のLBA1アドレスで指定された領域に格納するようにしてもよい。
S63では、キャッシュメモリ26に格納された圧縮データを、非圧縮データ(伸長データ)としてホスト計算機3に送信できるようにするため、S62でキャッシュメモリ26上に格納されたデータの領域に対して、LBA0空間のアドレスを対応付ける処理を行う。プロセッサ21はキャッシュメモリ26に対してLBA0マッピングコマンドを発行し、キャッシュメモリ26上の圧縮データの格納されているLBA1(S62で用いたSGCT120のセグメントアドレス120c)を、S54で確保したキャッシュセグメントのセグメントアドレス(LBA0)に対応付ける。
S64で、プロセッサ21は、S62でLBA1との対応付けを行ったLBA0、あるいはS60で取得したLBA0を読み出し元アドレスとして指定したリードコマンドをキャッシュメモリに発行することにより、キャッシュメモリ26から伸長データを読み出し、ホスト計算機3に転送する。
最後にS65において、伸長VOLと圧縮VOLのスロットのロックを解除するが、その前に、伸長VOLのSLCT110(S52で確保したスロットのSLCT110)と圧縮VOLのSLCT110(S55で確保したスロットのSLCT110)がクリーンキューに接続されているか確認し、クリーンキューに接続されていない場合にはクリーンキューに接続する。そして各SLCT110に接続されているSGCT120のステージングビットマップ120dをONする。その後、各スロットのロック解放(スロットステータス110eの値を0にする)を行って、リード処理を終了する。
なお、上ではリード要求により指定されるボリュームのアクセスアドレスの範囲が、4KB境界に一致している例について説明したが、アクセスアドレスの範囲が4KB境界と一致していない場合、たとえば4KB未満のサイズのデータリード要求が来た場合には、最終記憶媒体から4KBの範囲(非圧縮時)のデータを読み出してキャッシュメモリ26に格納し、そこからホスト計算機3から要求されている範囲のデータだけを選択して、ホスト計算機3に送信すればよい。また、ライト要求により指定されるボリュームのアクセスアドレスの範囲も4KB境界に一致している例について説明したが、ライト要求のアクセスアドレスの範囲が4KB境界と一致していない場合、たとえば4KB未満のサイズのデータライト要求が来た場合には、一旦当該ライトアクセスアドレス範囲を含む4KBの領域(非圧縮状態で)のデータを最終記憶媒体からキャッシュメモリ26上に読み出し、読み出したキャッシュメモリ26上データに、ライトデータを上書きすればよい。この場合、キャッシュメモリ26を構成する記憶媒体がフラッシュメモリの場合には、上書きはできないが、周知のフラッシュメモリで採用されている上書き時の処理、つまり最終記憶媒体から読み出したデータとライトデータとをバッファ416でマージし、未書き込みの(フラッシュメモリの)ページに書き込む処理を行うことで、見かけ上、キャッシュメモリ26上のデータの上書きが実現できるので、ここではこの処理の詳細は説明しない。
[変形例1]
上で説明した実施例では、圧縮VOLは1つのRAIDグループと固定的に対応付けられ、圧縮VOLのアドレスと、RAIDグループを構成する各記憶媒体のアドレスとの関係も固定的なものである構成である場合について説明した。しかしながら、本発明の圧縮VOLは周知のストレージ装置が提供する様々なボリュームを利用可能である。以下では一例として、米国特許出願公開第2013/0036250号明細書や、米国特許出願公開第2010/0205390号明細書等に開示されている、いわゆるシンプロビジョニング(Thin Provisioning)技術を用いて作成される仮想的なボリュームを、本発明の圧縮VOLとして用いる場合の例について説明する。
シンプロビジョニング技術により作成される仮想的なボリューム(以下、この仮想的なボリュームを[HVOL]と呼ぶ)は、初期状態ではHVOLの各領域に特定の記憶領域が割り当てられていない。ストレージ装置は、HVOL上の位置(LBA)を指定したアクセス要求を受け付けると、当該位置に記憶領域が割り当てられているか確認し、割り当てられていない場合、その位置に記憶領域を割り当てる。
図29を用いて、本発明の変形例1におけるストレージ装置1で管理する、圧縮VOL、論理ボリューム(LDEV)、最終記憶媒体(PDEV)の関係について説明する。本発明の変形例1におけるストレージ装置1では、上で説明した実施例における圧縮VOL5500’として、HVOLを用いる。またストレージ装置1は、HVOLの他、複数の最終記憶媒体11(12)で構成される論理ボリューム(以下、この論理ボリュームを「LDEV」と呼ぶ)も作成する。このLDEVは、上で説明した実施例における圧縮VOL5500と同様のもので、1つのRAIDグループから1つのLDEVが構成される。
変形例1におけるストレージ装置1では、(図29では非図示の)伸長VOL5000から圧縮VOL5500’(HVOL)にデータの移動が行われる時、データの移動が行われるHVOL上の領域に対して、LDEV上の未使用領域を割り当てる。なお、ストレージ装置1は、HVOL上の記憶空間を複数の固定サイズ領域に分割して管理しており、この固定サイズ領域は「ページ」と呼ばれる。各ページには「ページID」という一意な識別番号が付されており、HVOLの先頭のページのページIDがページ0である。そしてそれ以降のページには、順にページ1、ページ2、…の番号が付されている。変形例1におけるストレージ装置1では、1ページのサイズは1ストライプグループのサイズと等しいものとして管理しているが、1ページのサイズは1ストライプグループのサイズに限定されるものではなく、その他のサイズを採用してもよい。たとえば1ページのサイズを、複数ストライプグループのサイズと等しくする、あるいはそれよりも大きくする構成でもよい。
また、HVOLのページに対して割り当てることができるLDEV上領域を管理するために、ストレージ装置1ではLDEVプール9000という概念を定義している。ストレージ装置1がHVOLのページに記憶領域を割り当てる際、LDEVプール9000内に存在するLDEV上の領域から、1ページ分の記憶領域を選択して割り当てる。
なお、ホスト計算機3から伸長VOLへのデータの書き込みが行われ始めて、圧縮VOL(HVOL)へとデータが移動されることによって、はじめてLDEV上の記憶領域がHVOLに割り当てられるので、LDEV上のデータを格納する領域の合計容量(パリティを格納する領域を除く容量)は、少なくとも初期状態ではHVOL(複数)の合計容量よりも小さくてもよい。つまりLDEVを構成する最終記憶媒体の合計容量が、全HVOLの合計容量よりも小さくてもよい。HVOLに割り当てられる、(LDEVの)記憶領域が増加して、未使用のLDEV上領域が少なくなってきた時点で、最終記憶媒体をストレージ装置1に追加し、追加した最終記憶媒体からLDEVを定義し、定義したLDEVをLDEVプール9000へと追加する、という作業を行えばよい。そのため、圧縮VOLに、シンプロビジョニング技術により形成されるHVOLを用いることにより、最終記憶媒体の容量をさらに節約することが可能になる。
また、1つのHVOLで1つLDEVプールを利用する場合に比較し、複数のHVOLにてLDEVプールを共有する場合、共有されたLDEVプールを効率的に利用することが可能となる。より詳細には、圧縮されたデータを格納することから、複数のHVOLそれぞれで記憶領域の割り当てが必要となるページの数が異なることとなるが、LDEVプールを共有することで、例えば圧縮率の高い(記憶領域の割り当てが必要となるページが少ない)HVOLがあったとしても、LDEVを共有する他のHVOLに記憶領域を割り当てることができるため、共有されたLDEVプールを効率的に利用することが可能となる。
図30は、ストレージ装置1がHVOLを管理するために用いる情報である、HVOL管理情報10000の例を示している。HVOL管理情報10000の各行(エントリ)は、HVOL#10001、サイズ10002から構成される。HVOL#10001はHVOLの識別番号を表し、サイズ10002はHVOL#10001で特定されるHVOLのサイズを表している。
図31は、ストレージ装置1が各HVOL上のページに割り当てられている記憶領域の割り当て状態を管理するために用いる情報である、ページマッピングテーブル10010の例を示している。ページマッピングテーブル10000の各行(エントリ)は、HVOL#10001、ページID(P−ID)10002、LDEV#10003、スロット#10004の項目を有し、HVOL#10001、ページID(P−ID)10002で特定されるHVOL上の領域(ページ)に、LDEV#10003、スロット#10004で特定されるLDEV上のスロットを先頭スロットとする1ストライプグループ分の領域が割り当てられていることを表している。
HVOLは、ストレージ装置1のユーザ(管理者)によって定義される。ストレージ装置1のユーザ(管理者)が管理端末4を用いて、HVOLの作成を指示すると、ストレージ装置1はHVOL管理情報10000に、新規に作成されたHVOLの識別番号(HVOL#)とHVOLのサイズを登録する。そしてページマッピングテーブル10010に新規に作成されたHVOLの各ページの情報を登録するが、最初はHVOL#10001、ページID(P−ID)10002の情報だけが登録され、LDEV#10003、スロット#10004には無効値(たとえばNULL)が格納される。伸長VOLからHVOL(圧縮VOL)のページに対するデータの移し替えが行われる時に、LDEV#10003、スロット#10004の欄に値が格納される。
また、HVOL上ページに領域を割り当てる際、まだいずれのページにも割り当てられていないLDEV上領域(未使用ページと呼ぶ)を割り当てる必要があるため、ストレージ装置1はページフリーリスト10100(図32)という管理情報を有する。ページフリーリスト10100の各エントリは、LDEV#10110、スロット#10120の項目を有し、ページフリーリスト10100のLDEV#10110、スロット#10120で特定されるLDEV上のスロットを先頭スロットとする1ストライプグループ分の領域が、未使用ページであることを表している。ストレージ装置1がHVOL上ページに領域を割り当てる際、ページフリーリスト10100から未使用のスロット(1ストライプグループ分)を取得して、HVOL上ページに割り当てる。
続いて、変形例1におけるストレージ装置1で行われる、ホスト計算機3からデータライト要求があった時の処理、データリード要求があった時の処理の流れについて説明する。この処理は上で説明した実施例における図24〜28の処理とほぼ同様である。たとえばホスト計算機3から伸長VOL5000に対するライト要求とライトデータを受信し、受信したライトデータをキャッシュメモリ26に格納する処理は、図24の処理と同一であるため、以下では説明しない。以下では圧縮VOL(HVOL)へのデータ移し替え処理、リード処理について、上で説明した実施例との相違箇所を説明する。
図33を用いて、圧縮VOL(HVOL)へのデータ移し替え処理の流れを説明する。図25のS23、S24の処理が、図33ではS23’、S241、S242に変更されている以外は、図25の処理と図33の処理は同一である。
S21では、プロセッサ21は、所定条件を満たしたか判定し、S22では移し替え処理を行う対象となる伸長VOLのスロットの選択及び選択したスロットのロックを行う。変形例1ではS21において、ある伸長VOLについて、当該伸長VOLに対して書き込まれたデータ(キャッシュメモリ26上)のダーティ量が1ページ(つまり1または複数ストライプグループ分)以上存在するという条件の場合に、所定条件を満たしたと判断する。S23’では、圧縮VOL(HVOL)上のディスク領域割り当てを行う。まずボリュームマッピングテーブル600を参照し、現在処理対象の伸長VOL601に対応する圧縮VOL602及び最終書き込み位置603を選択する。そして圧縮VOL602の最終書き込み位置603の次のLBAから1ストライプグループ分の領域に、伸長VOLからデータを移動すると決定する。続いて今回処理対象の伸長VOLの各領域(S22で選択したスロット内のダーティデータの格納されている領域)を圧縮VOLのどの位置に対応付けるかを決定し、アドレスマッピングテーブル650に、決定した内容を格納する。
続いてS24’では、S23’でデータを移動すると決定した移動先の領域である、HVOL上の1ページ分の領域(1または複数ストライプグループ分の領域)に対して、LDEVの領域を割り当てる。この処理について図34を用いて説明する。
S241で、S23’で選択されたHVOL上の1ページ分領域の先頭LBA(これはボリュームマッピングテーブル600内最終書き込み位置603の次のLBAである)をページIDに変換する。LBAからページIDを算出するためには、LBAを1ページのサイズで除算すればよい。たとえば1ページのサイズがNストライプグループ(N≧1)のサイズと等しく、1ストライプグループのサイズが48KBの場合、LBAからページIDを算出するためには、LBAを(48×N)KBで除算すればよい。
S242では、ページマッピングテーブル10010を参照し、S241で算出されたページIDのページに、LDEV上領域が割り当てられているか(LDEV#10013、スロット#10014に、無効値でない値が格納されているか)判定する。領域が割り当て済みの場合にはS244に進む。領域が割り当てられていない場合、ページフリーリスト10100から、LDEV上の領域を1ストライプグループ分取得し、取得した1ストライプグループ分の領域の情報をページマッピングテーブル10010に登録することで、HVOL上ページに領域を割り当てる(S243)。その後S244の処理に進む。
S244では、ページマッピングテーブル10010を参照し、S241で算出されたページIDのページに割り当てられているLDEV上領域の情報(LDEV#10013、スロット#10014を先頭スロットとする、1ページ分のスロットのスロット番号)を取得する。同時に、ここで取得した1ページ分のスロットに対応するパリティスロットのスロット番号も算出する。S245は図25のS24と同様の処理を行う。つまりS244で取得したスロットについてロック取得し、キャッシュセグメントの割り当てを行う。
S245の処理が終了すると、S25に進むが、S25以降の処理は図25の処理と同一であるので、説明を省略する。
このように圧縮技術を用いると、ホストからのライトデータとはサイズの異なる圧縮データを最終記憶媒体に格納することとなるが、HVOLへのデータ移動に伴い、HVOLを分割した固定サイズ領域に対して、LDEVから記憶領域を割り当てることで、容量効率を高めることが可能となる。また、ストレージコントローラは、HVOLのページサイズ、LDEVのストライプグループのサイズ、更新データの圧縮後のサイズとを把握している。このため、ストレージコントローラが、更新データを追記する場合、追記された圧縮後の更新データのサイズに応じて、HVOL上ページへのHVOL上の領域の割り当てを過不足なく行うことができるため(領域を過剰に割り当てることがない)、容量効率を高めることが可能となる。
続いてホスト計算機3からボリューム(伸長VOL)に対するリード要求を受け付けた時の処理の流れを説明する。この処理は図27のS55、S56がそれぞれ、以下に説明するS55’、S56’の処理に変更されるだけで、それ以外は図27と同様であるため、図示を省略する。
S55’では、アドレスマッピングテーブル650を参照して、伸長VOLのリード対象LBAに対応する圧縮VOL(HVOL)のLBAを特定する。続いて特定されたHVOLのLBAをページIDに変換し、ページマッピングテーブル10010を参照し、当該ページIDに割り当てられているLDEVのスロット(LDEV#10013、スロット#10014で特定されるスロット)を特定し、特定されたLDEVのスロットのロックを行う。
S56’では、プロセッサ21は、圧縮VOLのLBAに対応するLDEV上のキャッシュセグメントを特定し、当該キャッシュセグメントが割り当て済みであるか判定し、割り当てられていない場合にはセグメントの割り当てを行う(S57)。S57以降の処理は図27と同様である。また圧縮VOLのLBAに対応するLDEV上のキャッシュセグメントを特定する処理は、シンプロビジョニング技術を用いているストレージ装置で従来から行われている処理で、周知技術であるので詳細な説明を省略する。キャッシュセグメントが既に割り当てられている場合、S61に進み、これ以降の処理は図27と同様である。
[変形例2]
上で説明した実施例では、伸長VOLに対して書き込まれたデータが、キャッシュ26に1ストライプグループ分蓄積されるたびに圧縮VOLへの移動が行われる。また移動の際、伸長VOLに書き込まれたデータは、当該データの伸長VOL上の書き込み位置とは無関係に、圧縮VOL(LDEV、さらには最終記憶媒体)に追記書きの要領で書き込まれるため、伸長VOL上で連続しているデータ(領域)が、圧縮VOL(LDEV)上では不連続に配置されることもある。そのような配置が行われると、シーケンシャルリード性能が、通常のストレージ装置(非圧縮データを格納するストレージ装置)よりも悪化する。以下では、データを伸長VOLから圧縮VOLに移動する際に、伸長VOL上でのデータ配置を考慮して圧縮VOLにデータを移動する方法を説明する。
変形例2におけるストレージ装置1では、変形例1と同様、圧縮VOLにシンプロビジョニング技術により形成される仮想的なボリューム(HVOL)を用いる。またHVOLの1ページのサイズは変形例1では1ストライプグループ分のサイズであったが、変形例2では、複数ストライプグループ(一例として1000ストライプグループ)とする。また説明の簡単化のため、1ストライプグループは3スロット分(48KB)のサイズの前提で説明する。そのため、1ページのサイズは、48×1000KBである。
上で説明した実施例1では、1つの伸長VOLに書き込まれたデータは、1つの伸長VOLに対応付けられた1つの圧縮VOLのいずれかの領域に追記書きされたが、変形例2では、各伸長VOLを、圧縮VOLのページサイズと同じく、ページ(48×1000KB)単位に分割し、各ページにページ番号を付与して管理する。各ページに付与されるページ番号は、伸長VOLの先頭に位置するページにページ0の番号が付与され、以下順にページ1、ページ2…が付与される。なお、伸長VOLのページと圧縮VOLのページとは、必ずしも同一サイズである必要はなく、データが圧縮して格納されることを期待して、圧縮VOLのページサイズを伸長VOLのページサイズより小さくしても、本発明は有効である。
図35を用いて、変形例2におけるボリュームマッピングテーブル600’の内容を説明する。変形例2におけるストレージ装置1では、伸長VOLのページ0に書き込まれたデータは、圧縮VOL(HVOL)のページ0に書き込まれ、以下同様に、伸長VOLのページ1、2…に書き込まれたデータはそれぞれ、圧縮VOL(HVOL)のページ1、2…に書き込まれる。そのため、ボリュームマッピングテーブル600’では、VVOL#601’、ページID(P−ID)602’、HVOL#603’、P−ID604’、最終書き込み位置605’の項目を有し、VVOL#601’、ページID(P−ID)602’で特定される伸長VOL上領域に書き込まれたデータは、HVOL#603’、P−ID604’で特定される圧縮VOL上ページに格納される旨の情報を管理する。また最終書き込み位置605’の情報も、伸長VOLのページ毎に管理する。
その他、変形例2におけるストレージ装置1では、変形例1と同様、HVOLを管理するための管理情報として、HVOL管理情報10000、ページマッピングテーブル10010、ページフリーリスト10100を有するが、ページサイズが1000ストライプグループになっている以外の点は、変形例1で用いられる管理情報のものと同様であるので説明を省略する。また、伸長VOLやLDEVのキャッシュ管理情報も上で説明した実施例、変形例1で用いられるキャッシュ管理情報と同様であるが、変形例2では、伸長VOL用のダーティキューは、伸長VOLのページ毎に1つのダーティキューが存在する点が、上で説明した実施例と異なる。
続いて変形例2におけるストレージ装置1で行われるライト処理について説明する。変形例2におけるライト処理の流れは、基本的には上で説明した実施例、変形例1とほとんど差はなく、受信したライトデータをキャッシュメモリ26に格納する処理は、図24の処理と同一であるので説明を省略する。また伸長VOLから圧縮VOLへのデータ移し替え処理は、図33とほとんど差がないため、図33を用いて説明する。なお上で説明した実施例、変形例1では、圧縮VOLへのデータ移し替え処理は、伸長VOLごとに行っているが、変形例2では、ページ毎に行う。
S21において、プロセッサ21は、所定条件を満たしたか判定するが、変形例2では、伸長VOLの各ページのダーティキューに接続されている各スロットのダーティ量110fの合計が、所定量(たとえば1ページサイズの60%以上等)以上になったか判定し、所定量以上になった場合にS22以降の処理に進む。
S22の処理は、上で説明した実施例と同様であるが、ダーティキューに接続されているスロットを、スロットIDの小さいものから順に選択し、選択したスロットのダーティデータの領域のダーティ量の合計が、ストライプグループサイズの倍数で、かつこの値ができるだけ大きくなるように選択を行う。そのため、全ダーティデータを選択した時にダーティデータ量がストライプグループサイズの倍数になるのであれば、全スロットを選択する。
S23の処理も上で説明した実施例と同様であるが、変形例2では、処理対象の伸長VOLの各領域を、LBAの小さい順から昇順に、圧縮VOL上の領域に対応付け、伸長VOL上のデータ配置順と圧縮VOL上のデータ配置順が同じになるようにする。以降の処理は、上で説明した実施例や変形例1と同様である。
これにより、伸長VOL上で連続して配置されている各データが、圧縮VOL上でも昇順に配置されることになる。そのため、この後伸長VOLに対して、連続データを読み出す、いわゆるシーケンシャルリードアクセスがホスト計算機3から到来した場合、圧縮VOLからほぼシーケンシャルに圧縮データを読み出すことが可能になる。
以上、本発明の実施例を説明してきたが、これは本発明の説明のための例示であって、本発明を上で説明した実施例に限定する趣旨ではない。本発明は、他の種々の形態でも実施可能である。たとえば実施例に記載のストレージ装置において、ストレージコントローラが2つ記載されているが、ストレージコントローラの数はこれには限定されず、1以上の任意の数のコントローラが備えられていてよい。またコントローラ内のプロセッサや、ホストインタフェースの数も、図に記載されている数に限定されるものではない。
また、上で説明した変形例2では、変形例1と同様にシンプロビジョニング技術によって形成されるHVOLを圧縮VOLとして用いているが、最初に説明した実施例と同様、シンプロビジョニング技術を使用しない論理ボリュームを圧縮VOLとして用いても、実施例2の態様は実現可能である。