以下、図面を参照して、本発明の一実施例を説明する。
図1は、一実施例における情報システムの構成を示す。
情報システムは、ストレージシステム100、ホスト110と、それらを接続するSAN(Storage Area Network)120とを有する。ホスト110は、アプリケーションプログラム(ユーザアプリケーション)を実行する計算機であり、ストレージステム100との間で、SAN120経由で、必要なデータを読み書きする。SAN120は、SCSIコマンドが転送可能なプロトコルを用いる。そのプロトコルとして、例えば、Fibre
Channel等のプロトコルを用いることができる。SCSIコマンド以外に、メインフレームのI/Oプロトコルも用いることもできる。
図2は、ストレージシステム100の構成を示している。
ストレージシステム100は、一つ以上のストレージコントローラ200、キャッシュメモリ210、共有メモリ220、フラッシュパッケージ230、などの構成要素を接続する一つ以上の接続装置250、から構成される。また、本実施例においては、ストレージシステム100内の記憶媒体は、すべてフラッシュパッケージ230であるが、HDD(Hard Disk Drive)のような他の記憶媒体を含んでいてもよい。また、本実施例におけるフラッシュパッケージ230の容量はすべて等しいものとする。ただし、本発明は、フラッシュパッケージ230の容量の中に異なっているものがあっても有効である。ストレージコントローラ200は、ホスト110から発行されたアクセス要求(典型的にはリード要求又はライト要求)を処理するプロセッサ260、プログラムや情報を保管するメモリ270から構成される。
本実施例の1つの特徴は、次の通りである。すなわち、ストレージシステム100内に、ある論理ボリューム(プライマリボリューム)をベースに、差分ボリューム(プライマリボリュームとの差分に相当する論理ボリューム)を作成する際に、プライマリボリューム内のデータとは異なったデータ(差分データ)を格納しプライマリボリューム内のデータと同じデータ(重複データ)を格納しないという方式が、フラッシュパッケージ230とストレージコントローラ200を連携させることで、高性能に実現される。差分データは、差分ボリュームに格納されても良いし差分ボリュームとは別の記憶領域に格納されても良い。ここで、関連のある論理ボリュームの集合(例えば、プライマリボリュームと、プライマリボリュームをベースに作成された差分ボリュームとの集合)を、「論理ボリュームグループ」と呼ぶ。なお、本実施例では、差分ボリュームを生成する目的は、下記の2つ、
(1)バックアップ、及び、
(2)ゴールデンイメージからの仮想サーバイメージの生成、
のいずれかであるとする。勿論、本発明は、上記2つの目的以外の目的で差分ボリュームが生成されることにも有効である。
本実施例は、多数のフラッシュメモリを有するストレージシステム100において、フラッシュメモリへの格納データ容量削減技術(フラッシュメモリに格納するデータの容量を削減する技術)を実現するものである。本実施例においては、ストレージシステム100は、階層型の容量仮想化技術をもつ。上位レベルの容量仮想化技術の制御単位は、ページとよばれる単位である。本実施例におけるページは、ストレージコントローラ200で実現される容量仮想化技術で用いられるページである。なお、本発明は、階層型の容量仮想化技術における上位レベルの制御単位は、ページでなくとも有効である。本実施例では、ページのサイズは、フラッシュメモリにおける消去単位であるブロックよりも大きい。例えば、ページのサイズは、ブロックのサイズのX倍である(Xは2以上の整数)。通常、フラッシュメモリにおいては、リード・ライトの単位をページと呼ぶので、ページはブロックよりも小さい。しかし、すでに述べたように、本実施例では、ページは、上位レベルの容量仮想化技術についての制御単位(シンプロビジョニングに従う仮想的な論理ボリュームに割り当てられる記憶領域)を意味しており、そのサイズは、ブロックよりも大きい。なお、本実施例では、フラッシュメモリにおけるリード・ライトの単位を、上位レベルの容量仮想化の制御単位であるページと区別するため、「セグメント」と呼ぶ。また、下位レベルの容量仮想化技術の制御単位は、本実施例では、フラッシュメモリの消去単位であるブロックのN倍(Nは1以上の整数)の単位として、説明を行う。また、本発明は、記憶媒体をフラッシュメモリとし、実容量より大きい仮想容量を持ち、消去単位であるブロックを割り当て単位とした、容量仮想化機能を、単独に、従来の上位レベルの容量仮想化機能なしに、ホスト110に提供しても有効である。
図2は、ストレージシステム100の構成を示している。
ストレージシステム100は、一つ以上のストレージコントローラ200と、キャッシュメモリ210と、共有メモリ220と、フラッシュパッケージ230と、それらの構成要素を接続する一つ以上の接続装置250とを有する。また、本実施例においては、ストレージシステム100内の複数の記憶媒体は、すべてフラッシュメモリであるが、ストレージシステム100は、フラッシュメモリの他に、HDDのような他種の記憶媒体を含んでいてもよい。また、本実施例において、全てのフラッシュパッケージ230の物理容量(物理的な記憶容量)は等しい。ただし、本発明は、複数のフラッシュパッケージ230のうちの少なくとも2以上のフラッシュパッケージ230の物理容量が異なっていても良い。ストレージコントローラ200は、ホスト110から発行されたリード要求又はライト要求を処理するプロセッサ260と、プログラム及び/又は情報を記憶する記憶資源(例えばメモリ270)とを有する。
接続装置250は、ストレージシステム100内の各構成要素を接続する機構である。また、本実施例では、高信頼化のために、一つのフラッシュパッケージ230は、複数の接続機構250で、複数のストレージコントローラ200に接続されているものとする。ただし、一つのフラッシュパッケージ230が一つの接続装置250にしか接続されていない場合も本発明は有効である。
キャッシュメモリ210及び共有メモリ220の少なくとも一方は、通常、DRAMなどの揮発メモリで構成されるが、バッテリーなどによりメモリは不揮発化されていても良い。ただし、本発明は、キャッシュメモリ210及び共有メモリ220の少なくとも一方が不揮発化されていなくても有効である。
キャッシュメモリ210には、フラッシュパッケージ230に格納されたデータの中で、ストレージコントローラ200からよくアクセスされるデータが格納される。ストレージコントローラ200は、ホスト110からライト要求を受け付け、そのライト要求に従うデータ(フラッシュパッケージ230に書き込むデータ)を、キャッシュメモリ210に書き込んで、そのライト要求を完了させる(例えばライト要求に対する完了報告をホスト110に送る)。ただし、本発明は、書き込むデータをフラッシュパッケージ230に格納した段階でライト要求を完了させる方式でも有効である。
共有メモリ220は、キャッシュメモリ210の制御情報、ストレージシステム100内の重要な管理情報、ストレージコントローラ200間の連絡情報、及び、同期情報のうちの少なくとも1種類の情報を記憶する。
なお、本実施例では、フラッシュパッケージ230は、ストレージコントローラ200からは、一台の記憶装置に見えているものとする。したがって、ストレージコントローラ200が、高信頼化のために、一台のフラッシュパッケージ230が故障しても、そのフラッシュパッケージ230のデータを回復できるRAID(Redundant Array of Independent (or Inexpensive) Disks)機能をもっているものとする。ストレージコントローラ200がRAID機能もつ場合、複数のフラッシュパッケージ230で、一つのRAID構成をとる。これを、フラッシュパッケージグループ280と呼ぶ。ただし、そのようなRAID機能を、ストレージコントローラ200がもっていなくとも、本発明は有効である。
図3は、フラッシュパッケージ230の構成を示している。
フラッシュパッケージ230は、複数のフラッシュチップ300と、パッケージプロセッサ310と、パッケージメモリ320と、バッファ330と、パッケージバス340と、バス転送装置350と、圧縮・伸長回路360とを有する。本実施例では、フラッシュパッケージ230は、ブロック単位の容量仮想化機能をもっている。なお、フラッシュパッケージ230が、ブロック単位以外の容量仮想化機能をもっていても、本発明は有効である。このため、フラッシュパッケージ230の物理容量(フラッシュパッケージ230がもっている全てのフラッシュチップ300の物理容量を合計した値)より大きな容量が、仮想容量として定義される。フラッシュパッケージ230は、ストレージコントローラ200からライト要求を受け付けたとき、そのライト要求に従うライト先のアドレス(そのアドレスが属する仮想的な領域)に、データを書き込むべきブロックが割り当てられているかどうかを判断し、その判断の結果が否定的の場合に、ライト先のアドレスに、ブロックを割り当てる。これによって、実際にブロックを割り当てる時刻を遅らせることができ、容量削減の効果がある。
また、2つの圧縮・伸長回路360A及び360Bが設けられている。第1の圧縮・伸長回路360Aは、ストレージコントローラ200とバッファ330の間で転送されるデータを圧縮又は伸長する。第2の圧縮・伸長回路360Bは、バス転送装置350とバッファ330の間で転送されるデータ、及び、バッファ330の或る領域から読み出されてバッファ330の別の領域に書き込まれるデータを、圧縮又は伸長する。以上により、フラッシュチップ300に格納するデータを圧縮することができるので、さらなる容量削減の効果がある。また、本実施例では、圧縮・伸長回路360A及び360Bは、特に指示がない場合(例えば、パッケージプロセッサ310からの指示がない場合)、圧縮及び伸長のいずれも行わず、入力されたデータをそのまま転送する。
パッケージプロセッサ310は、ストレージコントローラ200からリード要求又はライト要求を受け付け、受けた要求に従う処理を実行する。
バッファ330は、ストレージコントローラ200とフラッシュチップ300との間でリード又はライトされるデータを格納する。本実施例では、バッファ330は、揮発メモリである。パッケージプロセッサ310が、ストレージコントローラ200からライト要求を受け、そのライト要求に従うデータをフラッシュチップ300に書き込んだ段階で、そのライト要求を完了する(ライト要求の完了をストレージコントローラ200に報告する)。ただし、バッファ330が不揮発メモリであっても良く、また、パッケージプロセッサ310は、ストレージコントローラ200からのライト要求に従うデータをバッファ330に書き込んだ段階で、そのライト要求の完了報告をストレージコントローラ200に送信しても良い。
パッケージメモリ320には、パッケージプロセッサ310が実行するプログラム、及び、フラッシュチップ300の管理情報などが格納される。フラッシュパッケージ230の管理情報は重要な情報であるので、計画停止時には、管理情報を特定のフラッシュチップ300に退避できることが望ましい。また、突発的な障害に備え、バッテリーをもち、これを利用して、障害などが発生しても、管理情報を特定のフラッシュチップ300に退避できることが望ましい。
パッケージバス340は、バッファ330とフラッシュチップ300との間で転送されるデータが流れるバスで、一本以上存在する。性能向上のために、複数のパッケージバス340を持つのが一般的だが、パッケージバス340が一本でも本発明は有効である。
バス転送装置350は、パッケージバス340対応に存在し、パッケージプロセッサ310の指示にしたがって、バッファ330とフラッシュチップ300との間で、データ転送を実行する。
圧縮・伸長回路360A及び360Bは、パッケージプロセッサ310からの指示に従い、バッファ330から読み出されるデータ、及び/又は、バッファ330に書き込まれるデータの圧縮又は伸長を行う。もちろん、圧縮・伸長回路360A及び360Bは、データを、圧縮又は伸長なしに転送することも可能である。
図4は、ストレージシステム100の共有メモリ220に格納される情報を示す。
論理ボリューム情報2000、実ページ情報2100、空きページ管理情報ポインタ2200、フラッシュパッケージグループ情報2300、フラッシュパッケージ情報2500、仮想ページ容量2600、使用不可ページ情報管理ポインタ2700及び空き論理ボリューム情報ポインタ2900が共有メモリ220に格納される。これらの情報のうちの少なくとも1種類が、上位レベルの容量仮想化技術を実現するために利用される。
本実施例においては、ストレージコントローラ200は、上位レベルの容量仮想化機能を有しているものとする。ただし、本発明は、ストレージコントローラ200が、上位レベルの容量仮想化機能をもっていなくとも有効である。通常、上位レベルの容量仮想化機能において、記憶領域の割り当て単位は、ページと呼ばれる。なお、本実施例では、論理ボリューム(例えば、シンプロビジョニングに従う仮想的な論理ボリューム)は、複数の仮想ページ(仮想的な記憶領域)に分割されているものとし、1以上のフラッシュパッケージグループ280に基づく記憶空間(以下、「プール」と言うことがある)は、複数の実ページ(実体的な記憶領域)に分割されているものとする。容量仮想化においては、論理ボリュームの記憶容量を、実際の容量よりも大きく見せることができる。このため、一般に、仮想ページの数は、実ページの数より多い。容量仮想化機能を実現した場合、ストレージコントローラ200が、ホスト110からのライト要求に従うライト先のアドレスに属する仮想ページに、空きの実ページをプールから割り当て、その実ページに、ライト要求に従うデータを書き込む。
仮想ページ容量2600は、仮想ページの容量を表す情報である。しかし、本実施例では、仮想ページの容量と実ページの容量は等しいというわけではない。なぜなら、実ページには、RAIDのタイプにより異なってくる冗長データが格納されることがあるためである。したがって、実ページの容量は、その実ページが割り当てられたフラッシュパッケージグループ280のRAIDタイプにより決まる。たとえば、RAID1のようにデータを2重に書き込む場合、実ページの容量は、仮想ページ容量の2倍になる。RAID5のように、N台の記憶装置の容量に対し、1台分の記憶装置の容量の冗長データを格納する場合、仮想ページ容量の(N+1)/Nの容量が、実ページの容量である。また、1つの冗長データとこれを生成するN個のデータを、「ストライプグループ」と呼ぶ。さらに、ストライプグループを構成する個々のデータの長さを「ストライプサイズ」と呼ぶ。当然、RAID0のように、冗長性がない場合、仮想ページの容量と等しい容量が実ページの容量ということになる。なお、本実施例においては、仮想ページの容量は、ストレージシステム100が提供する1又は複数の論理ボリューム(シンプロビジョニングに従う仮想的な論理ボリューム)について共通であるが、1又は複数の仮想ボリュームにおいて異なる容量の仮想ページが含まれていても、本発明は有効である。
図5は、論理ボリューム情報2000の形式を示したものである。
論理ボリュームは、リード又はライトされるデータを記憶する論理的な記憶装置である。一般的に、ホスト110は、論理ボリュームのID、論理ボリューム内のアドレス、及び読み書きしたいデータの長さを指定したアクセス要求(リード要求、ライト要求)を発行する。論理ボリューム情報2000は、論理ボリュームごとに存在する情報である。この情報は、論理ボリュームID2001、論理容量2002、論理ボリュームRAIDタイプ2003、空き論理ボリュームグループ情報ポインタ2004、論理ボリュームグループタイプ2005、グループ内GI(Golden Image)ID2006、グループ内BK(BacKup)ID2007、GIポインタ2008、GI順ポインタ2009、GI逆ポインタ2010、BK順ポインタ2013、BK逆ポインタ2014、及び実ページポインタ2011により構成される。
本実施例では、ある論理ボリューム(プライマリボリューム)をベースにした新しい論理リューム(差分ボリューム)の生成を指示されると論理ボリュームグループが形成される。この指示は、ホスト110や管理サーバ120からストレージシステム100に送られる。差分ボリューム内のデータは、この指示をうけた時点での、プライマリボリュームのデータとなる。したがって、この時点では、差分ボリュームのデータは、プライマリボリュームのデータと同じなので、そういったことを認識するための仕掛けをもてば、データを重複して格納する必要はない。指示を受けた時点以降にプライマリボリューム又は差分ボリュームにデータが書き込まれると、論理ボリューム間(プライマリボリュームと差分ボリューム間)で差が生じる。このため、指示を受けた時点以降のデータは、フラッシュパッケージ230に格納され、管理される必要がある。本実施例は、フラッシュメモリの特性を利用して、以上の管理を効率的に実行することを目的にしている。
論理ボリュームID2001は、対応する論理ボリュームのIDを示す。
論理容量2002は、ホスト110から見たこの論理ボリュームの容量である。
論理ボリュームRAIDグループタイプ2003は、該当する論理ボリュームのRAIDタイプ、RAID0、RAID1などを指定する。RAID5のように、N台の容量に対し、1台の容量の冗長データを格納する場合、Nの具体的数値を指定するものとする。ただし、任意のRAIDタイプが指定できるわけでなく、少なくとも一つのフラッシュパッケージグループ280がもつRAIDタイプである必要がある。
空き論理ボリュームグループ情報ポインタ2004は、空き状態にある次の論理ボリューム情報を示すポインタである。本実施例では、論理ボリュームが単独に存在しているのであれば、ある論理ボリュームグループに属する論理ボリュームの数は1つである。このボリュームをベースにした差分ボリューム(新しい論理ボリューム)が生成されると、論理ボリュームグループに属する論理ボリュームの数が複数になる。
論理ボリュームグループタイプ2005は、論理ボリュームのタイプを示す。ここでは、そのタイプは、GIボリューム、オンラインボリューム、バックアップボリュームのいずれかである。GIボリュームは、仮想サーバのゴールデンイメージを格納したボリュームである。オンラインボリュームは、ホスト110のアプリケーションが使用するデータを格納したボリュームである。オンラインボリュームは、独立に生成されるものと、GIボリュームから生成されるものとがある。バックアップボリュームは、オンラインボリュームのある時点のバックアップデータを格納したものである。本実施例では、通常の論理ボリュームは、オンラインボリュームになっているものとする。プライマリボリュームをベースにした差分ボリュームにゴールデンイメージを生成せよというGI生成要求を、ストレージコントローラ200が受け取ったとき、プライマリボリュームのボリュームタイプを、GIボリュームにして、差分ボリュームのボリュームタイプをオンラインボリュームにする(GI生成要求は、すでにゴールデンイメージになっているプライマリボリュームをベースに差分ボリュームにゴールデンイメージを生成せよという要求でも良い)。オンラインボリュームになっているプライマリボリュームをベースに差分ボリュームにバックアップをとれというバックアップ要求をストレージコントローラ200が受け付けると、ストレージコントローラ200は、ボリュームタイプがバックアップボリュームである差分ボリュームを生成する。
グループ内GIID2006は、当該論理ボリュームグループ内のGIボリューム(ゴールデンイメージ)から生成されたオンラインボリュームの識別子である。
グループ内BKID2007は、当該論理ボリュームグループの1つのオンラインボリュームから生成されたバックアップボリュームの識別子である。なお、本実施例では、異なったオンラインボリュームから生成されたバックアップボリュームのグループ内BKID2007は、重複するが、重複しないようにしても、本発明は有効である。
GIポインタ2008は、当該論理ボリュームの生成元となったGIボリューム(ゴールデンイメージ)の論理ボリューム情報2000へのポインタである。
GI順ポインタ2009は、1以上のポインタ(論理ボリューム情報2000のポインタ)で構成されている。それら1以上のポインタは、同じゴールデンイメージから生成された論理ボリューム情報2000の生成順に並んでいる。
GI逆ポインタ2010は、1以上のポインタ(論理ボリューム情報2000のポインタ)で構成されている。それら1以上のポインタは、GI順ポインタ2009とは逆の順序で並んでいる。
BK順ポインタ2013は、1以上のポインタ(論理ボリューム情報2000のポインタ)で構成されている。それら1以上のポインタは、バックアップボリュームの古い世代から新しい世代の順に並んでいる。
BK逆ポインタ2014は、1以上のポインタ(論理ボリューム情報2000のポインタ)で構成されている。それら1以上のポインタは、BK順ポインタ2013とは逆の順序で並んでいる。
本実施例では、単独の論理ボリュームが存在している状態であれば、その論理ボリュームの論理ボリュームグループタイプ2005は、オンラインになっているものとする。また、論理ボリュームの論理ボリューム情報2000のGIポインタ2008、GI順ポインタ2009、GI逆ポインタ2010、BK順ポインタ2013、BK逆ポインタ2014は、いずれもヌル値で、グループ内GIID2006、グループ内BKID2007は、いずれも0番とする。
図34〜図36は、論理ボリュームグループの構成の幾つかの例を示す。
図34に示す第1の論理ボリュームグループ構成例によれば、1つのGIボリューム(ゴールデンイメージ)から複数のオンラインボリューム(差分ボリューム)が生成されている。この場合、それぞれのオンラインボリュームの論理ボリュームグループタイプ2005をもつ論理ボリューム情報2000のGIポインタ2008が、GIボリュームの論理ボリュームグループタイプ2005をもつ論理ボリューム情報2000をポイントする。また、論理ボリュームグループタイプ2005が、ゴールデンイメージの論理ボリューム情報2000を先頭に最後に生成された論理ボリュームの論理ボリューム情報2000が、GI順ポインタ2009とGI逆ポインタ2010の双方向のポインタにより連結されている。
図35に示す第2の論理ボリュームグループ構成例によれば、オンラインボリュームから複数世代のバックアップボリュームが生成されている。この場合、最近生成された論理ボリュームの論理ボリューム情報2000の論理ボリュームグループタイプ2005が、オンラインボリュームになり、古い論理ボリューム情報2000の論理ボリュームグループタイプ2005が、バックアップボリュームになる。ただし、ホスト110から見た論理ボリュームのアドレスは、変化しないので、新しい論理ボリューム情報2000の論理ボリュームID2001と論理ボリュームグループタイプ2005に、それまでのオンラインボリュームという論理ボリューム情報2000の論理ボリュームID2001と論理ボリュームグループタイプ2005とがコピーされる。生成された論理ボリュームのベースになる古い論理ボリューム(プライマリボリューム)の論理ボリューム情報2000の論理ボリュームグループタイプ2005に、バックアップボリュームを意味する値が設定され、その情報2000の論理ボリュームID2001に、プライマリボリュームの識別子が設定される。各論理ボリュームは、BK順ポインタ2013とBK逆ポインタ2014によって接続される。グループ内BKID2005は、論理ボリューム情報2000の生成順に昇順となる。
図36に示す第3の論理ボリュームグループ構成例によれば、GIボリューム(ゴールデンイメージ)からオンラインボリュームが生成されており、さらに、オンラインボリュームに対し、バックアップボリュームが生成されている。この例では、GIポインタ2008が、GIボリュームの論理ボリューム情報を示すのは、論理ボリュームグループタイプ2005がオンラインボリュームの論理ボリューム情報2000である。また、論理ボリュームグループタイプ2005がGIボリュームの論理ボリューム情報2000と論理ボリュームグループタイプ2005がオンラインボリュームの論理ボリューム情報2000が、GI順ポインタ2009とGI逆ポインタ2010の双方向のポインタにより連結されている。これ以外は、図34及び図35を参照して説明したので、ここでの説明を省略する。つまり、図36に示す論理ボリュームグループ構成例は、図34に示した論理ボリュームグループ構成例と図35に示した論理ボリュームグループ構成例の組み合わせに基づいている。
本実施例の1つの特徴は、ストレージコントローラ200が、フラッシュパッケージ230に送信するアクセス要求(リード要求及びライト要求)に、アクセス対象のアドレス(リード元領域のアドレス、ライト先領域のアドレス)に加えて、グループ内GIID又はグループ内BKIDを付加する(グループ内GIID又はグループ内BKIDは、世代番号の一例に相当する)。これによって、フラッシュパッケージ230は、同じアドレスを指定されても、グループ内GIID又はグループ内BKIDが異なった場合、異なったデータが読み書き対象となっていることを認識できる。
再び図5を参照する。実ページポインタ2011は、対応する論理ボリュームの仮想ページに割り当てたページ管理情報2100へのポインタである。実ページポインタ2011の数は、論理ボリュームの仮想ページの数(論理容量2002が表す値を仮想ページ容量2600が表す値で割った数になるが、余りがでれば、商に1を足す)である。最初の実ページポインタ2011に対応するページが、論理ボリュームの先頭の仮想ページに割り当てられた実ページで、以降、次の実ページポインタ2011には、次の仮想ページに割り当てる実ページに対応するポインタが格納される。また、仮想容量機能をサポートしているので、実ページが割り当てられるのは、論理ボリュームを定義した契機ではなく、対応する仮想ページに実際にデータ書き込みが行われる契機である。したがって、まだ書き込みが行われていない仮想ページの場合、対応する実ページポインタ2011はヌルになっている。
図6は、実ページ情報2100の形式である。
実ページ情報2100は、実ページごとに存在する、実ページの管理情報である。実ページ情報2100は、パッケージグループ2101、実ページアドレス2102、空きページポインタ2103、ページデータ格納量2104、ページ圧縮後データ格納量2105、移動中フラグ2109、移動先実ページ情報2110、移動待ちフラグ2111、論理ボリューム数2112及び論理ボリューム情報ポインタ2113を含む。
パッケージグループ2101は、対応する実ページが、どのフラッシュパッケージグループ280に割り当てられているかを示す。
実ページアドレス2102は、対応する実ページの基になっているフラッシュパッケージグループ280の中で、対応する実ページがどの相対的なアドレスに割り当てられているかを示す情報である。
空きページポインタ2103は、対応する実ページに、仮想ページが割り当てられていない場合、有効な値となる。この場合、その値は、次の仮想ページが割り当てられていない空きページ情報2100をさす。仮想ページが割り当てられている場合、空きページポインタ2103は、ヌル値となる。
本実施例においては、それぞれのフラッシュパッケージ230は、容量仮想化機能をもっており、ストレージコントローラ200には、見かけ上、実際の物理容量より大きな容量を仮想容量として提供している。フラッシュパッケージ230の容量仮想化の単位は、本実施例では、フラッシュメモリの消去単位であるブロックとする。以下、ストレージコントローラ200から見たブロックを「仮想ブロック」と呼び、フラッシュパッケージ230が、実際に割り当てているブロックを「実ブロック」と呼ぶことがある。したがって、本実施例では、実ページは、1又は複数の仮想ブロックにより構成されることになる。また、本実施例では、仮想ブロックにより構成される容量空間のほうが、実ブロックにより構成される容量空間より大きいことになる。
図7は、仮想ページ、実ページ、仮想ブロック、実ブロックの関係の一例を示したものである。
すでに述べたように、実ページには、仮想ページにはない、冗長データが含まれることがある。一方、仮想ブロックに格納されるデータは、圧縮されて実ブロックに格納される。本実施例では、m個(mは1以上の整数)の仮想ブロックのデータが、圧縮率に応じて、1個からmin(k,L*(当該仮想ブロックグループに割り当てた論理ブロック数))*(m+1)個までの実ブロックに格納される。kは、例えば世代数である。Lは、例えば1より小さい値(且つ、例えば0より大きい値)である。ただし、上記の格納方式を採らない場合でも、本発明は有効である。本実施例の説明において、このm個の仮想ブロックを「仮想ブロックグループ」と言い、1つの仮想ブロックグループを割り当てた1つ以上の実ブロックを「実ブロックグループ」と言うことがある。以下、本実施例で、実ブロックの最大割り当て数をmin(k,L*(当該仮想ブロックグループに割り当てた論理ブロック数))*(m+1)個にした理由を以下に示す。
仮に、仮想ブロックグループのデータがほとんど圧縮できなかったとする。この場合、必要な実ブロックの数はm個となるが、実ブロックに空き容量はほとんどないことになる。このとき、ブロック内の一部のデータを書き換える要求(普通のライト要求)を、ストレージコントローラ200からフラッシュパッケージ230が受け取ったとしよう。フラッシュメモリのブロックは書き換えができないので、フラッシュパッケージ230は、そのブロックの全データをバッファ330に読み出し、書き換え部分だけ更新して、当該ブロックを一度消去した後、ブロック全体にデータを格納しなければならない。フラッシュパッケージ230がライト要求を受け取るたびに、以上の動作を実行すると、処理時間が過大になりすぎ、実用的とは言いがたい。これを解決するため、本実施例では、もう1つ実ブロックが割り当てられ、これにより、空き領域が確保される。このため、空き領域に追加書き込みを行うことができる。空き領域が小さくなって、書き換えデータが入らなくなった場合、消去処理が行われる。これに、当該仮想グループに割り当てた論理ブロック数や世代数(k)などを考慮して、実ブロックの最大割り当て数が、min(k,L(<1)*(当該仮想ブロックグループに割り当てた論理ブロック数))*(m+1)個とされる。これにより、消去処理(例えば、実ブロック内の全てのデータを消去する処理)が、n回のライト要求について1回実行されればよいので、性能を向上させることができる。また、消去処理の回数の削減は、フラッシュメモリの長寿命化にもつながる。本実施例では、フラッシュパッケージ230は、実ブロック数より多くの仮想ブロックをもっているように、ストレージコントローラ200に見せていることになる。ただし、ストレージコントローラ200は、実際にフラッシュパッケージ230がいくつの空き実ブロックをもっているかを意識して、実ページの再配置を行うことができる。本実施例では、フラッシュパッケージ230が、まだ実ブロックを割り当てていない仮想ブロックに、書き込み要求を受け付けたとき、実ブロックを割り当てる。
ページデータ格納量2104、ページ圧縮後データ格納量2105は、それぞれ、当該ページを割り当てた、フラッシュパッケージグループ280を構成するフラッシュパッケージ230の数だけ存在する。ただし、これらの情報は、この実ページに含まれる仮想ブロックの属性情報ではなく、この実ページに対応する仮想ページのデータに関する属性情報である。したがって、この仮想ページが別の実ページに割り当てられ、現在の実ページのデータが新しい実ページにコピーされた場合、ページデータ格納量2104、ページ圧縮後データ格納量2105を、新しい実ページの管理情報として引き継ぐ必要がある。ページデータ格納量2104は、当該実ページに格納したデータ量である。なお本実施例では、実ページに複数の論理ボリュームのデータを書き込むため、ページデータ格納量2104は、最大、実ページ容量*論理ボリューム数2802になる。ページ圧縮後データ格納量2105は、当該ページに格納した圧縮後のデータ量である。以上の二つの値は、フラッシュパッケージ230から受け取った情報に基づき、計算される。
論理ボリューム数2112は、当該実ページに割り当てた論理ボリュームの数が格納される。論理ボリュームを割りあてる数は、実ページ毎に異なっていてもよい。
論理ボリューム情報ポインタ2113は、当該実ページに割り当てた論理ボリュームの論理ボリューム情報2000へのポインタである。当該実施例では、1つの実ページに割り当てる論理ボリュームの数は最大k個なので、論理ボリューム情報ポインタ2113の領域の数はkである。先頭から、論理ボリューム数2112に設定されている数の分の論理ボリューム情報ポインタ2113が有効な値が設定されていて、残りはヌル値が設定されているものとする。本実施例では、フラッシュパッケージ230が認識している仮想ブロックグループは、1つの実ページに含まれているものとする。このため、フラッシュパッケージ230は、仮想ブロックグループに割り当てる実ブロックの数が限界をこえると、この旨を、ストレージコントローラ200に通知する。この通知をうけとると、ストレージコントローラ200は、これまで1つの実ページに割り当てていた論理ボリュームを、複数(例えば2つ)に分割して、それまで使用していた実ページと新たに確保した実ページに、データを分割して格納する。もちろん、3つ以上の実ページにデータが格納されても、本発明は有効である。
移動中フラグ2109、移動先実ページ情報2110、移動待ちフラグ2111は、当該実ページのデータを別の実ページに移動するときに使用される情報である。移動中フラグ2109は、この実ページのデータを別の実ページに移動中のときにONにされるフラグである。移動先実ページ情報2110は、この実ページのデータを移動している移動先の実ページのアドレスを表す情報である。移動待ちフラグ2111は、当該実ページ内のデータを移動すると決定したときにONにされるフラグである。
図8は、フラッシュパッケージ情報2500の形式である。
フラッシュパッケージ情報2500は、フラッシュパッケージ230ごとに存在する。フラッシュパッケージ情報2500は、フラッシュパッケージID2501、フラッシュパッケージ仮想容量2502、及び、仮想ブロック容量2503を含む。
フラッシュパッケージID2501は、当該フラッシュパッケージ230の識別子である。
フラッシュパッケージ仮想容量2502は、当該フラッシュパッケージ230の仮想容量を表す。
仮想ブロック容量2503は、仮想ブロックの容量である。フラッシュパッケージ仮想容量2502が表す値を仮想ブロック容量2503を表す値で割った値が、このフラッシュパッケージ230に基づく仮想ブロックの数となる。本実施例では、このフラッシュパッケージ仮想容量2502を表す値が、フラッシュパッケージ230の圧縮率などにより調整される。すでに述べたが、本実施例では、フラッシュパッケージ230がそのパッケージ230の仮想容量を決定するが、その仮想容量は、ストレージコントローラ200が決定してもよい。フラッシュパッケージ230から、仮想容量が変化した旨の通知を受けると、ストレージコントローラ200は、この値を、フラッシュパッケージ仮想容量2502に設定する。
図9は、フラッシュパッケージグループ情報2300の形式を示す。
フラッシュパッケージグループ情報2300は、フラッシュパッケージグループ280ごとに存在する。フラッシュパッケージグループ情報2300は、フラッシュパッケージグループID2301、パッケージグループRAIDタイプ2302、実ページ数2303、空き実ページ数2304、フラッシュパッケージポインタ2305、及び、使用不可実ページ数2306を含む。
フラッシュパッケージグループID2301は、当該フラッシュパッケージグループ280の識別子である。
パッケージグループRAIDタイプ2302は、当該フラッシュパッケージグループ280のRAIDタイプである。本実施例におけるRAIDタイプは、論理ボリュームRAIDタイプ2003を説明したときに述べたとおりである。
実ページ数2303は、フラッシュパッケージグループ280に基づく実ページの数を表す。空き実ページ数2304は、フラッシュパッケージグループ280に基づく複数の実ページのうちの空きの実ページ(空きの実ページ)の数を表す。使用不可実ページ数2306は、フラッシュパッケージグループ280に基づく複数の実ページのうちの使用不可能な実ページの数を表す。すでに述べたように、本実施例における1つの特徴は、圧縮率によって、フラッシュパッケージ230の仮想容量が変化する点である。フラッシュパッケージ230の仮想容量が変化したとき、実ページ数2303及び空き実ページ数2304も変化する。以下、これを説明する。まず、当該フラッシュパッケージ230の仮想容量が変化すると、当該フラッシュパッケージグループ280の実ページの数も変化することになる。これを、具体的に示す。まず、RAIDの考え方から、同一フラッシュパッケージグループ280内のフラッシュパッケージ230では使用可能な容量は等しいことが前提となる。故に、式は、
実ページ数2303=(フラッシュパッケージグループ280内のフラッシュパッケージ230の最小のフラッシュパッケージ仮想容量2502)*(フラッシュパッケージグループ280内のフラッシュパッケージ230の数)/(実ページサイズ)、
になる。従って、当該フラッシュパッケージグループ280内のフラッシュパッケージ230の最小のフラッシュパッケージ仮想容量2502が変化した場合、実ページ数2303も変化する。同様に、空き実ページ数2304も変化する。逆に、これは、使用不可になった実ページの数も変化したことになるので、使用不可実ページ数2306も変化することになる。例えば、実ページ数2303が、10増加した場合、空き実ページ数2304も10増加し、使用不可実ページ数2305は10減少する。なお、すでに、述べたが、本実施例では、フラッシュパッケージ230がこの容量を決定するが、ストレージコントローラ200が決定してもよい。
フラッシュパッケージポインタ2305は、当該フラッシュパッケージグループ280に属するフラッシュパッケージ230のフラッシュパッケージ情報2500へのポインタである。パッケージポインタ2305の数は、当該フラッシュパッケージグループ280に属するフラッシュパッケージ230の数であるが、これは、パッケージグループRAIDタイプ2302によって決まる値である。
図4に示した空きページ管理情報ポインタ2200は、フラッシュパッケージグループ280ごとに設けられる情報である。
図10は、空きページ管理情報ポインタ2200によって管理される空き実ページの集合を表している。
この構造を、空き実ページ情報2100キュー2201と呼ぶ。空き実ページとは、仮想ページに割り当てられていない実ページ(仮想ページに空きの実ページ)を意味する。また、空き実ページに対応した実ページ情報を空き実ページ情報2100と呼ぶ。空きページ管理情報ポインタ2200は、先頭の空き実ページ情報2100のアドレスをさす。次に、先頭の実ページ情報2100の中の空きページポインタ2103が次の空き実ページ情報2100を指す。図9では、最後の空き実ページ情報2100の空き実ページポインタ2103は、空きページ管理情報ポインタ2200を示しているが、ヌル値でもよい。ストレージコントローラ200は、実ページを割り当てていない仮想ページに書き込み要求を受け付けると、論理ボリュームRAIDタイプ2003と同一のフラッシュパッケージグループ280の中のいずれか、例えば、空き実ページ数の最も多いフラッシュパッケージグループ280を空きページ管理情報ポインタ2200から、空き実ページを探し、見つかった空き実ページを仮想ページに割り当てる。
図4に示した使用不可ページ管理情報ポインタ2700は、フラッシュパッケージグループ280ごとに設けられる情報である。
図11は、使用不可ページ管理情報ポインタ2700によって管理される使用不可実ページの集合を表している。
この構造を、使用不可ページ管理情報キュー2701と呼ぶ。その構造は、空きページ管理情報キュー2201と同じである。フラッシュパッケージ230の仮想容量が少なくなり、実ページ数2303の数が少なくなった場合、その数だけ、空きページ管理情報キュー2201で管理されている実ページ情報2100が、使用不可ページ管理情報キュー2701に移される。逆に、フラッシュパッケージ230の仮想容量が多くなり、実ページ数2303の数が多くなった場合、その数だけ、使用不可ページ管理情報キュー2701で管理されている実ページ情報2100が、空きページ管理情報キュー2201に移される。本実施例では、ストレージコントローラ200が、上位レベルの容量仮想化機能、フラッシュパッケージ230が下位レベルの容量仮想化機能をもつ。このため、ストレージコントローラ110は、フラッシュパッケージ230の仮想容量が変化しても、実ページ情報2100をすでに説明したような方法で移動させるだけで良い。実ページ情報2100が使用不可ページ管理情報キュー2701に関連付けられた場合、その情報2100に対応する実ページは、仮想ページに割り当てられなくなり、その実ページに含まれている仮想ブロックにはアクセスが発生しない。このため、実ブロックを他の仮想ブロックに割り当てることができる。つまり、実ブロックを有効に使用することができる。
空き論理ボリューム情報ポインタ2900は、ストレージコントローラ200に設けられる情報で、空き状態にある論理ボリューム情報2000を管理する。図37に示すように、空き状態にある論理ボリューム情報2000は、空き論理ボリューム情報キュー2901を構成する。この構成は、図10及び図11に示した構成と同様なので、説明を省略する。ストレージコントローラ200が、論理ボリュームの生成の要求を受けたとき、空き論理ボリューム情報ポインタ2900が示す論理ボリューム情報2000を特定し、その情報2000を使用する。また、ストレージコントローラ200は、ある論理ボリュームを消去したとき、該当する論理ボリューム情報2000の必要な情報を消去して、空き論理ボリューム情報キュー2901に戻す。
次に、フラッシュパッケージ230が有する管理情報について説明する。フラッシュパッケージ230は、パッケージメモリ320内に管理情報をもつ。
図12は、パッケージメモリ320に格納される管理情報を示している。
パッケージメモリ320に、パッケージ情報3000、チップ情報3100、仮想ブロック情報3200、実ブロック情報3300、及び、空き実ブロック情報ポインタ3400が格納される。これらの情報のうちの少なくとも1種類の情報が、下位レベルの容量仮想化技術及び/又は圧縮技術を実現するために使用される。本実施例では、フラッシュパッケージ230が、下位レベルの容量仮想化技術及び圧縮技術を実現する。ただし、本発明は、下位レベルの容量仮想化技術及び圧縮技術をストレージコントローラ200が実現してもよい。この場合、図13に示すように、図12に示した情報とほぼ同様の情報が、共有メモリ220に格納されることになる。図13に示した構成では、図13に示した情報が、ストレージコントローラ200が参照及び更新するので、図12に示したそれぞれの情報とは、若干相違が生ずる。したがって、本実施例では、フラッシュパッケージ230が、下位レベルの容量仮想化技術、圧縮技術を実現するものとする。
図14は、パッケージ情報3000の形式である。
パッケージ情報3000は、パッケージID3001、仮想パッケージ容量3002、実パッケージ容量3003、フラッシュブロック容量3004、パッケージブロック容量3005、パッケージデータ格納量3006、パッケージ圧縮データ格納量3007、セグメント容量3008、内部情報格納ブロック数3009、及び、内部情報格納アドレス3010を含む。
パッケージID3001は、当該フラッシュパッケージ230の識別子である。
仮想パッケージ容量3002は、ストレージコントローラ200から見た当該フラッシュパッケージ230の仮想容量を表す。本実施例の1つの特徴は、圧縮率の変化によって、この仮想容量を、フラッシュパッケージ230が調整する点である。すでに述べたように、この調整は、ストレージコントローラ200が実施してもよい。
実パッケージ容量3003は、当該フラッシュパッケージグループ280の物理容量、具体的には、当該フラッシュパッケージグループ280内にストレージコントローラ200が実際にデータを物理的に格納できる容量を表す。
フラッシュブロック容量3004は、フラッシュメモリの消去単位であるブロックの物理的な容量を表す。
パッケージブロック容量3005は、フラッシュパッケージ230における実ブロックの容量を表す。
パッケージデータ格納量3006は、ストレージコントローラ200から受けたライトデータの圧縮前の合計値を表す。
パッケージ圧縮データ格納量3007は、ストレージコントローラ200から受けたライトデータの圧縮後の合計値を表す。当該実施例では、フラッシュメモリの読み書き単位を「セグメント」と呼ぶ。
セグメント容量3008は、セグメントの容量を表す。
内部情報格納ブロック数3009は、内部情報(パッケージメモリ320に格納されたパッケージ情報3000、チップ情報3100、仮想ブロック情報3200、実ブロック情報3300及び空き実ブロックポインタ3400を含んだ情報)の退避先のブロックの数である。内部情報は、例えば、電源OFF時又は障害発生時に退避される。
内部情報格納アドレス3010は、内部情報が格納されている記憶領域のアドレス(パッケージメモリ320における格納領域のアドレス)を表す。重要な情報(例えば、パッケージ情報3000、チップ情報3100、仮想ブロック情報3200、実ブロック情報3300、空き実ブロックポインタ3400)は、n重に格納されてもよい。また、退避される回数はそう多くないので、ブロックの消去回数なども問題にならないと考えられる。
当該フラッシュパッケージ230がもつ実ブロックの総数を表す情報が、パッケージ情報3000に含まれて良い。例えば、内部情報格納ブロック数3009の他に、フラッシュパッケージ230から割り当て可能なブロックの数、フラッシュパッケージ230に基づく障害ブロックの数等を表す情報が、パッケージ情報3000に含まれていても良い。パッケージデータ格納量3006、障害ブロック数、内部情報格納ブロック数3009の合計が、このフラッシュパッケージがもつ実ブロックの総数で良い。
図15は、チップ情報3100の形式である。
チップ情報3100は、フラッシュチップ300ごとに存在する情報である。チップ情報3100は、チップID3101、チップ実ブロック数3102、チップ内空き実ブロック数3103、及び、接続バスID3104を含む。
チップID3101は、当該フラッシュチップ300の識別子である。
実チップブロック数3102は、当該フラッシュチップ300がもつ実ブロックの数を表す。
チップ内空き実ブロック数3103は、当該フラッシュチップ300の中の空き実ブロックの数を示している。空き実ブロックとは、仮想ブロックに割り当てられていない実ブロック(仮想ブロックに割り当て可能な実ブロック)である。
接続バスID3104は、当該フラッシュチップ300が接続されているパッケージバス340の識別子である。
図16は、仮想ブロック情報3200の形式である。
仮想ブロック情報3200は、仮想ブロックグループ対応に存在する情報である。仮想ブロック情報3200は、仮想ブロックのアドレス順に並んでいるものとする。最初の仮想ブロック情報3200が、先頭の仮想ブロックからm個の仮想ブロックに対応する。仮想ブロック情報3200は、仮想ブロックグループ識別子3201、実ブロック情報ポインタ3202、データ格納量3203、圧縮データ格納量3204、世代数3209、世代ID3208、世代仮想セグメントアドレスポインタ3205、及び世代圧縮仮想セグメントデータ量3206を含む。フラッシュメモリの読み書き単位は、通常、「ページ」と呼ばれるが、本実施例は、ストレージコントローラ200が行う容量仮想化の単位とするため、本実施例では、フラッシュメモリの読み書き単位を「セグメント」と呼ぶ。本実施例では、フラッシュメモリに書き込むデータが圧縮されて格納される。圧縮されたデータが格納されるセグメントを「実セグメント」と呼ぶ。圧縮前の仮想的なセグメントを「仮想セグメント」と呼ぶ。本実施例では、1つ以上の仮想セグメントを圧縮して、実セグメントに格納する。
仮想ブロックグループ識別子3201は、対応する仮想ブロックグループの識別子である。
実ブロック情報ポインタ3202は、対応する仮想ブロックを割り当てた実ブロックの実ブロック情報3300へのポインタである。実ブロック情報ポインタ3202は、例えば(m+1)個存在する。実ブロック情報ポインタ3202は、実ブロックを割り当ていないときには、ヌル値となる。当該仮想ブロックグループに割り当てている実ブロックの数をj個(min(k,L(<1)*当該仮想ブロックグループに割り当てた論理ブロック数)*(m+1)個以下)とすると、先頭からj個の実ブロック情報ポインタ3202が有効である。
世代ID3208は、当該仮想ブロックグループに格納されている論理ブロックグループの識別子、すなわち、ストレージコントローラ200から受け取ったグループ内GIID2006とグループ内BKID2007に相当する情報である。
世代数3207は、当該仮想セグメントグループに格納されている論理ボリュームの世代の数である。本実施例では、1つの仮想セグメントグループで対応可能な世代数をk個とするので、世代ID3208の領域の数は、k個あり、先頭の世代ID3208から順に有効な値が設定され、後のほうには、ヌル値が設定されていることになる。本実施例では、1つの仮想ページに、1つの論理ボリュームグループを構成する複数の論理ボリュームのデータが書き込まれるので、仮想ブロックグループにも、複数の論理ボリュームのデータが格納される。
仮想ブロックグループデータ格納量3203は、当該仮想ブロックグループに格納されている圧縮前のデータ量をあらわす。最大容量は、仮想ブロックグループの容量となる。一方、圧縮データ格納量3204は、圧縮後のデータの格納量である。なお、フラッシュメモリの場合、仮想セグメントの内容が書き換えられると、別の実ブロックに格納するため、同一の仮想セグメントのデータが複数個所に存在する。データ格納量3203、圧縮データ格納量3204は、最新の仮想セグメントの格納量を計算した値である。
世代ID3208は、論理ボリュームを区別するための識別子である。なお、本実施例では、図16に示すように、世代ID3208は、仮想ブロック情報3200にp個存在するとする(pは1以上の整数)。また、本実施例では、ストレージコントローラ200が、フラッシュパッケージ230に、アクセス要求(リード要求、ライト要求)を発行する際には、複数の論理ボリュームを区別するため、識別子をつける。この識別子は、GIID2006又はBKID2007(図5参照)に示される値である。フラッシュパッケージ230は、ストレージコントローラ200から、この識別子を受け取ると、世代ID3208をサーチして、まだ登録していないなら、この値を、まだ値を格納していない世代ID3208に登録する。なお、有効な識別子を格納していない世代ID3208には、ヌル値が入っているものとする。
世代仮想セグメントアドレスポインタ3205は、論理ボリューム毎に、対応する仮想セグメントが、当該仮想ブロックグループに割り当てた実ブロックに対応する実ブロック情報3300の内何番目の情報かを示す識別子と、その実ブロック内のどのアドレスに格納されているかとを示すポインタである。
世代圧縮仮想セグメントデータ量3206は、対応する仮想セグメントの圧縮後のデータ量である。したがって、世代仮想セグメントアドレスポインタ3205の領域の数、世代圧縮仮想セグメントデータ量3206の領域の数は、仮想ブロックグループ内の仮想セグメントの数(フラッシュブロック容量3003*m/セグメント容量)に世代ID3208の数(k)をかけた値に等しい。したがって、最初の仮想ブロックグループ内の仮想セグメントの数の世代仮想セグメントアドレスポインタ3205が、先頭の世代ID3208に相当する論理ボリュームのデータを示すことになる。以下、次の仮想ブロックグループ内の仮想セグメントの数の世代仮想セグメントアドレスポインタ3205が、次の世代ID3208に相当する論理ボリュームのデータを示すことになる。世代圧縮仮想セグメントデータ量3206も同様である。なお、本実施例では、世代仮想セグメントアドレスポインタ3205、世代圧縮仮想セグメントデータ量3206を仮想セグメントごとにもつことにしたが、2つ以上の仮想セグメントごとに同様の情報をもっても、本発明は有効である。
図17は、実ブロック情報3300の形式である。
実ブロック情報3300は、実ブロックごとに存在する情報である。実ブロック情報3300は、実ブロック識別子3301、空き実ブロックポインタ3302、及び、実ブロック内空き容量3304を含む。
実ブロック識別子3301は、対応する実ブロックの識別子であり、例えば、この実ブロックが、どのフラッシュチップ300のどのアドレスに相当するブロックかを示す。
空き実ブロックポインタ3302は、対応する実ブロックが仮想ブロックに割り当てられていない(空き状態にある)時、次の空き状態にある実ブロックの実ブロック情報3300を指している。
実ブロック内空き容量3304は、対応する実ブロックの現在の空き容量を示す。パッケージプロセッサ310は、対応する実ブロックに対し、空き容量以下のライトデータを格納できる。パッケージプロセッサ310は、ライトデータを格納した後、格納したライトデータの量だけ、実ブロック内空き容量3304を削減する。
空き実ブロック情報ポインタ3400は、フラッシュチップ300対応に存在する。図18は、空き実ブロック情報ポインタ3400によって管理される空き実ブロックの集合を表している。空きブロック情報ポインタ3400は、先頭の空き実ブロックの実ブロック情報3300のアドレスをさす。次に、先頭の空き実ブロックの実ブロック情報3300の中の空き実ブロックポインタ3302が、次の空き実ブロックの実ブロック情報3300を示す。図18では、最後の空き実ブロックの実ブロック情報3300の空き実ブロックポインタ2103は、空きブロック情報ポインタ3400を示しているが、ヌル値でもよい。パッケージプロセッサ310は、実ブロックを割り当てていない仮想ページに属するアドレスを指定したライト要求をストレージコントローラ200から受けると、フラッシュチップ300の中のいずれかから(例えば、空き実ブロックの数の最も多いフラッシュチップ300に対応する空きブロック情報ポインタ3400を基に)、空き実ブロックを探し、見つけた空き実ブロックを仮想ブロックに割り当てる。パッケージプロセッサ310は、割り当てた空き実ブロックに、上記受けたライト要求に従うデータを書き込む。
次に、上記に説明した管理情報を用いて、ストレージコントローラ200及びフラッシュパッケージ230が実行する動作の説明を行う。
まず、ストレージコントローラ200の動作を説明する。ストレージコントローラ200の動作は、ストレージコントローラ200内のプロセッサ260が実行し、そのプログラムは、メモリ270内に格納されている。
図19は、メモリ270に格納されているプログラムが示している。
本実施例に関するプログラムは、論理ボリューム生成処理部4600、リード処理実行部4000、ライト要求受付部4100、ライトアフタ処理実行部4200、実ページ移動処理実行部4500、実ページ分割処理部4300である。これらのプログラムは、プロセッサ260で実行されるプログラムである。これらのプログラムのうちの少なくとも1つが、上位レベルのウエアレベリング技術、容量仮想化技術を実現するプログラムである。なお、すでに述べたが、本実施例は、下位レベルのウエアレベリング技術、容量仮想化技術を実現するのは、フラッシュパッケージ230であるが、本実施例は、下位レベルのウエアレベリング技術、容量仮想化技術をストレージコントローラ200が実行してもよい。その場合、下位レベルのウエアレベリング技術、容量仮想化技術は、ストレージコントローラ200で実行される。したがって、上位レベルのプログラムと下位レベルのプログラムの双方が、ストレージコントローラ200で実行されるので、プログラム間のインターフェイスが異なってくるが、上位レベルのプログラムが実行する内容は基本的に大きな相違はない。したがって、本実施例では、下位レベルのウエアレベリング技術、容量仮想化技術を実現するのは、フラッシュパッケージ230であることを前提に、論理ボリューム生成処理部4600、リード処理実行部4000、ライト要求受付部4100、ライトアフタ処理実行部4200、実ページ移動処理実行部4500、実ページ分割処理部4300の処理フローを詳細に説明する。なお、本実施例では、ホスト110からのリード要求及びライト要求は、フラッシュメモリのリード・ライト単位であるセグメント(一般のフラッシュメモリの用語ではページ)境界で発行されるものとする。もちろん、本発明は、ホスト110からのリード要求及びライト要求の少なくとも一方が、セグメントの一部のみを指定した場合にも有効である。
図30は、論理ボリューム生成処理部4600の処理フローである。
図30に示す処理の開始の契機は、例えば、論理ボリューム生成処理部4600が、ホスト110又は管理サーバ130から、ゴールデンイメージを格納した論理ボリュームをベースに新しい論理ボリュームを生成せよというGI生成要求を受け取ったとき、又は、オンラインボリュームである或る論理ボリュームから新たな論理ボリュームにバックアップを生成せよというバックアップ要求を受け取ったときである。このとき、ストレージコントローラ200は、ベースとなる論理ボリューム(プライマリボリューム)の識別子と新たな論理ボリューム(差分ボリューム)の識別子もホスト110又は管理サーバ130から受け取る。それらの識別子は、GI生成要求及びバックアップ要求に含まれていて良い。
ステップ19000:論理ボリューム生成処理部4600は、空き状態にある論理ボリューム情報2000を、空き論理ボリューム情報キュー2901をサーチして確保する。生成処理部4600は、差分ボリュームの識別子を、論理ボリュームID2001に設定する。
ステップ19001:生成処理部4600は、プライマリボリュームの識別子を用いて、ベースとなる論理ボリュームの論理ボリューム情報2000を見つける。
ステップ19002: 生成処理部4600は、プライマリボリュームの論理ボリューム情報2000の論理容量2002、論理ボリュームRAIDグループタイプ2003、論理ボリュームグループタイプ2005、実ページポインタ2011、繰り返し情報2012を、新たな論理ボリュームの論理ボリューム2000の対応する情報にコピーする。
ステップ19003: 生成処理部4600は、受け取った要求がGI生成要求か否かを判断する。生成処理部4600は、受け取った要求が、バックアップ要求であれば、ステップ19008へジャンプし、GI生成要求であれば、ステップ19004を行う。
ステップ19004:生成処理部4600は、プライマリボリュームの論理ボリュームグループタイプ2005が、GIボリュームかどうかをチェックする。YESなら、ステップ19006へジャンプする。
ステップ19005:生成処理部4600は、プライマリボリュームの論理ボリュームグループタイプ2005が、オンラインボリューム、かつ、GIポインタ2008がヌルかどうかをチェックする。条件が成立しないなら、ステップ19011へジャンプする。
ステップ19006:生成処理部4600は、新たに確保した論理ボリューム情報のGIポインタ2008に、プライマリボリュームの論理ボリューム情報2000のアドレスを設定する。また、生成処理部4600は、差分ボリュームの論理ボリュームグループタイプ2005を、オンラインボリュームにする。また、生成処理部4600は、プライマリボリュームの論理ボリューム情報2000の論理ボリュームグループタイプ2005をGIボリューム(ゴールデンイメージ)とする。
ステップ19007:生成処理部4600は、プライマリボリュームのGI順ポインタ2009をたどる。この際、生成処理部4600は、定義されているグループ内GI(Golden Image)ID2006を記憶する。生成処理部4600は、最後尾の論理ボリューム情報の2000に、新たに確保した論理ボリューム情報2000を追加する。この際、生成処理部4600は、関連する論理ボリューム情報2000のGI順ポインタ2009とGI逆ポインタ2010を更新する。生成処理部4600は、差分ボリュームのグループ内GIID2006に、そのID2006として設定されている識別子より1大きい値を設定する。この後、生成処理部4600は、GI生成要求の送信元(ホスト110又は管理サーバ130)に正常終了報告をして、処理を終了する。
ステップ19008:生成処理部4600は、プライマリボリュームの論理ボリュームグループタイプ2005が、オンラインボリュームかをチェックする。Noであれば、ステップ19011へジャンプする。
ステップ19009:生成処理部4600は、新たに確保した論理ボリューム情報2000の論理ボリュームグループタイプ2005を、オンラインボリュームにする。生成処理部4600は、それまでの論理ボリューム情報2000の論理ボリュームタイプをバックアップボリュームにする。
ステップ19010:生成処理部4600は、プライマリボリュームのBK順ポインタ2013をたどる。この際、生成処理部4600は、定義されているグループ内GI(Golden Image)ID2006及びグループ内BK(BacKup)ID2007を記憶する。生成処理部4600は、プライマリボリュームの最後尾の論理ボリューム情報の2000に、新たに確保した論理ボリューム情報2000を追加する。この際、生成処理部4600は、関連する論理ボリューム情報2000のBK順ポインタ2013とBK逆ポインタ2014を更新する。生成処理部4600は、プライマリボリュームのグループ内BK(BacKup)ID2007に、ID2007として設定されている識別子より1大きい値を設定する。この後、生成処理部4600は、バックアップ要求の送信元(ホスト110又は管理サーバ130)に正常終了報告をして、処理を終了する。
ステップ19011:生成処理部4600は、無効な要求を受け取ったので、新たに確保した論理ボリューム情報2000に設定した情報をクリアして、当該論理ボリューム情報2000を、空き論理ボリューム情報キュー2901へ戻す。この後、生成処理部4600は、GI生成要求又はバックアップ要求の送信元(ホスト110又は管理サーバ130)に異常終了報告をして、処理を終了する。
図20は、リード処理実行部4000の処理フローである。
リード処理実行部4000は、ホスト110から、ストレージコントローラ200が、リード要求を受け付けたときに実行される。本実施例では、仮想セグメント1つ相当のデータが読み出されるものとする。なお、本発明は、複数の仮想セグメントを読み出す場合、あるいは、仮想セグメントの一部を読み出す場合も有効である。
ステップ5000:リード処理実行部4000は、まず、指定された論理ボリュームから対応する論理ボリューム情報2000を見つける。
ステップ5001:リード処理実行部4000受け取ったリード要求で指定されたリード対象とするアドレスから、対応する仮想ページとアクセスする仮想ページ内の相対アドレスを計算する。次に、リード処理実行部4000リード対象となったデータが、キャッシュメモリ210にヒットしているかをチェックする。これは、公知の技術である。ヒットしている場合、ステップ5009へジャンプする。
ステップ5002:ミスしている場合、リード対象としているデータをキャッシュメモリ210にロードする必要がある。ます、当該ステップでは、リード処理実行部4000は、リード対象となった仮想ページに割り当てた実ページに対応する実ページ情報2100を、論理ブロック管理情報2000の実ページポインタ2011から特定する。
ステップ5003:リード処理実行部4000は、特定した実ページ情報2100のパッケージグループ2101、実ページアドレス2102から、当該実ページが属するフラッシュパッケージグループ280と当該実ページのフラッシュパッケージグループ280内の先頭アドレスを得る。
ステップ5004:リード処理実行部4000は、ステップ5001で得た仮想ページ内の相対アドレスとパッケージグループ内RAIDタイプ2302から、当該要求のアクセス対象となる実ページ内の相対アドレスを計算する。計算した実ページ内相対アドレスと、パッケージグループ内RAIDタイプ2302と、フラッシュパッケージポインタ2305とを基に、リード処理実行部4000は、どのフラッシュパッケージ230のどのアドレスをアクセスかを特定する。また、リード処理実行部4000は、指定された論理ボリュームの論理ボリューム情報2000のGIID2006とBKID2007を特定する。
ステップ5005:ステップ5004で特定したフラッシュパッケージ230に対し、リード処理実行部4000は、特定したアドレスを指定したリード要求を発行する。この際、リード要求は、どの世代の情報かを識別するために特定されたGIID2006とBKID2007が示す値を含む。
ステップ5006:リード処理実行部4000は、フラッシュパッケージ230からデータが送られてくるのを待つ。
ステップ5007:リード処理実行部4000は、要求したデータが送られてきたかをチェックする。例えば、本実施例では、多数の世代のバックアップボリュームが生成され、かつ、ライト処理が発生しない領域は、実ページの分割の結果、古い世代のデータとして、リード対象のデータが、別の実ページに移動している可能性がある。この場合、フラッシュパッケージは、要求されたデータが存在しないことを通知してくる。この場合、ストレージコントローラ2200は、さらに、古い世代のバックアップボリューム内のデータ、あるいは、GIボリューム内のデータを格納した実ページへリード要求を発行する必要がある。データが送られてきた場合、ステップ5009へジャンプする。
ステップ5007:リード処理実行部4000は、当該論理ボリューム情報2000のBK逆ポインタ2014を遡って、実ページが割り当てられている論理ボリューム情報2000を探す。みつかった場合、リード処理実行部4000は、当該論理ボリューム情報2000のアドレスを保持して、ステップ5001へジャンプする。
ステップ5008:BK逆ポインタを最も古いバックアップボリュームまでたどっても、データが見つからない場合、リード処理実行部4000は、最も古いボリュームタイプのBK逆ポインタ2014を基に、ボリュームタイプがオンラインボリュームである論理ボリュームの論理ボリューム情報2000を見つけ、見つかった情報2000におけるGIポインタ2008を基に、ゴールデンイメージを格納した論理ボリューム情報2000を見つけ、ステップ5001へジャンプする。GIボリュームまでたどれば、該当するデータがみつかるはずである。GIボリュームが定義されていない場合、もっとも古いバックアップボリュームまでたどれば、該当するデータが見つかるはずである。
ステップ5009:リード処理実行部4000は、フラッシュパッケージ230から送られてきたデータをキャシュメモリ210に格納する。
ステップ5010:リード処理実行部4000は、当該リード要求で指定された、キャッシュメモリ210上のデータを、ホスト110へ送り、ホスト110に正常終了報告を行い、処理を完了する。
図21は、ライト要求受付部4100の処理フローである。
ライト要求受付部4100は、ストレージコントローラ200が、ホスト110からライト要求を受け付けたときに実行される。本実施例では、仮想セグメント1つ相当のデータが書き込まれるものとする。なお、本発明は、複数の仮想セグメントにデータが書き込まれる場合、あるいは、仮想セグメントの一部にデータが書き込まれる場合も有効である。
ステップ6000:ライト要求受付部4100は、ライト要求で指定された論理ボリュームに対応する論理ボリューム情報2000を見つける。さらに、ライト要求受付部4100は、受け取ったライト要求で指定されたライト対象とするアドレスから、対応する仮想ページとアクセスする仮想ページ内の相対アドレスを計算する。
ステップ6001:ライト要求受付部4100は、当該論理ボリューム情報2000の論理ボリュームグループタイプ2005がバックアップボリューム又はGIボリュームかをチェックする。本実施例では、バックアップボリューム又はGIボリュームに対するライト処理は無効とする。なお、本発明は、バックアップボリューム又はGIボリュームに対するにライト処理を実行しても有効である。ライト先の論理ボリュームがバックアップボリューム又はGIボリュームの場合、ステップ6010へジャンプする。
ステップ6002:ライト要求受付部4100は、ライト要求で指定されている論理ボリューム情報2000の中で、ステップ6000で得た仮想ページに実ページが割り当てられているかを、実ページポインタ2011を参照して、チェックする。割り当てている場合、ステップ6009へジャンプする。
ステップ6003: 残っているのは、論理ボリュームグループタイプ2005が、オンラインボリュームということになる。ライト要求受付部4100は、当該論理ボリューム情報2000のGI順ポインタ2009、GI逆ポインタ2010、BK順ポインタ2013、BK逆ポインタ2014をヌルでなければ探索する。まず、ライト要求受付部4100は、BK逆ポインタ2014を探索する。ライト要求受付部4100は、他の論理ボリュームで、すでに、実ページを割り当てている論理ボリュームがあるかを見つける。みつからなかった場合、ステップ6006へジャンプする。
ステップ6004:みつかった場合、ライト要求受付部4100は、当該実ページに割り当てられていた論理ボリューム情報2000の数がk個になっているかをチェックする。なっていれば、ステップ6007へジャンプする。
ステップ6005:なっていない場合、ライト要求受付部4100は、当該実ベージに新たな論理ボリュームを割り当てることにする。まず、ライト要求受付部4100は、当該論理ボリューム情報2000の実ページポインタ2011に、見出した実ページポインタ2011をコピーする。また、ライト要求受付部4100は、見出した実ページ情報2100の論理ボリューム数2112を1増やし、論理ボリューム情報ポインタ2113に当該論理ボリューム情報2000のアドレスを設定する。この後、ステップ6009へジャンプする。
ステップ6006:次に、ライト要求受付部4100は、GI順ポインタ2009とGI逆ポインタ2010をサーチする。ここでは、ライト要求受付部4100は、GI逆ポインタを1つたどったあと、GI順ポインタを1つたどるとする。割り当てられている実ページ情報2100がなかった場合、ステップ6008へジャンプする。みつかった場合、ステップ6004へジャンプする。
ステップ6007:ライト要求受付部4100は、実ページの分割を行うため、実ページ分割処理部4300をコールする。この後、ステップ6009へジャンプする。
ステップ6008:当該ステップでは、ライト要求受付部4100は、対応する仮想ページに実ページを割り当てる。ライト要求受付部4100は、論理ボリューム情報2000のRAIDグループタイプ2003、フラッシュパッケージグループ情報2300の、パッケージグループRAIDタイプ2302、空き実ページ数2304等を参照して、どのフラッシュパッケージグループ280の実ページを割り当てるかを決める
。その後、ライト要求受付部4100は、対応するフラッシュパッケージグループ280の空きページ管理情報ポインタ2200を参照して、先頭の実ページ情報2100を、当該実ページポインタ2011が示すようにする。これで、仮想ページに実ページが割り当てられたことになる。なお、ライト要求受付部4100は、空きページ管理情報ポインタ2200を、次の実ページ情報2100(仮想ページに割り当てた実ページの実ページ情報2100の中の空きページポインタ2103が示す実ページ情報2100)を示すようにし、さらに、仮想ページに割り当てた実ページの実ページ情報2100の中の空きページポインタ2103をヌルにする。ライト要求受付部4100は、論理ボリューム数2112に、1を設定する。また、ライト要求受付部4100は、論理ボリューム情報ポインタ2113の先頭に、当該論理ボリューム情報2000のアドレスを設定する。また、ライト要求受付部4100は、当該実ページに対応するフラッシュパッケージグループ情報2300の空きページ数2304の数を減らす。仮想ページを実ページに割り当てる処理を、本実施例ではライト要求を受け付けたときに実施したが、この割り当て処理は、フラッシュパッケージ230へデータを格納するまでに実行されればよい。
ステップ6009:ライト要求受付部4100は、ホスト110から当該ライト要求で指定されたライトデータを、キャッシュメモリ210に格納する。この際、ライト要求受付部4100は、ライトデータに、グループ内GIID2006、グループ内BKID2007を付与する。ライト要求受付部4100は、ホスト110に正常終了報告を行い、処理を完了する。
ステップ6010:ライト要求受付部4100は、ホスト110に対し要求は無効ということを報告する。この後、処理を終了する。
フラッシュパッケージグループ280は、RAID構成をとるので、キャッシュメモリ210上に格納したライトデータに対して、冗長データを生成する必要があることがある。ただし、これは、公知の方法であるので、詳細に説明はしない。また、実ページの中には、冗長データを格納する領域も含まれているので、ライトデータに対応する冗長データの実ページ内の格納アドレスも一意に定まる。冗長データも、一度、キャッシュメモリ210に格納される。なお、キャッシュメモリ210上の冗長データも、ライトデータと同様に、どのフラッシュパッケージ230のどのアドレスに書き込むべきかを示す情報をつけておく。ライトデータ及び冗長データは、ライトアフタ処理実行部5200によって、フラッシュパッケージ160に書き込まれるが、ライトアフタ処理実行部5200から見ると、いずれもフラッシュパッケージ230へ書き込むデータなので、両者を区別する必要はない。同様に、フラッシュパッケージ230も、両者を区別する必要はない。
図22は、ライトアフタ処理実行部4200の処理フローである。
ライトアフタ処理実行部4200は、プロセッサ260が、適宜実行する処理である。ライトアフタ処理実行部4200は、ホスト110から受け取ったライトデータ、冗長データをフラッシュパッケージ230に書き込む処理を実行する。ただし、ライトアフタ処理実行部4200は、ライトデータ、冗長データの両者を、フラッシュパッケージ230に書き込むべきデータとして、両者を区別せずに処理する。また、フラッシュパッケージ230に発行するライト要求には、グループ内GIID2006、グループ内BKID2007が指定される。
ステップ7000:ライトアフタ処理実行部4200は、キャッシュメモリ300をサーチして、フラッシュパッケージ230に書き込むべきデータを決める。ライトアフタ処理実行部4200は、見出したデータに付与されている、フラッシュパッケージ230のIDと書き込むべきアドレスとに関する情報を取り出し、その情報を基に、しかるべきフラッシュパッケージ230に、書き込むべきアドレスを指定して、ライト要求を発行する。なお、このとき、ライトアフタ処理実行部4200は、書き込みを行う実ブロックに対応する実ブロック情報3300の移動中フラグ2109をチェックして、そのフラグ2109がonの場合、この実ページは移動中であるため、このライト要求の実行を中止し、別の書き込みデータを探す。
ステップ7001:ライトアフタ処理実行部4200は、グループ内GIID2006、グループ内BKID2007が付与した上記ライト要求をフラッシュパッケージ230へ送る。
ステップ7002:ライトアフタ処理実行部4200は、フラッシュパッケージ230からライト要求の完了報告を待つ。
ステップ7003:ライトアフタ処理実行部4200は、フラッシュパッケージ230から当該ライト要求に関する完了報告をチェックする。完了報告は、例えば、データ格納量(ステップ7001で送ったライトデータの量)及び圧縮後データ量(ステップ7001で送ったライトデータの圧縮後の量)を表す情報を含む。この情報は、完了報告とは別のタイミングで、フラッシュパッケージ230からストレージコントローラ200に送られても良い。ライトアフタ処理実行部4200は、当該ライト要求に対する完了報告が含む情報が表すデータ格納量及び圧縮後データ量を特定し、ライト先の実ページに対応するページデータ格納量2104に、特定したデータ格納量を加算し、且つ、ライト先の実ページに対応するページ圧縮後データ格納量2105に、特定した圧縮後データ格納量を加算する。
ステップ7004:ライトアフタ処理実行部4200は、プラッシュパッケージ230の仮想容量に変化があったフラッシュパッケージ230がまったくないかをチェックする。ない場合、処理を終了する。
ステップ7005:仮想容量に変化があったフラッシュパッケージ230がある場合、ライトアフタ処理実行部4200は、変化後の仮想容量を、仮想容量に変化があったフラッシュパッケージ230に対応するフラッシュパッケージ仮想容量2502に設定する。次に、ライトアフタ処理実行部4200は、仮想容量に変化があったフラッシュパッケージ230を含むフラッシュパッケージグループ280を構成する複数のフラッシュパッケージ230に対応した複数のフラッシュパッケージ仮想容量2502のうちの最小値が変化したかをチェックする。変化した場合、この変化値にあわせて、ライトアフタ処理実行部4200は、そのフラッシュパッケージグループ280に対応する実ページ数2303及び空き実ページ数2304を更新する。また、ライトアフタ処理実行部4200は、その数にあわせて、空きページ管理情報キューと使用不可ページ情報管理キューの間で、実ページ情報2100を移動する。その後、ライトアフタ処理実行部4200は、ページ移動処理(実ページ移動処理実行部4500)をコールする。その後、ライトアフタ処理実行部4200は、処理を完了する。
図24は、実ページ移動処理実行部4500の処理フローである。
実ページ移動処理実行部4500は、ライトアフタ処理実行部4200、ライトセイムコマンド処理実行部4300からコールされる。その際、仮想容量に変化があったフラッシュパッケージ230を含むフラッシュパッケージグループ280が指定される。
ステップ11000:実ページ移動処理実行部4500は、指定されたフラッシュパッケージグループ(図24の説明において「対象グループ」と言う)280に対応する空き実ページ数2304が、所定の閾値以下になっていない否か(つまり、対象グループ280に基づく空き容量が多いか否か)を判断する。この判断の結果が否定的の場合、処理が終了する。
ステップ11001:実ページ移動処理実行部4500は、対象グループを構成する複数のフラッシュパッケージ230に対応した実ページ情報2100をサーチし、ページ圧縮後データ格納量2105が表す値が大きい実ページ情報2100を見つける。ページ圧縮後データ格納量2105が表す値が大きい実ページとは、対象グループに基づく全実ページのうちページ圧縮後データ格納量2105が表す値が上位X%(Xは0より大きい値)である1以上の実ページであっても良いし、ページ圧縮後データ格納量2105が表す値が所定の閾値Z(Zは0より大きい値)以上である実ページでも良い。実ページ移動処理実行部4500は、見つけた実ページ情報2100に対応する実ページを、移動の対象候補とし、その実ページに対応する移動待ちフラグ2111をオンにする。
ステップ11002:ここでは、実ページ移動処理実行部4500は、移動先となるフラッシュパッケージグループ280を選択する。本実施例では、フラッシュパッケージグループ280は一つ選択されるが、もちろん、移動先として複数のフラッシュパッケージグループ280が選択されても良い。本実施例では、例えば、実ページ移動処理実行部4500は、空き実ページ数2104が比較的少ないフラッシュパッケージグループ280(例えば空き実ページ数2104が最も少ない或いは所定の閾値未満であるフラッシュパッケージグループ280)を移動先として選択する。次に、実ページ移動処理実行部4500は、選択した移動先のフラッシュパッケージグループ(図24の説明において「移動先グループ)280の中のどの実ページを移動先とするかを決定する。移動先の実ページを決めると、実ページ移動処理実行部4500は、移動先グループ280に対応する空きページ管理情報ポインタ2200がさす実ページ情報2100を、移動元の実ページの実ページ情報2100のコピー先実ページ情報ポインタ2110に設定する。実ページ移動処理実行部4500は、空きページ管理情報ポインタ2200を、次の空きの実ページに対応するページ管理情報2100に更新する。以上の処理が、ステップ11001で移動を決定したすべての実ページに対して実行される。以上で、各移動元実ページについて移動先ページが決まったことになる。
ステップ11003:ここでは、実ページ移動処理実行部4500は、移動元となる実ページの実ページ情報2100を決定する。具体的には、実ページ移動処理実行部4500は、移動待ちフラグ2111がオンになっている実ページ情報2100を見つける。ない場合、処理が終了し、呼び出し元に戻る。
ステップ11004:ここでは、実ページ移動処理実行部4500は、見つけた実ページ情報2100に対応する実ページがフラッシュパッケージ230のどの領域になるかを算出する。見つかった実ページ情報2100のパッケージグループ2101が示すフラッシュパッケージグループ情報2300が、該当するフラッシュパッケージグループ情報2300である。このフラッシュパッケージグループ情報2300に格納されたフラッシュパッケージポインタ2305が示すフラッシュパッケージ情報2500に対応するフラッシュパッケージ230が、コピー元の実ページの基になっているフラッシュパッケージ230である。次に、実ページ情報2100内の実ページアドレス2102と、フラッシュパッケージ情報2500のブロック容量2503から、実ページ移動処理実行部4500は、それぞれのフラッシュパッケージ230の中の移動対象となる領域を、すべてのフラッシュパッケージ230に関して特定する。
ステップ11005:実ページ移動処理実行部4500は、移動元となる実ページの基になっているフラッシュパッケージグループ280を構成する各フラッシュパッケージ230に、指定した領域の中で、データを格納した領域のデータを、キャッシュメモリ210に移動するよう要求する。
ステップ11006:実ページ移動処理実行部4500は、ステップ11005での要求の発行先のフラッシュパッケージ230からの完了報告をまつ。
ステップ11007:フラッシュパッケージ230からは、各領域(本実施例では、仮想セグメント)ごとに、仮想セグメントにデータが格納されていたか、いないかの情報と、データが格納されていた場合、その圧縮後のデータ量と格納されていたデータが、フラッシュパッケージ230から送られてくる。実ページ移動処理実行部4500は、これらの情報を、キャッシュメモリ210に格納する。
ステップ11008:実ページ移動処理実行部4500は、ここでは、移動先実ページが、その移動元実ページの基になっているフラッシュパッケージグループ280を構成するフラッシュパッケージ230の集合と、それぞれのフラッシュパッケージ230のどの仮想セグメントの集合とに該当するかを算出する。この場合、移動元の実ページに対応する実ページ情報2100の移動先実ページアドレスが示す実ページ情報2100が、移動先の実ページに対応する実ページ情報2100となる。実ページ情報2100から、フラッシュパッケージグループ280を構成するフラッシュパッケージ230の集合と、それぞれのフラッシュパッケージ230のどの領域になるかを算出する処理は、ステップ11004で説明したので省略する。
ステップ11009:実ページ移動処理実行部4500は、移動先となる実ページが割り当てられているフラッシュパッケージグループ280を構成する各フラッシュパッケージ230に、指定した領域にデータを格納するよう要求する。このとき、各フラッシュパッケージ230に送られるのは、ステップ1107でキャッシュメモリ210に格納した情報(移動元のフラッシュパッケージ230から送られてきた情報)と、移動元の実ページの中で、データを格納している領域のデータとである。
ステップ11010:実ページ移動処理実行部4500は、ステップ11009での要求の発行先のフラッシュパッケージ230からの完了報告をまつ。
ステップ11011:実ページ移動処理実行部4500は、移動元実ページを空き実ページとして管理し、且つ、移動元実ページが割り当てられていた仮想ページにその実ページに代えて移動先実ページを割り当てる。具体的には、例えば、実ページ移動処理実行部4500は、移動元の実ページに対応する実ページ情報2100を空き実ページ管理ポインタ2200につなぎ、移動元の実ページに対応する実ページ情報2100を示していた実ページポインタ2004を移動先の実ページ情報を示すようにする。また、実ページ移動処理実行部4500は、移動元実ページに対応する実ページ情報2100内のページデータ格納量2104及びページ圧縮後データ格納量2105を、移動先実ページに対応する実ページ情報2100にコピーする。その後、実ページ移動処理実行部4500は、移動元実ページ及び移動先実ページの双方に対応する実ページ情報2100における移動中フラグ2109、移動先実ページポインタ2110及び移動待ちフラグ2111を、クリアする。
ステップ11012:実ページ移動処理実行部4500は、移動元のフラッシュパッケージグループ280に対応するフラッシュパッケージグループ情報(以下、移動元グループ情報)2300と移動先のフラッシュパッケージグループ280に対応するフラッシュパッケージグループ情報(以下、移動先グループ情報)2300とを更新する。具体的には、移動元グループ情報2300内の空き実ページ数2304が表す値から1が削減され、移動先グループ情報2300内の空き実ページ数2304が表す値に1が加算される。この後、次に移動対象とする実ページを探すために、ステップ11003にジャンプする。
図23は、実ページ分割処理部4300の処理フローである。
実ページ分割処理部4300は、ライト処理実行部4100から、書き込みを行おうとした実ページに、すでに、上限であるk個の論理ボリュームが割り当てられていたとき、実ページを分割するために、コールされる。
ステップ8000:ここでは、実ページ分割処理部4300は、新たな実ページを割り当てる。このステップは、図22のステップ6008で示した処理なので、詳細な説明を省略する。
ステップ8001:実ページ分割処理部4300は、該当する実ページ情報2100(書き込みを行おうとした実ページの実ページ情報2100)を参照して、当該実ページに割り当てられている論理ボリューム情報ポインタ2113がポイントする論理ボリューム情報2000の論理ボリュームグループタイプ2005を分析して、以下のいずれに相当するかを判断する。
(1)論理ボリュームの中に、ゴールデンイメージが入っていて、さらに、その論理ボリュームを含んだ論理ボリュームグループに複数のオンラインボリュームが含まれる。この場合、オンラインボリューム単位に、実ページの分割が行われるとする。本実施例では、実ページ分割処理部4300は、オンラインボリュームのグループ内GIID2006を昇順に並べ、それぞれの実ページに割り当てる論理ボリュームの数を均等に近くなるグループ内GIID2006を境界として、それ以下のグループ内GIID2006をもつオンラインボリュームと、存在すれば、それぞれのオンラインボリュームのバックアップボリュームを、これまで割り当てていた実ページに割り当てる。また、実ページ分割処理部4300は、境界となるグループ内GIID2006より大きいグループ内GIID2006をもつオンラインボリュームと、存在すれば、それぞれのオンラインボリュームのバックアップボリュームを、新しい実ページに割り当てる。ここでは、実ページ分割処理部4300は、それまでの実ページに割り当てる論理ボリュームの数及びそれら論理ボリュームの集合と、新しい実ページに割り当てる論理ボリュームの数及びそれら論理ボリュームの集合とを分類しておく。
(2)本実施例では、上記以外は、実ページの分割が行われない。当該ライト要求の対象となる論理ボリュームが、新たな実ページに割り当てられる。
当該ステップ8001では、実ページ分割処理部4300は、(1)か(2)を分類して、(1)の場合、ステップ8003へジャンプする。
ステップ8002:実ページ分割処理部4300は、新たに割り当てた実ページ情報2100に対応する実ページに、ライトデータを書き込むことにして、コール元に戻る。
ステップ8003:実ページ分割処理部4300は、実ページの分割を行うため、ステップ6003、ステップ6006で見出した実ページから全てのデータを読み出す。この処理は、図24に示したステップ11004以下の処理と同様である。ステップ8003は、ステップ11004と同じ処理である。ここでは、当該実ページ情報2100に対応する実ページが、実ページが割り当てられているフラッシュパッケージグループ280を構成するフラッシュパッケージ230のどの領域になるかが算出される。
ステップ8004:ステップ11005と同じ処理である。実ページ分割処理部4300は、移動元となる実ページが割り当てられているフラッシュパッケージグループ280を構成する各フラッシュパッケージ230に、指定した仮想セグメントの中で、データを格納した仮想セグメントのデータをキャッシュメモリ210に移動するよう要求する。
ステップ8005:実ページ分割処理部4300は、要求を発行したすべてのフラッシュパッケージ230からの完了報告をまつ。
ステップ8006:実ページ分割処理部4300は、フラッシュパッケージ230から、各仮想ブロックグループに相当する領域ごとに、下記の情報(a)乃至(e)と、
(a)そのデータ格納量、
(b)圧縮後のデータ格納量、
(c)割り当てている世代数と世代ID、
(d)各部分領域(本実施例では仮想セグメント単位)にデータが格納されていたか、いないかの情報、
(e)その情報が、格納されていることを表す情報の場合、当該データの世代IDと、その圧縮後のデータ長を示す情報、
データを格納している領域のデータとを受ける。実ページ分割処理部4300は、これらの情報及びデータを、キャッシュメモリ210に格納する。
ステップ8007:実ページ分割処理部4300は、キャッシュメモリ210に格納された情報のうち、ステップ12001の(1)で分類した新しい分割先実ページに割り当てる論理ボリュームの集合とそれまで使用していた分割元実ページに割り当てる論理ボリュームの集合により、新しい実ページに書き込む情報とそれまで使用していた情報とに分類する。さらに、実ページ分割処理部4300は、分割先となる実ページ、分割元なる実ページのそれぞれのページデータ格納量2104、ページ圧縮後データ格納量2105に設定すべき値を算出して、記憶しておく。
ステップ8008:ここでは、実ページ分割処理部4300は、分割先となる実ページと分割元となる実ページが、割り当てられたフラッシュパッケージグループ280を構成するフラッシュパッケージ230の集合と、それぞれのフラッシュパッケージ230のどの領域になるかを算出する。フラッシュパッケージグループ280を構成するフラッシュパッケージ230の集合と、それぞれのフラッシュパッケージ230のどの領域になるかとを実ページ情報2100を基に算出する処理は、ステップ11004で説明したので省略する。
ステップ8009:実ページ分割処理部4300は、分割元となる実ページと分割先となる実ページが割り当てられているフラッシュパッケージグループ280を構成する各フラッシュパッケージ230に、指定した領域のデータを格納するよう要求する。ステップ12006でキャッシュメモリ210に格納した分割元になるフラッシュパッケージ230から送られてきた情報を、ステップ12007で、分割元の実ページに送るべき情報と分割先の実ページに送るべき情報になるが、それらの情報が、対応するフラッシュパッケージ230に送られる。
ステップ8010:実ページ分割処理部4300は、要求を発行したすべてのフラッシュパッケージ230からの完了報告をまつ。
ステップ8011:実ページ分割処理部4300は、分割先実ページに、割り当てると決定した論理ボリュームの仮想ページを割り当てる。これは、対応する論理ボリューム情報の対応する仮想ページに相当する実ページポインタ2011を分割先の実ページ情報2100を示すようにすればよい。また、実ページ分割処理部4300は、移動元の実ページ情報2100うち、ページデータ格納量2104、ページ圧縮後データ格納量2105については、ステップ12007で記憶した値を設定する。また、実ページ分割処理部4300は、論理ボリューム数2112、論理ボリューム情報ポインタ2113については、ステップ12001で分類した値を設定する。実ページ分割処理部4300は、移動先の実ページ情報2100うち、ページデータ格納量2104、ページ圧縮後データ格納量2105については、ステップ12007で記憶した値を設定する。また、実ページ分割処理部4300は、論理ボリューム数2112、論理ボリューム情報ポインタ2113については、ステップ12001で分類した値を設定する。
ステップ8012:実ページ分割処理部4300は、分割先となったフラッシュパッケージグループ情報2300の更新を行う。ここでは、分割先のフラッシュパッケージグループ情報2300の空き実ページ数2304を、1増やす。この後、コール元に戻る。
次に、フラッシュパッケージ230が実行する動作の説明を行う。フラッシュパッケージ230の動作は、パッケージプロセッサ310が実行し、そのプロセッサ310によって実行されるプログラムは、パッケージメモリ320内に格納されている。
図25は、パッケージメモリ320内に、格納された本実施例に関するプログラムが示されている。
本実施例に関するプログラムは、データリード処理実行部12000、データライト処理実行部12100、仮想ブロック移動処理実行部12300、仮想ブロック格納処理実行部12400、仮想容量判定処理部12500である。これらのプログラムのうちの少なくとも1つは、下位レベルのウエアレベリング技術、容量仮想化技術を実現するためのプログラムである。本実施例では、フラッシュパッケージ230が、下位レベルのウエアレベリング技術、容量仮想化技術を実現する。ただし、下位レベルのウエアレベリング技術、容量仮想化技術は、ストレージコントローラ200で実現されてもよい。この場合、図26に示すように、図25に示した情報とほぼ同様のプログラムが、共有メモリ220上に格納されることになる。図26に示した構成では、これらの情報は、ストレージコントローラ200が実行するので、図25に示したそれぞれの情報とは、若干相違が生ずるだけである。したがって、本実施例では、フラッシュパッケージ230が、下位レベルのウエアレベリング技術、容量仮想化技術を実現するものとし、図25に示したデータリード処理実行部12000、データライト処理実行部12100、実ブロック解放処理実行部12200、仮想ブロック移動処理実行部12300、仮想ブロック格納処理実行部12400、仮想容量判定処理部12500の処理フローを詳細に説明する。
図27は、データリード処理実行部12000の処理フローである。
データリード処理実行部12000は、ストレージコントローラ200から、リード要求を受け取ったときに、実行される処理フローである。なお、本実施例で示す図28の処理フローでは、1つの仮想セグメントに格納されたデータをリードする処理フローを示している。ただし、本発明は、リード要求で、複数の仮想セグメントのデータ、あるいは、仮想セグメントの一部のデータを読み出すようにした場合も有効である。なお、本実施例の1つの特徴として、リード要求に、世代を区別するため、GIID2006とBKID2007が含まれている。
ステップ13000:データリード処理実行部12000は、受け取ったリード要求がリード対象とするアドレスとパッケージブロック容量3005とから、対応する仮想ブロックグループと、アクセスする仮想ブロックグループ内の相対アドレスを計算する。これにより、データリード処理実行部12000は、リード対象とする仮想ブロック情報3200を認識する。また、データリード処理実行部12000は、受け取ったGIID2006とBKID2007から世代ID3208を認識して、仮想ブロック内の相対アドレスから、対応する世代仮想セグメントアドレスポインタ3205から、該当する仮想セグメントが、実ブロック内のどのアドレスに格納されているかを認識する。格納されていれば、ステップ13003へジャンプする。
ステップ13001:格納されていない場合、データリード処理実行部12000は、世代ID3208をサーチして、古い世代の仮想セグメントを探す。まず、データリード処理実行部12000は、当該実ページに、受け取ったGIID2006が同じで、BKID2007が古い世代の世代ID3208の仮想セグメントが格納されているかを、世代の新しい順にさがしていく。みつかった場合、この仮想セグメントを、ストレージコントローラ200に送るため、ステップ13003へジャンプする。
ステップ13002:次に、データリード処理実行部12000は、当該実ページの世代ID3208に、グループ内GIID2006が0で、かつ、グループ内BKIID2007が0の(ゴールデンイメージの可能性がある)論理ボリュームが存在するかをチェックする。存在しない場合、ステップ13009へジャンプする。その場合、対応する仮想セグメントを、ストレージコントローラ200に送るため、次ステップへ移る。
ステップ13003:当該ステップでは、データリード処理実行部12000は、リード対象となったそれぞれの仮想セグメントに割り当てた実ページの実ブロック情報3300を、それぞれの仮想ブロック情報3200の実ブロック情報ポインタ3202から特定する。
ステップ13004:データリード処理実行部12000は、特定したそれぞれの実ブロック情報3300の実ブロック識別子3301から対応する実ブロックが、どのフラッシュチップ300のどの先頭アドレスから格納さているかを確認する。次に、データリード処理実行部12000は、該当する仮想セグメントアドレスポインタ3205から、当該リード要求で指定されそれぞれの仮想セグメントが、当該フラッシュチップ300のどの当該アドレスに格納されているかを算出する。
ステップ13005:データリード処理実行部12000は、リードデータが格納されているフラッシュチップ300に対応したチップ情報3100をアクセスして、当該フラッシュチップ300が接続されているパッケージバス340を識別し、対応するパッケージバス転送装置350を認識する。
ステップ13006: データリード処理実行部12000は、ステップ13003で認識したパッケージバス転送装置350に、どのフラッシュチップ300のどのアドレスから、バッファ330に、データを転送するよう指示する。また、データリード処理実行部12000は、圧縮・伸長回路360に、データ転送と同期して、データを伸長するよう指示する。
ステップ13007:データリード処理実行部12000は、この後、転送が完了するのを待つ。
ステップ13008:データリード処理実行部12000は、バッファ330に格納した、ストレージコントローラ200から要求されたリードデータ(ステップ13005で伸長された)を、ストレージコントローラ200に送る。この後、処理を完了する。
ステップ13009:データリード処理実行部12000は、当該実ページには、データが格納されていなかった旨をストレージコントローラ200に報告する。この後、処理を完了する。
図28と図29は、データライト処理実行部12100の処理フローである。
データライト処理実行部12100は、ストレージコントローラ200から、フラッシュパッケージ230が、ライト要求を受け付けたときに実行される。なお、本実施例で示す図28と図29の処理フローでは、1つの仮想セグメントに格納するデータをライトする処理フローを示している。ただし、本発明は、ライト要求で、複数の仮想セグメントにデータを書き込む、あるいは、仮想セグメントの一部のデータを書き込むようにした場合も有効である。なお、本実施例の1つの特徴として、ライト要求には、世代を区別するため、GIID2006とBKID2007が含まれている。
ステップ14000:データライト処理実行部12100は、受け取ったライト要求がライト対象とするアドレスとパッケージブロック容量3005とから、対応する仮想ブロックグループとアクセスする仮想ブロックグループの相対アドレスを計算する。これにより、データライト処理実行部12100は、ライト対象とする仮想ブロック情報3200を認識する。また、データライト処理実行部12100は、受け取ったGIID2006とBKID2007が世代ID3208に登録されているかをチェックする。登録されていれば、書き込み対象となる世代が認識されたことになる。登録されていない場合、データライト処理実行部12100は、世代数3207を1増やし、受け取ったGIID2006とBKID2007を、世代ID3208に登録する。
ステップ14001:また、データライト処理実行部12100は、仮想ブロックグループ内の相対アドレスと世代ID3208から、対応する世代仮想セグメントを認識し、対応する世代仮想セグメントアドレスポインタ3205を認識する。
ステップ14001:データライト処理実行部12100は、ホスト110から当該ライト要求で指定されたライトデータを、バッファ330に格納する。なお、この際、データライト処理実行部12100は、圧縮・伸長回路360に、圧縮を指示する。バッファ330には、圧縮されたデータが格納される。
ステップ14002:データライト処理実行部12100は、ライト対象となった仮想ブロックグループに対応する仮想ブロック情報3200の最初の実ブロック情報ポインタ3202を特定する。データライト処理実行部12100は、この値がヌルかどうか、すなわち、実ブロックが割り当てられているかを、チェックする。割り当てていれば、ステップ14005へジャンプする。
ステップ14003:このステップは、対応する仮想ブロックグループに空き状態にある実ブロックを割り当てるステップである。なお、ここでは、割り当てる実ブロックは消去されていてデータは格納されていないものとする。データライト処理実行部12100は、各チップ情報3100のチップ内空き実ブロック数3103等を参照して、どのフラッシュチップ300の実ブロックを割り当てるかを決める。その後、データライト処理実行部12100は、対応するフラッシュチップ300の空き実ブロック情報ポインタ3400を参照して、先頭の実ブロック情報3300を、当該仮想ブロックグループ管理情報の最初の空き実ブロックポインタ3302が示すようにする。これで、仮想ブロックグループに最初の実ブロックを割り当てたことになる。なお、データライト処理実行部12100は、空き実ブロック情報ポインタ3400を、次の実ブロック情報3300(仮想ブロックグループに割り当てた実ブロックの実ブロック情報3300の中の空き実ブロックポインタ3302が示す実ブロック情報3300)を示すようにし、さらに、仮想ブロックグループに割り当てた実ブロックの実ブロック情報3300の中の空き実ブロックポインタ3302をヌルにする。また、データライト処理実行部12100は、当該実ブロックに対応するチップ情報3100のチップ内空き実ブロック数3103の数を減らす。
ステップ14004:さらに、データライト処理実行部12100は、当該世代の仮想セグメントに対応する世代仮想セグメントポインタに、実ブロックである識別子と先頭アドレスをセットする。データライト処理実行部12100は、世代圧縮後仮想セグメントデータ量3206に、圧縮・伸長回路が示す値をセットする。また、データライト処理実行部12100は、その値と同じ値を、世代圧縮データ格納量3204にセットする。さらに、データライト処理実行部12100は、上記同じ値を、パッケージ圧縮後データ格納量3007に加える。さらに、データライト処理実行部12100は、ライト対象となる世代の仮想セグメントの容量を、格納データ量3203にセットする。また、データライト処理実行部12100は、その容量を表す値と同じ値を、パッケージデータ格納量3006に加える。また、データライト処理実行部12100は、受け取ったライトデータ量と圧縮後のデータ長を、ストレージコントローラ200に返す値として記憶する。
ステップ14005: データライト処理実行部12100は、パッケージバス転送装置350に、どのフラッシュチップ300のどのアドレスへ、バッファ330からデータを書き込むよう指示する。この後、ステップ14014にジャンプする。
ステップ14006:データライト処理実行部12100は、当該仮想ブロック情報3200の最後の実ブロック情報ポインタ3202が示す実ブロック情報3300の実ブロック識別子3301を参照して、対応する実ブロックが、どのフラッシュチップ300のどの先頭アドレスから格納されているかを特定する。
ステップ14007:データライト処理実行部12100は、ライト対象となる実ブロックに対応する実ブロック情報3300の実ブロック内空き領域3304とバッファ330に格納したライトデータの長さとから、受け取ったデータを、当該実ブロックの空き領域に書き込めるかをチェックする。書き込めない場合、ステップ14016へジャンプする。
ステップ14008:データライト処理実行部12100は、当該世代の仮想セグメントの世代仮想セグメントアドレスポインタ3205がヌルかを確認する。成立なら、ステップ14010へジャンプする。
ステップ14009:成立しないなら、データライト処理実行部12100は、当該圧縮・伸長回路360が示す値から世代圧縮仮想セグメントデータ量3206を減算した値を、圧縮後データ格納量3204に加える。さらに、データライト処理実行部12100は、その値と同じ値を、パッケージ圧縮データ格納量3007に加える。この後、データライト処理実行部12100は、圧縮・伸長回路360が示す値を世代圧縮仮想セグメントデータ量3206にセットする。また、データライト処理実行部12100は、今回書き込んだライトデータ量に関しては、0を、圧縮後のデータに関しては、世代圧縮仮想セグメントデータ量3206に加えた値を、ストレージコントローラ200に返す値として記憶する。この後、ステップ14011へジャンプする。
ステップ14010:成立の場合、データライト処理実行部12100は、当該圧縮・伸長回路360が示す値を、圧縮後データ格納量3204に加える。さらに、データライト処理実行部12100は、その値と同じ値を、パッケージ圧縮データ格納量3007に加える。この後、データライト処理実行部12100は、圧縮・伸長回路が示す値を世代圧縮仮想セグメントデータ量3206にセットする。さらに、データライト処理実行部12100は、データ格納量3203には、圧縮前の値を加算して、加算後の値と同じ値を、パッケージデータ格納量3006に加える。また、データライト処理実行部12100は、今回書き込んだライトデータ量に関しては、ストレージコントローラ200から受け取った圧縮前のデータ量を、圧縮後のデータに関しては、当該圧縮・伸長回路が示す値を、それぞれ、ストレージコントローラ200に返す値として記憶する。
ステップ14011:データライト処理実行部12100は、実ブロック内空き領域3304を、今回受け取ったライトデータの量(圧縮後の値)だけ削減する。データライト処理実行部12100は、当該世代の仮想セグメントに対応する世代仮想セグメントアドレスポインタ3205に、当該仮想ブロック情報3200の最後の実ブロック情報ポインタ3202と今回転送した相対アドレスをセットする。
ステップ14012: データライト処理実行部12100は、ライトデータを格納するフラッシュチップ300に対応したチップ情報3100をアクセスして、当該フラッシュチップ300が接続されているパッケージバス340を識別し、対応するパッケージバス転送装置350を認識する。
ステップ14013:データライト処理実行部12100は、ステップ14007で認識したパッケージバス転送装置350に、どのフラッシュチップ300のどのアドレスにバッファ330からライトデータを書き込むかを指示する。
ステップ14014:この後、データライト処理実行部12100は、書き込みが完了するのを待つ。
ステップ14015:データライト処理実行部12100は、ストレージコントローラ200に、ライト要求が完了したことを報告して、処理を完了する。また、この際、データライト処理実行部12100は、圧縮前のライトデータ量と、圧縮後のデータ量をストレージコントローラ200に報告する。この報告は、ライト要求の完了の報告に含まれていて良い。
ステップ14016:当該ステップは、書き込み対象とした実ブロックの空き領域より、ライトデータの長さが、大きい場合に実行されるステップである。本ステップでは、データライト処理実行部12100は、該仮想ブロックグループに、min(k,L(<1)*世代数3207*(m+1)個の実ブロックが割り当てられている場合は、実ブロックを割り当てない。その場合、図29に示すステップ14019にジャンプする。
ステップ14017:このステップは、対応する仮想ブロックグループに空き状態にある実ブロックを割り当てるステップである。なお、ここでは、割り当てる実ブロックは消去されていてデータは格納されていないものとする。データライト処理実行部12100は、各チップ情報3100のチップ内空き実ブロック数3103等を参照して、どのフラッシュチップ300の実ブロックを割り当てるかを決める。その後、データライト処理実行部12100は、対応するフラッシュチップ300の空きブロック管理情報ポインタ3400を参照して、先頭の実ブロック情報3300を、当該仮想ブロックグループ管理情報の最初にヌルになっている空き実ブロックポインタ3302が示すようにする。これで、仮想ブロックグループに新たな実ブロックを割り当てたことになる。なお、データライト処理実行部12100は、空き実ブロック管理情報ポインタ3400を、次の実ブロック情報3300(仮想ブロックに割り当てた実ブロックの実ブロック情報3300の中の空き実ブロックポインタ3302が示す実ブロック情報3300)を示すようにし、さらに、仮想ブロックに割り当てた実ブロックの実ブロック情報3300の中の空き実ブロックポインタ3302をヌルにする。また、データライト処理実行部12100は、当該実ブロックに対応するチップ情報3100のチップ内空き実ブロック数3103の数を減らす。
ステップ14018:データライト処理実行部12100は、当該仮想ブロック情報3200の新たに割り当てた実ブロック情報ポインタ3202が示す実ブロック情報3300とその1つ前の実ブロック情報ポインタ3202が示す実ブロック情報3300の実ブロック識別子3301を参照して、どのフラッシュチップ300のどのアドレスに、データを格納するかを決定する。この後、ステップ14008へジャンプする。
ステップ14019:本ステップでは、データライト処理実行部12100は、当該仮想ブロックグループに、別の実ブロックを割り当てる。別の実ブロックを割り当てる理由は、実ブロックの消去回数の偏りを少なくするためである。この処理は、ウエアレベリング処理と呼ばれる。この際、割り当てる実ブロックの数は、世代圧縮後データ格納量3206に圧縮・伸長回路360に示された値を加えた値を基に決定される。当該ステップでは、データライト処理実行部12100は、必要な実ブロックの数を入力値として、ウエアレベリング処理部をコールして、実ブロックを決定する。データライト処理実行部12100は、ウエアレベリング処理部からは、ライトデータを格納する実ブロックの実ブロック情報3300のアドレスを、入力値に等しい数だけ、受け取る。この実ブロックは、消去処理が施された状態にあり、直接データを書き込めるような状態であるとする。また、本実施例では、ウエアレベリング処理部は、例えば、特許文献1のような公知の技術を前提とするので、ここでは、特に詳細に説明しない。
ステップ14020:ここでは、データライト処理実行部12100は、当該仮想ブロックグループ内のすべての世代ことの仮想セグメントすべてを一度伸長して、バッファに読み出す。このため、ヌル値でも、世代仮想セグメントアドレスポインタ3205と対応する世代圧縮仮想セグメント量3206が参照される。データライト処理実行部12100は、これらの値と、実ブロック情報3300から、仮想セグメントのアドレス順に、どのフラッシュチップ300のどのアドレスから、どの長さだけをバッファに転送するかを示すアドレスリストを生成する。
ステップ14021: データライト処理実行部12100は、ステップ14020で認識したフラッシュチップ300に対応したチップ情報3100をアクセスして、当該フラッシュチップ300が接続されているパッケージバス340を識別し、対応するパッケージバス転送装置350を認識する。
ステップ14022: データライト処理実行部12100は、ステップ14020で認識したパッケージバス転送装置350に、ステップ14020で生成した指示情報にしたがって、どのフラッシュチップ300のどのアドレスからバッファ330にデータを読み込むよう指示する。なお、この際、データライト処理実行部12100は、圧縮・伸長回路360には、データを伸長するよう指示する。
ステップ14023:この後、データライト処理実行部12100は、バッファ330への読み込みが完了するのを待つ。
ステップ14024:データライト処理実行部12100は、当該仮想ブロック情報3200の中で、ヌル値、を格納していないすべての世代仮想セグメントアドレスポインタ3205(以下、有効な世代仮想セグメントポインタ3205と呼ぶ)を更新する。データライト処理実行部12100は、最初の有効な仮想セグメントアドレスポインタ3205にブロックアドレスに、最初に割り当てた実ブロックのアドレスと相対アドレスにその先頭アドレスを設定する。データライト処理実行部12100は、次の有効な世代仮想セグメントアドレスポインタ3205としては、基本的に、ブロックアドレスには、その前の有効な世代仮想セグメントポインタ320なブロックアドレスを設定し、相対アドレスとしては、その前の有効な世代圧縮仮想セグメントデータ量さ3206の値を加えた値を設定していく。相対アドレスが、実ページ容量をこえた場合、データライト処理実行部12100は、相対アドレスとしては、その値から、実ページ容量を減算した値を設定し、ページアドレスとしては、次に割り当てた実ページのアドレスを設定する。データライト処理実行部12100は、最後の有効な世代仮想セグメントアドレスポインタ3205の値を設定したあと、この相対アドレスの値に、対応する世代圧縮仮想セグメントデータ量3206の値を加える。その加算後の値が実ページ容量をこえていなければ、データライト処理実行部12100は、最後の有効な世代仮想セグメントアドレスポインタ3205のブロックアドレスに対応する実ブロック情報3300の実ブロック内空き領域3304に、実ページ容量からこの計算値を減算した値をセットし、加えて、当該ライト要求に対応した世代仮想セグメントアドレスポインタ3205には、ブロックアドレスに当該実ブロックのアドレスを設定する。さらに、この計算値が実ページ容量をこえていれば、データライト処理実行部12100は、最後の実ページアドレス情報ポインタが示す実ブロック情報3300の実ブロック内空き領域3304に、実ページ容量の2倍の値からこの計算値を減算した値をセットする。
ステップ14025:データライト処理実行部12100は、ストレージコントローラ200から受け取ったライトデータを、ステップ14023で、転送したデータの後の領域に、伸長して転送する。
ステップ14026:データライト処理実行部12100は、当該世代の仮想セグメントの世代仮想セグメントアドレスポインタ3205がヌルか否かを判断する。成立なら、ステップ14028へジャンプする。
ステップ14027:成立しないなら、データライト処理実行部12100は、ストレージコントローラ200から転送した際に、使用した圧縮・伸長回路360が示す値から世代圧縮仮想セグメントデータ量3206を減算した値を、圧縮データ格納量3204に加える。さらに、データライト処理実行部12100は、その減算後の値と同じ値を、パッケージ圧縮データ格納量3007に加える。この後、データライト処理実行部12100は、圧縮・伸長回路360が示す値を世代圧縮仮想セグメントデータ量3206に加える。また、データライト処理実行部12100は、今回書き込んだライトデータ量に関しては、0を、圧縮後のデータ量に関しては、世代圧縮仮想セグメントデータ量3206に加えた値を、それぞれ、ストレージコントローラ200に返す値として記憶する。この後、ステップ14029へジャンプする。
ステップ14028:成立の場合、データライト処理実行部12100は、ストレージコントローラ200から転送した際に、使用した圧縮・伸長回路360が示す値を、圧縮データ格納量3204に加える。さらに、データライト処理実行部12100は、加算後の値と同じ値を、パッケージ圧縮データ格納量3007に加える。この後、データライト処理実行部12100は、圧縮・伸長回路360が示す値を世代圧縮仮想セグメントデータ量3206にセットする。さらに、データライト処理実行部12100は、データ格納量3203には、圧縮前の値を加算して、その加算後の値と同じ値を、パッケージデータ格納量3006に加える。また、データライト処理実行部12100は、今回書き込んだライトデータ量に関しては、ストレージコントローラ200から受け取った圧縮前のデータ量を、圧縮後のデータ量に関しては、当該圧縮・伸長回路が示す値を、それぞれ、ストレージコントローラ200に返す値として記憶する。
ステップ14029:データライト処理実行部12100は、最後の有効な世代仮想セグメントアドレスポインタ3205の値の中で、この相対アドレスの値に、対応する圧縮仮想セグメントデータ長3206の値を加えた値を計算値とする。データライト処理実行部12100は、この計算値が実ブロック容量をこえていなければ、当該ライト要求に対応した世代仮想セグメントアドレスポインタ3205には、ブロックアドレスに最後の有効な世代仮想セグメントアドレスポインタ3205が示す実ブロックのアドレスを設定し、相対アドレスとしては、この計算値を設定する。さらに、この計算値が実ブロック容量をこえていなければ、データライト処理実行部12100は、最後の実ブロック情報3300の実ブロック内空き容量3304に、実ブロック容量からこの計算値を減算した値を設定する。さらに、データライト処理実行部12100は、この計算値が実ブロック容量をこえていれば、最後の実ブロック情報3300の実ブロック内空き容量3304に、実ブロック容量の2倍の値から、この計算値を減算した値を設定する。
ステップ14030:次に、データライト処理実行部12100は、新たに割り当てた実ブロックに対応する実ブロック情報3300の実ブロック識別子3301を参照して、この実ページがどのフラッシュチップ300のどのアドレスから格納されているかを認識し、転送を指示するアドレスリストを生成する。
ステップ14031:データライト処理実行部12100は、ステップ14017で認識したライトデータを格納するフラッシュチップ300に対応したチップ情報3100をアクセスして、当該フラッシュチップ300が接続されているパッケージバス340を識別し、対応するパッケージバス転送装置350を認識する。
ステップ14032: データライト処理実行部12100は、ステップ14018で認識したパッケージバス転送装置350に、どのフラッシュチップ300のどのアドレスへバッファ330からデータを書き込むよう指示する。この際、データライト処理実行部12100は、圧縮・伸長回路360には圧縮を指示する。
ステップ14033:この後、データライト処理実行部12100は、バッファ330からの書き込みが完了するのを待つ。
ステップ14034:この後、データライト処理実行部12100は、当該パッケージの仮想容量を変化させる必要があるかを
チェックするのに、仮想容量判定処理部12500をコールする。
ステップ14035:このステップは、元々割り当てていた実ブロックを空いた状態にするステップである。まず、データライト処理実行部12100は、元々割り当てていた実ブロックのすべてに消去処理を施す。これが完了すると、次に、データライト処理実行部12100は、元々割り当てていた実ブロックに対応する空き実ブロックポインタ3302に、空き実ブロック情報ポインタ3400が示していた実ブロック情報3300のアドレスを設定し、空き実ブロック管理情報ポインタ3400には、元々割り当てていた実ブロックに対応する実プロック情報3300のアドレスを設定する。また、データライト処理実行部12100は、対応する仮想ブロック情報3200の実ブロック情報ポインタ3202をヌルにする。データライト処理実行部12100は、これを、当該仮想ブロックグループに割り当てていた実ブロックの数だけ繰り返す。
ステップ14036:このステップは、新しく割り当てた数の実ブロックを仮想ブロックグループに割り当てる処理である。具体的には、例えば、データライト処理実行部12100は、対応する数だけの仮想ブロック情報3200の実ブロック情報ポインタ3202を、新しく割り当てた実ブロックの実ブロック情報3300を示すようにする。
ステップ14037:データライト処理実行部12100は、ストレージコントローラ200に対して、ライト要求の終了を報告する。なお、当該フラッシュパッケージ230の仮想容量を変化させる場合、データライト処理実行部12100は、新たな仮想容量を、ストレージコントローラ200に報告する。また、データライト処理実行部12100は、ライトデータの圧縮前の値と圧縮後の値を報告する。
図31は、仮想ブロック移動処理実行部12300の処理フローである。
仮想ブロック移動処理実行部12300は、指定された仮想セグメントの集合に格納されているデータを移動することの要求(仮想ブロック移動要求)をフラッシュパッケージ230がストレージコントローラ200から受けたときに実行される。なお、ここでは、実ページ単位の要求なので、仮想ブロックグループの一部のセグメントの転送要求はないものとする。
ステップ16000:仮想ブロック移動処理実行部12300は、仮想ブロック移動要求で指定された仮想ブロックグループの集合を算出する。
ステップ16001:仮想ブロック移動処理実行部12300は、指定されたすべての仮想ブロックグループについて、データ格納量3203、圧縮後データ格納量3204、世代数3207、世代ID3208をストレージコントローラ200に返す情報として記憶する。さらに、仮想ブロック移動処理実行部12300は、世代ID3208を参照し、それぞれの仮想ブロックグループのすべての世代の仮想セグメントに対し、対応する世代仮想セグメントアドレスポインタ3205を参照して、下記の情報、
(a)データが格納されていない(ヌル)かデータが格納されているかを示す情報、
(b)上記(a)の情報が、格納されていることを表す情報である場合、どの世代のデータかを示す情報と世代圧縮仮想セグメントデータ量3206に格納された情報、
を、ストレージコントローラ200に戻す値として設定する。
ステップ16002:仮想ブロック移動処理実行部12300は、指定されたすべての仮想ブロックグループについて、それぞれの仮想ブロックグループのデータ格納量3203と圧縮データ格納量3204を、ストレージコントローラ200に戻す値として設定する。また、仮想ブロック移動処理実行部12300は、これらの仮想ブロックグループのデータ格納量3203と圧縮後データ格納3204のそれぞれの合計値を求め、それぞれの合計値を、ストレージコントローラ200に返却する値として設定する。さらに、仮想ブロック移動処理実行部12300は、それぞれの合計値を、パッケージデータ格納量3006とパッケージ圧縮データ格納量3007から減算する。その後、仮想ブロック移動処理実行部12300は、データ格納量3203、圧縮データ格納量3204、すべての仮想セグメントアドレスポインタ3205と圧縮仮想セグメントデータ量3206をクリアする。
ステップ16003:仮想ブロック移動処理実行部12300は、指定されたすべての仮想セグメントの仮想セグメントアドレスポインタ3205がヌルでない(データを格納している)ことを示す、仮想セグメントアドレスポインタ3205と対応する圧縮仮想セグメントデータ量3206から、ストレージコントローラ200に送るべき当該仮想ブロックグループの中に格納されているデータが格納されているアドレスとその転送長を示す情報リストを生成する。
ステップ16004:仮想ブロック移動処理実行部12300は、指定された仮想セグメントに割り当てられている実ブロックが格納されているフラッシュチップ300に対応したチップ3100情報をアクセスして、当該フラッシュチップ300が接続されているパッケージバス340を特定し、対応するバス転送装置350を特定する。
ステップ16005:仮想ブロック移動処理実行部12300は、ステップ16004で特定したバス転送装置350に、ステップ16004で生成した情報リストに従うアドレスからバッファ330にデータを転送するよう指示する。その際、仮想ブロック移動処理実行部12300は、圧縮・伸長回路360Bには、データを伸長するよう指示する。
ステップ16006:仮想ブロック移動処理実行部12300は、転送が完了するのを待つ。
ステップ16007:仮想ブロック移動処理実行部12300は、該当するすべての仮想ブロックグループに対応する仮想ブロック情報3200の実ブロック情報ポインタ3202が示す実ブロック情報3300に対応する実ブロックの解放処理を行う。このため、仮想ブロック移動処理実行部12300は、該当するすべての実ブロック情報3300の実ブロック識別子3301を解析し、解放する実ブロックが、どのフラッシュチップ300のどのアドレスに属しているかを判断する。
ステップ16008:本ステップは、該当するすべての仮想ブロックグループに割り当てたすべての実ブロックを空いた状態にするステップである。処理内容は、図29のステップ14035とまったく同じであるので、ここでは、説明を省略する。ただし、ステップ14035の処理は、一つの仮想ブロックグループに対する処理であるが、ここでは、ステップ14035の処理は、該当する仮想ブロックグループの数だけ、実行することになる。
ステップ16009:仮想ブロック移動処理実行部12300は、ストレージコントローラ200へ、バッファ330に格納したデータを送る。まず、仮想ブロック移動処理実行部12300は、指定されたすべての仮想ブロックグループについて、データ格納量3204、圧縮後データ格納量3205、世代数3207、世代ID3208をストレージコントローラ200に返す情報として記憶する。さらに、仮想ブロック移動処理実行部12300は、世代ID3208を参照し、それぞれの仮想ブロックグループのすべての世代の仮想セグメントに対し、対応する世代仮想セグメントアドレスポインタ3205を参照して、下記の情報、
(a)データが格納されていない(ヌル)かデータが格納されているかを示す情報、
(b)上記(a)の情報がデータが格納されていることを表す情報である場合、どの世代のデータかを示す情報と世代圧縮仮想セグメントデータ量3206に格納された情報、
を送る。最後に、仮想ブロック移動処理実行部12300は、すべての有効な世代ごとの仮想セグメントに格納されていたデータを、ストレージコントローラ200に送る。以上で処理を終了する。
図32は、仮想ブロック格納処理実行部12400の処理フローである。
仮想ブロック格納処理実行部12400は、格納要求(指定された仮想ブロックグループに、実ブロックをそれぞれ割り当てて、ストレージコントローラ200から送られてきたデータを格納せよという要求)を受けたときに、実行される。仮想ブロック移動処理実行部12300とは、データの流れが逆ではあるが、共通点が多いので、図31の処理フローの各ステップを引用しながら説明を行う。
ステップ17000:ステップ16000と同様。仮想ブロック格納処理実行部12400は、格納を指示された仮想セグメントの集合から、対象となる仮想ブロックグループを特定する。
ステップ17001:仮想ブロック格納処理実行部12400は、ストレージコントローラ200から以下の情報を受け取る。すなわち、仮想ブロック格納処理実行部12400は、指定されたすべての仮想ブロックグループについて、データの格納量、圧縮後のデータの格納量、世代数、世代IDの集合を、ストレージコントローラ200から受け取る。さらに、仮想ブロック格納処理実行部12400は、それぞれの仮想ブロックグループのすべての世代の仮想セグメントについて、下記の情報、
(a)データが格納されていない(ヌル)かデータが格納されているかを示す情報、
(b)上記(a)の情報が格納されていることを表す情報である場合、どの世代のデータかを示す情報と圧縮後のデータの長さに格納された情報、
を受け取る。最後に、仮想ブロック格納処理実行部12400は、仮想セグメントに格納するデータを受け取るが、この際には、圧縮・伸長回路360に指示して、圧縮して、バッファ330に格納する。また、仮想ブロック格納処理実行部12400は、すべてのデータの格納データ量と圧縮データ格納量の変化値をパッケージデータ格納量3006、パッケージ圧縮データ量3007に加える。次に、仮想ブロック格納処理実行部12400は、指定された仮想セグメントを、仮想ブロックグループごとに分類する。
ステップ17002:ステップ16002と同様。仮想ブロック格納処理実行部12400は、データを格納するよう指示されている仮想ブロックグループを探す。もうなければ、ステップ17010へジャンプする。
ステップ17003:仮想ブロック格納処理実行部12400は、当該仮想ブロックグループに対応して受け取った格納データ量、圧縮データ格納量、世代の数、世代IDの集合を、対応する仮想ブロック情報3200のデータ格納量3203と圧縮データ格納量3204、世代数3207、世代ID3208に格納する。また、仮想ブロック格納処理実行部12400は、対応する世代の仮想セグメントに関して受け取った、データが格納されているかいないかを表す情報を、対応する世代仮想セグメントアドレスポインタ3205に設定する。データが格納されているという情報を受け取った場合、仮想ブロック格納処理実行部12400は、対応する圧縮後のデータ長を、世代の情報を参照して、世代圧縮仮想セグメントデータ量3206にセットする。
ステップ17004:ここでは、実ブロックが当該仮想ブロックグループに割り当てられる。割り当てられる実ブロックの数は、当該仮想ブロック情報3200の圧縮データ格納量3204を基に決定される。ここでは、必要な数の実ブロックが割り当てられる。これは、図29のステップ14019に示した処理なので、説明を省略する。
ステップ17005:仮想ブロック格納処理実行部12400は、当該仮想ブロック情報3200の中で、データを格納していることを示す世代仮想セグメントアドレスポインタ3205を更新する。これは、ステップ14024と同じであるため、説明を省略する。
ステップ17006:仮想ブロック格納処理実行部12400は、仮想セグメント内のデータが格納されているフラッシュチップ300に対応したチップ情報3100を基に、当該フラッシュチップ300が接続されているパッケージバス340を特定し、対応するバス転送装置350を特定する。
ステップ17007:仮想ブロック格納処理実行部12400は、ステップ17006で特定したバス転送装置350に、フラッシュチップ300のアドレスからバッファ330に当該仮想ブロックグループ全体のデータを格納するよう指示する。
ステップ17008:仮想ブロック格納処理実行部12400は、転送が完了するのを待つ。
ステップ17009:ステップ17002に戻る。
ステップ17010:仮想ブロック格納処理実行部12400は、ストレージコントローラ200へ、処理要求の完了を報告する。以上で処理を終了する。
図33は、仮想容量判定処理部12500の処理フローである。
仮想容量判定処理部12500は、圧縮率を把握し、当該パッケージ230の仮想容量を調整する必要があるかを判断する。調整する必要があると判断した場合、その容量を決定し、仮想容量判定処理部12500は、仮想パッケージ容量3002に設定する。さらに、この容量と容量を変更した旨を、呼び出し元に返却する。
ステップ18000:仮想容量判定処理部12500は、パッケージデータ格納量3006/仮想パッケージ容量3002の比を算出する。算出された比をPとする。比Pが、Q(Qは、例えば、Pよりも十分小さい値)以下の場合、仮想容量の調整を行わず、処理が、呼び出し元に戻る。比Pが、Q以下の場合、まだ、それ程多くのデータが格納されていないからである。
ステップ18001:次に、仮想容量判定処理部12500は、R=(仮想パッケージ容量3002/実パッケージ容量3003)を算出する。また、仮想容量判定処理部12500は、T=(パッケージデータ格納量3006/パッケージ圧縮データ格納量3007)を算出する。値Tは、圧縮率である。
ステップ18002:仮想容量判定処理部12500は、RとTを比較する。これらの値がほぼ等しければ(例えば、RとTの差が所定値未満であれば)、理想的な仮想パッケージ容量3002が設定されているということである。このため、仮想容量判定処理部12500は、調整を行わないことを決定し、呼び出し元に戻る。RのほうがTより大きい場合(仮想容量が大き過ぎる場合)、又は、RのほうがTより小さい場合(仮想容量が小さすぎる場合)、仮想容量判定処理部12500は、仮想パッケージ容量3002の調整を行う。
ステップ18003:仮想容量判定処理部12500は、仮想容量を調整する。調整後の仮想容量の値は、例えば、実パッケージ容量3003*Tである。これは、圧縮率Tが今後も変化しなければ理想値となる。調整後の仮想容量の値は、(実パッケージ容量3003−パッケージ圧縮データ格納量3007)*R+パッケージ圧縮データ格納量3007*Tでも良い。仮想容量判定処理部12500は、決定した値(調整後の仮想容量の値)を、仮想パッケージ容量3002に設定し、さらに、呼び出し元に、仮想容量の調整を行うことと、この決定した値とを通知し、処理を完了させる。
本実施例によれば、それぞれが多数のフラッシュメモリを実装したフラッシュパッケージを多数接続した大容量のストレージシステムにおいて、圧縮機能を適用し、データ格納容量を削減しても、性能劣化を抑えて、物理容量よりも大きな容量を格納することが可能となる。
以上、本発明の一実施例を説明したが、これは本発明の説明のための例示であって、本発明の範囲をこの実施例にのみ限定する趣旨ではない。本発明は、他の種々の形態でも実施することが可能である。例えば、前述した世代ID、GIID、BKIDは、いずれも典型的には番号であるが、番号に代えて又は加えて、世代が増加した場合に規則的に更新される類のIDであれば何でも良い。また、例えば、世代IDに代えて、実ページ及び実セグメントについて論理ボリュームの領域のアドレス(例えばLBA(Logical Block Address)を採用する方法も考えられるが、そうすると、どれが最新の世代かわからないので、上述した実施例のように、世代IDが採用されることが好ましい。
以下、上述した説明を基に、本発明の1以上の観点に従う概要を記載する。
ストレージシステムは、複数のフラッシュパッケージと、上位装置からのライト要求(以下、第1のライト要求)に従うデータに基づくライトデータのライト要求(以下、第2のライト要求)をフラッシュパッケージに送信するストレージコントローラとを有する。上位装置は、ホスト計算機であっても良いし、他のストレージシステムであっても良い。
各フラッシュパッケージは、1以上のフラッシュメモリと、ストレージコントローラ及び1以上のフラッシュメモリに接続されるパッケージコントローラとを有する。各フラッシュメモリは、複数の実ブロックを有する。各実ブロックは、複数の実セグメントで構成されている。そのフラッシュメモリは、ブロック単位でデータが消去され、セグメント単位でデータが読み書きされるタイプのフラッシュメモリ、例えば、NAND型のフラッシュメモリである。パッケージコントローラは、ストレージコントローラからのライト要求に従うライトデータを、実ブロックに書き込む。
上位の仮想空間と、上位の実空間と、下位の仮想空間と、下位の実空間とがある。上位の仮想空間は、複数の仮想ページ(仮想的な記憶領域)で構成された仮想的な論理ボリューム(シンプロビジョニングに従う仮想的な論理ボリューム)を1つ以上含む。上位の実空間は、複数の実ページで構成された記憶空間である。下位の仮想空間は、複数の仮想ブロックで構成された記憶空間である。実ページが1以上の仮想ブロックで構成されている。下位の実空間は、複数の実ブロックで構成された記憶空間である。実ページが割り当てられていないライト先の仮想ページに実ページが割り当てられる上位の容量仮想化と、実ブロックが割り当てられていないライト先の仮想ブロックに実ブロックが割り当てられる下位の容量仮想化とが行われる。
ストレージコントローラ(又はパッケージコントローラ)が、第1の論理ボリュームをベースとした第2の論理ボリュームを生成する。ストレージコントローラ(又はパッケージコントローラ)が、第1の論理ボリュームと第1の論理ボリュームをベースとして生成された1以上の第2の論理ボリュームとで構成された複数の論理ボリュームを論理ボリュームグループとして管理する。第1の論理ボリュームをベースとした第2の論理ボリュームが新たに生成された場合には、同一の論理ボリュームグループを構成し新たに生成された第2の論理ボリュームを含んだ複数の論理ボリュームのうち、上位装置からの上位のライト要求に従うデータが書き込まれる論理ボリュームの世代IDが最新の世代IDに更新される。世代IDは更新されても、例えば、上位装置からアクセス要求(第1のライト要求及び第1のリード要求)で指定されるボリュームID(例えばLUN(Logical Unit Number))は更新されないことが望ましい。ストレージコントローラ(又はパッケージコントローラ)が、論理ボリュームグループを構成する複数の論理ボリュームの同一のアドレスの仮想ページに、同一の実ページを割り当てる。
各実ブロックは複数の実セグメントで構成されている。同一の実ページを構成する仮想ブロックに割り当てられた実ブロックに新たにデータが書き込まれる場合、その実ブロックにおける空きの実セグメントにデータが書き込まれるようになっている。
ストレージコントローラは、論理ボリュームグループを構成する各論理ボリュームの世代IDと、その論理ボリュームグループを構成する複数の論理ボリュームに割り当てられている実ページとの対応を管理する。ストレージコントローラは、第2のライト要求を送信する場合、その第2のライト要求に、第1のライト要求に従うライト先の論理ボリュームの世代IDを含める。パッケージコントローラは、第2のライト要求を受信し、その第2のライト要求に従うアドレスの実ページ(仮想ブロック)に割り当てられた実ブロックの空きの実セグメントにその第2のライト要求に従うライトデータを書き込み、且つ、そのライトデータの書込み先の実セグメントとそのライトデータの第2のライト要求が含む世代IDとを対応付けて管理する。1つの実ページが、複数の世代にそれぞれ対応する複数の論理ボリュームに割り当てられ、その同一の実ページに、複数の世代のデータが書き込まれるが、それらのデータは、フラッシュメモリの特性上、上書きされて消去されることなく、同一の実ページに割り当てられた1以上の実ブロックにおける異なる複数の実セグメントに格納される。世代毎に、有効なデータ(最新のデータ)と無効なデータとがある。リクラメーションの際には、同一の実ページについて、各世代について有効なデータが1以上の実ブロックに集約され、1以上の世代についての無効データのみが格納された実ブロックに対して消去処理が施される。
ストレージコントローラは、上位装置から第1のリード要求を受けその第1のリード要求に基づく第2のリード要求を複数のフラッシュパッケージのうちのリード元のフラッシュパッケージに送信するようになっており、第2のリード要求を送信する場合、その第2のリード要求に、第1のリード要求に従うリード元の論理ボリュームの世代IDを含める。パッケージコントローラは、第2のリード要求を受信し、その第2のリード要求に従うアドレスの実ページ(仮想ブロック)に割り当てられている1以上の実ブロックから、その第2のリード要求が含む世代IDについて有効なデータを記憶している実セグメントを特定する。そのような実セグメントが無ければ、パッケージコントローラは、第2のリード要求が含む世代IDが表す世代よりも古い世代(例えば、第1の論理ボリューム又は最新の第2の論理ボリューム)について有効なデータを記憶している実セグメントを特定する。パッケージコントローラは、特定した実セグメントからデータを読み出し、そのデータをストレージコントローラに送信する。ストレージコントローラが、そのデータを受信し、そのデータを上位装置に送信する。
ストレージコントローラが、論理ボリュームグループ毎に、第1の論理ボリュームが上位装置によって更新される第1のタイプの論理ボリュームグループであるのか、第2の論理ボリュームが上位装置によって更新される第2のタイプの論理ボリュームグループであるのかを管理することができる。第1のタイプの論理ボリュームグループによれば、典型的には、第1の論理ボリュームから第2の論理ボリュームにデータがバックアップされる。第2のタイプの論理ボリュームグループによれば、典型的には、ゴールデンイメージを格納している第1の論理ボリュームを基に生成された第2の論理ボリュームが、上位装置で実行される仮想計算機に使用される。仮想計算機は第2の論理ボリュームからゴールデンイメージに含まれているOSを読み出して実行する。
ストレージコントローラ(又はパッケージコントローラ)は、同一の実ページの割当先の論理ボリュームの数(世代数)が一定数を超えているか否かを判断し、その判断の結果が肯定的の場合に、その同一の実ページに割り当てられている1以上の実ブロックに格納されている、その同一の実ページが割り当てられている複数の論理ボリュームに書き込まれた複数のデータ(例えば有効なデータ)を、複数の実ページに分散する。
ストレージコントローラ又はパッケージコントローラが、フラッシュパッケージが有する複数のフラッシュチップの物理的な容量の合計値よりも大きな仮想的な容量をストレージコントローラに定義する。
ストレージコントローラ又はパッケージコントローラが、下位のライト要求に従うライトデータを圧縮する。下位のライト要求の送信先のフラッシュパッケージのパッケージコントローラが、圧縮されたライトデータである圧縮データを、ライト先の仮想ブロックに割り当てられた実ブロックに書き込む。
ストレージコントローラ又はパッケージコントローラが、フラッシュパッケージのデータ格納状況に応じて、そのフラッシュパッケージの仮想容量を変更する。データ格納状況は、典型的には、前述した圧縮率である。フラッシュパッケージの圧縮率は、そのフラッシュパッケージに格納されている有効な圧縮データの圧縮前のライトデータの総容量と、そのフラッシュパッケージに格納されている有効な圧縮データの総容量とに基づく値である。具体的には、例えば、ストレージコントローラ又はパッケージコントローラが、仮想セグメントに書き込まれた有効な圧縮後のデータの量とその有効なデータの圧縮前のデータの量とを仮想セグメントごとに管理する。フラッシュパッケージに格納されている有効な圧縮データの圧縮前のライトデータの総容量は、そのフラッシュパッケージが提供する各仮想セグメントについての、書き込まれた有効なデータの圧縮前のデータの量を基に算出された値である。フラッシュパッケージに格納されている有効な圧縮データの総容量は、そのフラッシュパッケージが提供する各仮想セグメントについての、そのフラッシュパッケージに格納されている有効な圧縮データの量を基に算出された値である。例えば、仮想ブロック#1に実ブロック#1が割り当てられていて、仮想ブロック#1が仮想セグメント#1及び#2を含んでいるとする。ここでは、仮想セグメント長を8キロバイトとして説明を行う。仮想セグメント#1に、データが格納され、圧縮された結果、1キロバイトの圧縮データが格納され、仮想セグメント#2に、データが格納され、圧縮の結果2キロバイトの圧縮データが格納され、さらに、仮想セグメント#1が、書きかえられ、圧縮の結果、3キロバイトのデータが格納されたとする。この場合、仮想セグメント#1の有効なデータ(最新のデータ)は、3キロバイトの圧縮データであり、仮想セグメント#2の有効なデータ(最新のデータ)は、2キロバイトの圧縮データである。このため、実ブロック#1について、最新の圧縮データの総量は、3キロバイト+2キロバイト=5キロバイトである。また、実ブロック#1について、最新の圧縮前のデータの総量は、8キロバイト+8キロバイト=16キロバイトである。このように、仮想セグメントに圧縮データが格納されれば、その仮想セグメントを提供するフラッシュパッケージについて、パッケージデータ格納量3006及びパッケージ圧縮データ格納量3007が更新される。パッケージコントローラが、ライト先の仮想セグメントを含む仮想ブロックについて、圧縮状況情報(例えば、その仮想セグメントに書き込まれた圧縮データの量とその圧縮データの圧縮前のライトデータの量とを表す情報、及び/又は、それらの量に基づいて算出される、当該ライト時の圧縮率を表す情報)を、ストレージコントローラに送信する。圧縮状況情報は、下位のライト要求に対する完了報告に含められても良い。
ストレージコントローラ又はパッケージコントローラが、フラッシュパッケージの圧縮率が増加した場合、そのフラッシュパッケージの仮想容量を増やす。データ格納量をより削減できるので、より多くのライトデータを格納することが期待されるからである。
ストレージコントローラ又はパッケージコントローラが、フラッシュパッケージの圧縮率が減少した場合、そのフラッシュパッケージの仮想容量を減らす。データ格納量があまり削減されないので、あまり多くのライトデータを格納することができないことが期待されるからである。
各実ページは、複数の仮想ブロックを含んでいる。ストレージコントローラは、フラッシュパッケージの仮想容量を増やす場合、そのフラッシュパッケージに基づく空きの実ページを増やし、そのフラッシュパッケージの仮想容量を減らす場合、そのフラッシュパッケージに基づく空きの実ページを減らす。このように、下位レベルの容量仮想化機能に加えて上位レベルの容量仮想化機能があれば、仮想ブロックと実ブロックの対応関係を変更することなく、仮想容量の増減を行うことができる。
ライトデータの圧縮は、フラッシュチップへのライトのとき、リクラメーション処理のとき、或いは、ページ間のデータ移動のときの少なくとも1つのときに行われる。リクラメーション処理は、フラッシュパッケージにおいて必然的に行われる処理であるから、その処理のときに圧縮が行われるので、性能の低下が生じるのを抑えることが期待できる。
ストレージコントローラが、フラッシュパッケージの圧縮率を基に、フラッシュパッケージ間で、移動元の実ページから移動先の実ページにデータを移動する。ストレージコントローラは、移動元の実ページに関連付けられている管理情報、移動先の実ページに関連付けられている管理情報に適用する。管理情報は、例えば、データが格納されているか、繰り返し情報が格納されているか等を含んで良い。また、フラッシュパッケージ間のデータ移動では、移動元のフラッシュパッケージが、移動元実ページに割り当てられている実ブロック内の有効な圧縮データを伸長して(又は伸長することなく)移動先のフラッシュパッケージに転送し、移動先のフラッシュパッケージが、受信したデータを圧縮して(又は圧縮済みであるため圧縮することなく)、移動先実ページに割り当てられている実ブロックに格納して良い。その際、移動元の実ページに対応する管理情報(例えば、データ格納量及び圧縮データ格納量を表す情報)はリセットされ、移動先の実ページに対応する管理情報(例えば、データ格納量及び圧縮データ格納量を表す情報)は、データ移動に伴い格納された圧縮データの量(及びその圧縮データの圧縮前のデータの量)を基に更新されて良い。
パッケージコントローラは、そのパッケージコントローラにおいてリクラメーション処理を行うことができる。リクラメーション処理では、パッケージコントローラは、満杯になった移動元実ブロック内の有効なデータを移動先実ブロックに移し、移動元実ブロックに対する消去処理(移動元実ブロックに格納されているデータを消去する処理)を行うことで、移動元実ブロックを空きの実ブロックとする。このリクラメーション処理において、データの圧縮及び伸長が行われて良い。