以下、図面を参照して、実施形態を説明する。
まず、図1を参照して、一実施形態に係るメモリシステムを含む情報処理システム1の構成を説明する。
このメモリシステムは、不揮発性メモリにデータをライトし、不揮発性メモリからデータをリードするように構成された半導体ストレージデバイスである。このメモリシステムは、例えば、NANDフラッシュ技術ベースのソリッドステートドライブ(SSD)3として実現されている。
情報処理システム1は、ホスト(ホストデバイス)2と、SSD3とを含む。ホスト2は、SSD3をアクセスする情報処理装置(コンピューティングデバイス)である。ホスト2は、大量且つ多様なデータをSSD3に保存するストレージサーバ(サーバ)であってもよいし、パーソナルコンピュータであってもよい。
SSD3は、ホスト2として機能する情報処理装置のメインストレージとして使用され得る。SSD3は、この情報処理装置に内蔵されてもよいし、この情報処理装置にケーブルまたはネットワークを介して接続されてもよい。
ホスト2とSSD3とを相互接続するためのインタフェースとしては、SCSI、Serial Attached SCSI(SAS)、ATA、Serial ATA(SATA)、PCI Express(PCIe)、Ethernet(登録商標),Fibre channel、NVM Express(NVMe)(登録商標)等を使用し得る。
SSD3は、コントローラ4および不揮発性メモリ(NANDフラッシュメモリ)5を備える。SSD3は、DRAM6も備えていてもよい。NANDフラッシュメモリ5は、限定されないが、複数のNANDフラッシュメモリチップを含んでいてもよい。NANDフラッシュメモリ5は、メモリセルアレイを含む。このメモリセルアレイは、多数のNANDブロック(ブロック)B0〜Bm−1を含む。ブロックB0〜Bm−1は、消去単位として機能する。ブロックは「物理ブロック」または「消去ブロック」と称されることもある。
ブロックB0〜Bm−1は多数のページ(物理ページ)を含む。つまり、ブロックB0〜Bm−1の各々は、ページP0〜Pn−1を含む。NANDフラッシュメモリ5においては、データのリードおよびデータのライトはページ単位で実行される。データの消去はブロック単位で実行される。
コントローラ4は、Toggle、ONFIのようなNANDインタフェース13を介して、不揮発性メモリであるNANDフラッシュメモリ5に電気的に接続されている。コントローラ4は、NANDフラッシュメモリ5のデータ管理とNANDフラッシュメモリ5のブロック管理とを実行するように構成されたフラッシュトランスレーション層(FTL)として機能し得る。
データ管理には、(1)論理アドレスそれぞれとNANDフラッシュメモリ5の物理アドレスそれぞれとの間の対応関係を示すマッピング情報の管理、(2)ページ単位のリード/ライトとブロック単位の消去動作とを隠蔽するための処理、等が含まれる。論理アドレスは、SSD3をアドレス指定するためにホストによって使用されるアドレスである。この論理アドレスとしては、通常、論理ブロックアドレス(LBA)が使用される。以下では、論理アドレスが論理ブロックアドレス(LBA)である場合を想定する。
論理ブロックアドレス(LBA)それぞれと物理アドレスそれぞれとの間のマッピングの管理は、アドレス変換テーブル(論理物理アドレス変換テーブル)として機能するルックアップテーブル(LUT)32を用いて実行される。コントローラ4は、ルックアップテーブル(LUT)32を使用して、LBAそれぞれと物理アドレスそれぞれとの間のマッピングを所定の管理サイズ単位で管理する。管理サイズ単位は、限定されないが、例えば、4Kバイトであってもよい。アドレス変換テーブル(LUT32)は、SSD3の電源オン時にNANDフラッシュメモリ5からDRAM6にロードされてもよい。
あるLBAに対応する物理アドレスは、このLBAのデータがライトされたNANDフラッシュメモリ5内の物理記憶位置を示す。物理アドレスは、物理ブロックアドレスと物理ページアドレスとを含む。物理ページアドレスは全てのページに割り当てられており、また物理ブロックアドレスは全てのブロックに割り当てられている。
ページへのデータ書き込みは、1消去サイクル当たり1回のみ可能である。このため、コントローラ4は、同じLBAへのライト(上書き)を、NANDフラッシュメモリ5上の異なるページにマッピングする。つまり、コントローラ4は、ホスト2から受信されるライトコマンドによって指定されるデータ(ライトデータ)を、このデータのLBAとは無関係に、書き込み先ブロックとして現在割り当てられているブロック内の次の利用可能ページにライトする。そして、コントローラ4は、ルックアップテーブル(LUT)32を更新して、このLBAを、このデータが実際にライトされたこのページの物理アドレスに関連付ける。書き込み先ブロックに利用可能ページが無くなると、新たなブロックが書き込み先ブロックとして割り当てられる。
ブロック管理には、不良ブロックの管理と、ウェアレベリングと、ガベージコレクション等が含まれる。
ホスト2は、読み出し要求(リードコマンド)、書き込み要求(ライトコマンド)、他の様々な要求(他の様々なコマンド)をSSD3に送出する。リードコマンドは、SSD3に対してデータのリードを要求するコマンドである。リードコマンドは、リードすべきデータのLBA(先頭LBA)と、リードすべきデータのデータ長(転送長)とを含む。ライトコマンドは、SSD3に対してデータのライトを要求するコマンドである。ライトコマンドは、ライトデータ(つまり書き込むべきデータ)のLBA(先頭LBA)と、ライトデータのデータ長(転送長)とを含む。
次に、コントローラ4の構成について説明する。
コントローラ4は、ホストインタフェース11、CPU12、NANDインタフェース13、DRAMインタフェース14等を含む。これらCPU12、NANDインタフェース13、DRAMインタフェース14は、バス10を介して相互接続される。
ホストインタフェース11は、ホスト2から様々なコマンド(例えば、ライトコマンド、リードコマンド、イレーズコマンド、アンマップ(UNMAP)/トリム(Trim)コマンド、等)を受信する。
CPU12は、ホストインタフェース11、NANDインタフェース13、およびDRAMインタフェース14を制御するように構成されたプロセッサである。CPU12は、上述のFTLの処理に加え、ホスト2からの様々なコマンドを処理するためのコマンド処理等を実行する。
コマンド処理には、データ圧縮機能を含むライト処理、データ伸張機能を含むリード処理が含まれる。データ圧縮/伸張機能はCPU12によって実行されてもよい、専用のハードウェアによって実行されても良い。
これらFTL処理およびコマンド処理は、CPU12によって実行されるファームウェアによって制御されてもよい。このファームウェアは、CPU12を、ライト動作制御部21、リード動作制御部22、圧縮エンジン23、伸張エンジン24、ガベージコレクション動作制御部25、およびネームスペース制御部26として機能させる。
ライト動作制御部21は、ホスト2からの書き込み要求(ライトコマンド)の受信に応答して、書き込みデータ(ライトデータ)をホスト2から受信する。そして、ライト動作制御部21は、圧縮エンジン23を使用してライトデータを圧縮し、圧縮されたデータをNANDフラッシュメモリ5内の記憶領域に書き込む。本実施形態では、圧縮されるべきライトデータの最小データ長は、上述の管理サイズ(例えば4KB)よりも大きいデータ長に設定されている。例えば、ライトデータの最小データ長は1Mバイトであってもよい。ホスト2は、最小データ長の整数倍のデータ長を有するデータの書き込みをSSD3に要求することができる。圧縮されるべきライトデータの最小データ長を管理サイズ(例えば4KB)よりも大きいデータ長に制限することにより、NANDフラッシュメモリ5内に格納されるアドレス変換テーブル(LUT32)のサイズの増大を招くこと無く、そのデータ長が可変する圧縮後のデータが格納される物理記憶位置それぞれを効率良く管理することが可能となる。
もし例えば4KBのホストデータを圧縮するという構成が採用されたならば、圧縮によって4KBよりも小さくなった圧縮データの物理記憶位置を4KBよりも小さい管理サイズ単位で管理することが必要とされる。この場合、非常に大きなサイズのアドレス変換テーブルが必要となる。通常、アドレス変換テーブルのサイズはSSDの容量に比例する。したがって、小さい管理サイズ単位でアドレス変換情報を管理する構成では、大容量のSSDの実現が不可能となる。
さらに、ライト動作制御部21は、圧縮前のデータ(ライトデータ)のデータ長と圧縮後のライトデータのデータ長が一致しないことを考慮して、圧縮後のライトデータを次のように管理する。
すなわち、ライト動作制御部21は、ライトデータのデータ長と圧縮されたデータのデータ長との差分に基づいてLUT32を更新して、ライトデータが書き込まれるべき第1LBA範囲の先頭LBAから始まり圧縮データのデータ長に対応する第1範囲内のLBAそれぞれに、圧縮データが書き込まれた物理記憶領域の物理アドレスそれぞれをマッピングし、さらに、第1範囲に後続し、ライトデータのデータ長と圧縮されたデータのデータ長との差分に対応する第2範囲内のLBAの各々を、物理アドレスがマッピングされていない状態(「アンマップ状態」または「割り当て無し(dealocated)状態」とも称される)に設定する。これにより、たとえライトデータが圧縮によってどのような長さになったとしても、第1LBA範囲は変化せず、第1LBA範囲内の第1範囲と第2範囲との比率が変わるだけであるので、ホスト2は、圧縮前のデータのデータ長に対応するLBA範囲(第1LBA範囲)を使用して、このデータのリード及びライト(書き替え)を実行することができる。
このように、ホスト2は、圧縮後のデータの実際のデータ長を考慮することなく、圧縮前のデータ(ライトデータ)に対応するLBA範囲(第1LBA範囲)のみを使用してこの圧縮後のデータを容易にアドレス指定することが可能となる。
リード動作制御部22は、ホスト2からの読み出し要求(リードコマンド)によって第1論理アドレス範囲が読み出し対象の論理アドレス範囲として指定された場合、第1範囲内の論理アドレスそれぞれにマッピングされた物理アドレスそれぞれに基づいて、NANDフラッシュメモリ5から上述の圧縮データを読み出す。そして、リード動作制御部22は、伸張エンジン24を使用して、読み出した圧縮データを圧縮前のデータと同じデータ長のデータに伸張し、そして伸張によって得られたデータをホストインタフェース11を介してホスト2に返す。
圧縮エンジン23は、データを可逆圧縮するように構成されている。圧縮エンジン23は、複数種の圧縮方法をサポートするように構成されていても良く、これら複数種の圧縮方法のいずれかを使用してデータを圧縮してもよい。使用する圧縮方法は、ホスト2によって指定されてもよい。
伸張エンジン24は、圧縮データを伸張するように構成されている。伸張エンジン24も、上述の複数種の圧縮方法に対応する複数種の伸張処理を実行することができる。
ガベージコレクション(GC)動作制御部25は、NANDフラッシュメモリ5のフリーブロックの個数を増やすため、有効データと無効データとが混在する幾つかのブロック内の全ての有効データを別のブロック(コピー先フリーブロック)にコピーする。そして、GC動作制御部25は、ルックアップテーブル(LUT)32を更新して、コピーされた有効データのLBAそれぞれを正しい物理アドレスにマッピングする。有効データが別のブロックにコピーされることによって無効データのみなったブロックはフリーブロックとして開放される。これによって、このブロックの消去動作が実行された後にこのブロックは再利用することが可能となる。
有効データをコピーするGC動作において、ガベージコレクション(GC)動作制御部25は、圧縮エンジン23を使用して、圧縮されている有効データを再圧縮してより短いデータ長の圧縮データを生成し、この生成された圧縮データをコピー先フリーブロックにコピーしてもよい。これにより、GC動作においてコピーすることが必要なデータ量を削減することができるので、SSD3のライトアンプリフィケーションを低下させることができる。
通常、高圧縮率のデータ圧縮処理は低圧縮率のデータ圧縮処理よりも多くの処理時間を要する。このため、データ再圧縮処理を伴う上述のGC動作は、ホスト2のアイドル期間中に実行されるGC動作に特に有用である。
ネームスペース制御部26は、複数のネームスペースを管理するマルチネームスペース機能をサポートすることができる。マルチネームスペース機能は、一つのストレージデバイス(ここではSSD3)をあたかも複数のドライブであるかのように扱うことを可能にするために、複数のネームスペースそれぞれに対応する複数の論理アドレス空間(LBA空間)を管理することができる。各ネームスペースには、LBA範囲(LBA0〜LBAn−1)が割り当てられる。LBA範囲のサイズ(つまりLBAの数)はネームスペース毎に可変であってもよい。各LBA範囲は、LBA0から始まる。また、ネームスペース制御部26は、ネームスペース毎に異なるLUTを使用することによって、LBAそれぞれと物理アドレスとの間のマッピングをネームスペース毎に個別に管理しても良い。
ネームスペース制御部26は、圧縮または非圧縮をネームスペース毎に指定するホスト2からの要求に基づいて、複数のネームスペースの各々に圧縮モードまたは非圧縮モードを関連付けることができる。ライトコマンドは、データが書き込まれるべきネームスペースを指定するネームスペースIDを含む。ライトコマンド内のネームスペースIDに対応するネームスペースに圧縮モードが関連付けられている場合、コントローラ4のライト動作制御部21は、ライトコマンドによって指定されるライトデータを圧縮してNANDフラッシュメモリ5に書き込む。一方、ライトコマンド内のネームスペースIDに対応するネームスペースに非圧縮モードが関連付けられている場合、ライト動作制御部21は、ライトデータを圧縮せず、ライトデータをNANDフラッシュメモリ5に書き込む。
このように、本実施形態では、データ圧縮および圧縮データの管理の機能はSSD3によって実行される。データ圧縮機能より、データの記憶のために必要なNANDフラッシュメモリ5の物理記憶容量を削減することができる。平均圧縮率が例えば50パーセントであると仮定すると、SSD3は、SSD3の容量(物理容量)の2倍のデータ量を格納することができる。このため、SSD3は、SSD3の容量(物理容量)よりも大きなLBA空間を、SSD3の容量としてホスト2に報告してもよく、これによりシン・プロビジョニングされたストレージデバイスであるかのように動作してもよい。例えば、SSD3の容量(物理容量)が2Tバイトである場合には、SSD3のコントローラ4は、ホスト2に4TBをSSD3の容量として報告してもよい。もし実際の圧縮率が、予期される圧縮率(例えば50パーセント)よりも少ない場合には、ライト要求されたデータを格納するために必要な物理記憶領域が確保できなくなる可能性もある。この場合には、コントローラ4は、ライトエラーをホスト2に通知してもよい。
また、データ圧縮によって増えるデータ記憶容量をガベージコレクションのワークエリアとして活用することによってSSD3のライトアンプリフィケーションを低下させることも可能となる。つまり、ホストデータの格納に必要な物理記憶容量はデータ圧縮によって削減することができるので、これによってガベージコレクションが実行される頻度を下げる事ができ、この結果、SSD3のライトアンプリフィケーションを低下させることが可能となる。
ホスト2からSSD3にオフロードされる処理には、以下の処理が含まれる。
(1)データ圧縮および伸張処理
(2)圧縮後の可変長データの管理処理
データ圧縮および伸張処理は、CPU12によって実行されてもよいし、専用ハードウェアによって各々構成される圧縮エンジン23および伸張エンジン24よって実行されてもよい。
通常、ホスト2がデータ圧縮を行うケースにおいては、圧縮後のデータ長のようなメタデータの管理をホスト2側で行うことが必要となる。さらに、ホスト2は、LBA空間のフラグメンテーションを解消するために、あるLBA範囲に関連付けられた圧縮データを別のLBA範囲に移動するという一種のガベージコレクションを行う事が必要となる場合もある。このホスト2側のガベージコレクションに起因して、SSD3に書き込まれるデータの量も増え、これによってSSD3の物理記憶容量が速く消費される。この結果、SSD3によって実行されるガベージコレクション動作の頻度も高くなる。
次に、ホスト2の構成について説明する。
ホスト2は、様々なプログラムを実行する情報処理装置である。情報処理装置によって実行されるプログラムには、アプリケーションソフトウェアレイヤ41、オペレーティングシステム(OS)42、ファイルシステム43が含まれる。
一般に知られているように、オペレーティングシステム(OS)42は、ホスト2全体を管理し、ホスト2内のハードウェアを制御し、アプリケーションがハードウェアおよびSSD3を使用することを可能にするための制御を実行するように構成されたソフトウェアである。
ファイルシステム43は、ファイルの操作(作成、保存、更新、削除等)のための制御を行うために使用される。例えば、ZFS、Btrfs、XFS、ext4、NTFSなどがファイルシステム43として使用されても良い。あるいは、ファイルオブジェクトシステム(例えば、Ceph Object Storage Daemon)、Key Value Store System (例えば、Rocks DB) がファイルシステム43として使用されても良い。
様々なアプリケーションソフトウェアスレッドがアプリケーションソフトウェアレイヤ41上で走る。アプリケーションソフトウェアスレッドの例としては、クライアントソフトウェア、データベースソフトウェア、仮想マシン等がある。
アプリケーションソフトウェアレイヤ41がリードコマンドまたはライトコマンドのようなリクエストをSSD3に送出することが必要な時、アプリケーションソフトウェアレイヤ41は、OS42にそのリクエストを送出する。OS42はそのリクエストをファイルシステム43に送出する。ファイルシステム43は、そのリクエストを、コマンド(リードコマンド、ライトコマンド等)にトランスレートする。ファイルシステム43は、コマンドを、SSD3に送出する。SSD3からのレスポンスが受信された際、ファイルシステム43は、そのレスポンスをOS42に送出する。OS42は、そのレスポンスをアプリケーションソフトウェアレイヤ41に送出する。
図2は、ホスト側でデータ圧縮を実行するシステム構成において必要とされるホスト側の圧縮データ管理を示す。
ここでは、ホストが、データ#1、データ#2、データ#3、データ#4をそれぞれ圧縮し、圧縮されたデータ#1、圧縮されたデータ#2、圧縮されたデータ#3、圧縮されたデータ#4をSSDに書き込む場合を想定する。また、説明を簡単にするために、データ#1、データ#2、データ#3、データ#4の圧縮前のデータ長が同じデータ長(例えば1MB)である場合を想定する。
1MBのデータ#1を圧縮して700KBの圧縮データ#1が得られた場合、ホストは、圧縮データ#1を700KBのLBA範囲に関連付け、このLBA範囲の先頭LBAをテーブルのエントリー#1に登録し、圧縮データ#1の書き込みをSSDに要求する。
次の1MBのデータ#2を圧縮して500KBの圧縮データ#2が得られた場合、ホストは、圧縮データ#2を、700KBのLBA範囲に後続する500KBのLBA範囲に関連付け、この500KBのLBA範囲の先頭LBAをテーブルのエントリー#2に登録し、圧縮データ#2の書き込みをSSDに要求する。
次の1MBのデータ#3を圧縮して200KBの圧縮データ#3が得られた場合、ホストは、圧縮データ#3を、500KBのLBA範囲に後続する200KBのLBA範囲に関連付け、この200KBのLBA範囲の先頭LBAをテーブルのエントリー#3に登録し、圧縮データ#3の書き込みをSSDに要求する。
次の1MBのデータ#4を圧縮して600KBの圧縮データ#4が得られた場合、ホストは、圧縮データ#4を、200KBのLBA範囲に後続する600KBのLBA範囲に関連付け、この600KBのLBA範囲の先頭LBAをテーブルのエントリー#4に登録し、圧縮データ#4の書き込みをSSDに要求する。
この後、ホストは、例えばデータ#3を更新する場合がある。この更新された1MBのデータ#3’を圧縮することによって得られる圧縮データ#3’のデータ長が、200KBよりも大きくなる場合がある。例えば、1MBのデータ#3’を圧縮して600KBの圧縮データ#3’が得られた場合、ホストは、圧縮データ#3’を、圧縮データ#3の200KBのLBA範囲に関連付けることができない。このため、ホストは、圧縮データ#3’を、圧縮データ#4用の600KBのLBA範囲に後続する新たな600KBのLBA範囲に関連付け、この新たな600KBのLBA範囲の先頭LBAをテーブルの次のエントリー(エントリー#3’)に登録し、圧縮データ#3’の書き込みをSSDに要求する。圧縮データ#3に対応する200KBのLBA範囲は、有効データが割り当てられていないLBA範囲となる。
LBA空間のサイズは有限であるため、いずれ、残りLBA範囲が足らなくなる。ホストは、LBA空間のフラグメンテーションを解消して広い残りLBA範囲を確保するために、図4の右部に示すように、圧縮データ#4および圧縮データ#3’を移動することが必要となる。この場合、ホストは、まず、圧縮データ#4を、圧縮データ#3に対応する200KBのLBA範囲の先頭LBAから始まる600KBのLBA範囲に関連付け、圧縮データ#4の書き込みをSSDに要求する。この後、ホストは、圧縮データ#3’を、移動された圧縮データ#4に対応する600KBのLBA範囲に後続する600KBのLBA範囲に関連付け、圧縮データ#3’の書き込みをSSDに要求する。
このように、ホストは圧縮データ#3を圧縮データ#3’に書き替えたいだけであったにもかかわらず、圧縮データ#3’のデータ長が圧縮データ#3よりも大きいことに起因して、圧縮データ#3用のLBA範囲とは異なる新たなLBA範囲への圧縮データ#3’の書き込み、圧縮データ#4を移動させるための圧縮データ#4の再書き込み、圧縮データ#3’を移動させるための圧縮データ#3’の再書き込みといった様々な処理を行う事が必要となる。
図3は、図2のシステム構成に適用されるSSD内のデータ配置(圧縮データ配置)を示す。
図3の左部は、圧縮データ#1、圧縮データ#2、圧縮データ#3、圧縮データ#4、圧縮データ#3’が書き込まれた後のSSD内の物理記憶領域上のデータ配置を示し、図4の右部は、圧縮データ#4および圧縮データ#3’の移動後におけるSSD内の物理記憶領域上のデータ配置を示す。図3から理解されるように、SSD内においては、圧縮データ#3’の書き込みが行われた後に、さらに、圧縮データ#4の書き込み(圧縮データ#4の2回目の書き込み)が実行され、この後、またさらに、圧縮データ#3’の書き込み(圧縮データ#3’の2回目の書き込み)が実行される。
このように、ホストは圧縮データ#3を圧縮データ#3’に書き替えたいだけであったにもかかわらず、SSD内では、圧縮データ#4の2回目の書き込み、圧縮データ#3’の2回目の書き込みといった大量のデータの書き込みが実行される。
図4は、本実施形態のSSD3によって実行される圧縮データ管理を示す。
SSD3のコントローラ4は、ホスト2から最小データ長(例えば1MB)以上のデータ長のライトデータを受信し、このライトデータを圧縮し、圧縮データをNANDフラッシュメモリ5に書き込む。
1MBのデータ#1を圧縮して700KBの圧縮データ#1が得られた場合、コントローラ4は、700KBの圧縮データ#1をNANDフラッシュメモリ5に書き込む。コントローラ4は、ホスト2が圧縮データ#1のデータ長を考慮すること無く、圧縮前のデータ#1の1MBのLBA範囲#1を利用してデータ#1をアドレス指定できるようにするために、圧縮前のデータ#1に対応するLBA範#1をLBA範囲#AとLBA範囲#Bに論理的に分割する。
LBA範#1は、データ#1のためのライトコマンドにそれぞれ含まれる先頭LBAおよびデータ長(ここでは例えば1MB)の組、によって規定される。LBA範囲#Aは、ライトコマンドに含まれる先頭LBAから始まり圧縮データ#1のデータ長(ここでは例えば700KB)に対応する論理アドレス範囲である。LBA範囲#Bは、圧縮前のデータ#1に対応する1MBのLBA範囲#1内の残りの論理アドレス範囲である。このLBA範囲#Bは、LBA範囲#Aの最後のLBAの次のLBAから始まり、データ#1のデータ長と圧縮データ#1のデータ長との差分(ここでは300KB)に対応する範囲を有する。
コントローラ4は、LUT32を更新して、LBA範囲#A内のLBAそれぞれに、圧縮データ#1が書き込まれた物理記憶領域の物理アドレスそれぞれをマッピングし、さらに、LBA範囲#B内の各LBAを、物理アドレスがマッピングされていない状態(アンマップ状態(割り当て無し状態))に設定する。LBA範囲#B内の各LBAは、このLBA範囲Bに対してアンマップ/トリム処理が実行された後の状態と同じ状態(アンマップ状態)となる。
この場合、コントローラ4は、LBA範囲#Bに対応するLUT32内のエントリそれぞれを更新することによって、LBA範囲#Bに対応するLUT32内のエントリそれぞれを空き状態にするか、またはこれらエントリーにアンマップ状態(割り当て無し状態)を示す特定の値を設定しても良い。これにより、LBA範囲#B内の各LBAをアンマップ状態に設定することができる。もしLBA範囲#Bに対応するLUT32内のエントリそれぞれが既に空き状態に設定されているならば、コントローラ4は、LBA範囲#Bに対応するLUT32内のエントリそれぞれにどの物理アドレスも登録しない。これにより、LBA範囲#B内の各LBAをアンマップ状態に設定することができる。
この結果、ホスト2は、圧縮データ#1のデータ長を何等考慮すること無く、データ#1のためのライトコマンドに含まれていた先頭LBAとデータ長との組と同じ先頭LBAとデータ長との組を使用して、圧縮データ#1を容易にアドレス指定することができる。
1MBのデータ#2を圧縮して500KBの圧縮データ#2が得られた場合、コントローラ4は、500KBの圧縮データ#2をNANDフラッシュメモリ5に書き込む。コントローラ4は、ホスト2が圧縮データ#2のデータ長を考慮すること無く、圧縮前のデータ#2のための1MBのLBA範囲#2を利用してデータ#2をアドレス指定できるようにするために、圧縮前のデータ#2に対応するLBA範囲#2をLBA範囲#AとLBA範囲#Bに論理的に分割する。
圧縮前のデータ#2に対応するLBA範囲#2は、データ#2のためのライトコマンドにそれぞれ含まれる先頭LBAおよびデータ長(ここでは例えば1MB)の組によって規定される。LBA範囲#2は、例えば、LBA範囲#1に後続する1MBのLBA範囲である。LBA範囲#Aは、LBA範囲#2の先頭LBAから始まり圧縮データ#2のデータ長(ここでは例えば500KB)に対応する論理アドレス範囲である。LBA範囲#Bは、圧縮前のデータ#2に対応する1MBのLBA範囲#2内の残りの論理アドレス範囲である。このLBA範囲#Bは、LBA範囲#Aの最後のLBAの次のLBAから始まり、データ#2のデータ長と圧縮データ#2のデータ長との差分(ここでは500KB)に対応する範囲を有する。
コントローラ4は、LUT32を更新して、LBA範囲#2に含まれるLBA範囲#A内のLBAそれぞれに、圧縮データ#2が書き込まれた物理記憶領域の物理アドレスそれぞれをマッピングし、さらに、LBA範囲#2に含まれるLBA範囲#B内の各LBAを、物理アドレスがマッピングされていない状態(アンマップ状態)に設定する。
1MBのデータ#3を圧縮して200KBの圧縮データ#3が得られた場合、コントローラ4は、200KBの圧縮データ#3をNANDフラッシュメモリ5に書き込む。コントローラ4は、ホスト2が圧縮データ#3のデータ長を考慮すること無く、圧縮前のデータ#3のための1MBのLBA範囲#3を利用してデータ#3をアドレス指定できるようにするために、圧縮前のデータ#3に対応するLBA範囲#3をLBA範囲#AとLBA範囲#Bに論理的に分割する。
圧縮前のデータ#3に対応するLBA範囲#3は、データ#3のためのライトコマンドにそれぞれ含まれる先頭LBAおよびデータ長(ここでは例えば1MB)の組によって規定される。LBA範囲#3は、例えば、LBA範囲#2に後続する1MBのLBA範囲である。LBA範囲#Aは、LBA範囲#3の先頭LBAから始まり圧縮データ#3のデータ長(ここでは例えば200KB)に対応する論理アドレス範囲である。LBA範囲#Bは、圧縮前のデータ#3に対応する1MBのLBA範囲#3内の残りの論理アドレス範囲である。このLBA範囲#Bは、LBA範囲#Aの最後のLBAの次のLBAから始まり、データ#3のデータ長と圧縮データ#3のデータ長との差分(ここでは800KB)に対応する範囲を有する。
コントローラ4は、LUT32を更新して、LBA範囲#3に含まれるLBA範囲#A内のLBAそれぞれに、圧縮データ#3が書き込まれた物理記憶領域の物理アドレスそれぞれをマッピングし、さらに、LBA範囲#3に含まれるLBA範囲#B内の各LBAを、物理アドレスがマッピングされていない状態(アンマップ状態)に設定する。
1MBのデータ#4を圧縮して600KBの圧縮データ#4が得られた場合、コントローラ4は、600KBの圧縮データ#4をNANDフラッシュメモリ5に書き込む。コントローラ4は、ホスト2が圧縮データ#4のデータ長を考慮すること無く、圧縮前のデータ#4のための1MBのLBA範囲#4を利用してデータ#4をアドレス指定できるようにするために、圧縮前のデータ#4に対応するLBA範囲#4をLBA範囲#AとLBA範囲#Bに論理的に分割する。
圧縮前のデータ#4に対応するLBA範囲#4は、データ#4のためのライトコマンドにそれぞれ含まれる先頭LBAおわびデータ長(ここでは例えば1MB)の組によって規定される。LBA範囲#4は、例えば、LBA範囲#3に後続する1MBのLBA範囲である。LBA範囲#Aは、LBA範囲#4の先頭LBAから始まり圧縮データ#4のデータ長(ここでは例えば600KB)に対応する論理アドレス範囲である。LBA範囲#Bは、圧縮前のデータ#4に対応する1MBのLBA範囲#4内の残りの論理アドレス範囲である。このLBA範囲#Bは、LBA範囲#Aの最後のLBAの次のLBAから始まり、データ#4のデータ長と圧縮データ#4のデータ長との差分(ここでは400KB)に対応する範囲を有する。
コントローラ4は、LUT32を更新して、LBA範囲#4に含まれるLBA範囲#A内のLBAそれぞれに圧縮データ#4が書き込まれた物理記憶領域の物理アドレスそれぞれをマッピングし、さらに、LBA範囲#4に含まれるLBA範囲#B内の各LBAを、物理アドレスがマッピングされていない状態(アンマップ状態)に設定する。
図5は、図4の圧縮データ管理を実行するSSD3と連携するように構成されたホスト2によって実行されるデータ管理を示す。
1MBのデータ#1をSSD3に書き込むことが必要とされた場合、ホスト2は、データ#1を1MBのLBA範囲#1に関連付け、このLBA範囲#1の先頭LBAをテーブルのエントリー#1に登録し、データ#1の書き込みをSSD3に要求する。この場合、ホスト2によって送出されるライトコマンドは、このLBA範囲#1の先頭LBAと1MBのデータ長を含む。
次の1MBのデータ#2をSSD3に書き込むことが必要とされた場合、ホスト2は、データ#2を、データ#1用のLBA範囲#1に後続する次の1MBのLBA範囲#2に関連付け、次の1MBのLBA範囲#2の先頭LBAをテーブルのエントリー#2に登録し、データ#2の書き込みをSSD3に要求する。この場合、ホスト2によって送出されるライトコマンドは、LBA範囲#2の先頭LBAと、1MBのデータ長とを含む。
次の1MBのデータ#3をSSD3に書き込むことが必要とされた場合、ホスト2は、データ#3を、データ#2用のLBA範囲#2に後続する次の1MBのLBA範囲#3に関連付け、LBA範囲#3の先頭LBAをテーブルのエントリー#3に登録し、データ#3の書き込みをSSD3に要求する。この場合、ホスト2によって送出されるライトコマンドは、LBA範囲#3の先頭LBAと、1MBのデータ長とを含む。
次の1MBのデータ#4をSSD3に書き込むことが必要とされた場合、ホスト2は、データ#4を、データ#3用のLBA範囲#3に後続する次の1MBのLBA範囲#4に関連付け、LBA範囲#4の先頭LBAをテーブルのエントリー#4に登録し、データ#4の書き込みをSSD3に要求する。この場合、ホスト2によって送出されるライトコマンドは、LBA範囲#4の先頭LBAと、1MBのデータ長とを含む。
この後、ホストは、例えばデータ#3を更新する場合がある。この更新された1MBのデータ#3’をSSD3に書き込むことが必要とされた場合、ホスト2は、データ#3’をデータ#3用のLBA範囲#3に関連付け、テーブルのエントリー#3にLBA範囲#3の先頭LBAをデータ#3’の先頭LBAとして登録し、データ#3’の書き込みをSSD3に要求する。この場合、ホスト2によって送出されるライトコマンドは、LBA範囲#3の先頭LBAと、1MBのデータ長とを含む。
このように、データ#3’をデータ#3用のLBA範囲#3に関連付けることができるので、ホスト2は、データ#3’を新たなLBA範囲に関連付ける処理およびLBA範囲#3のデータを無効化する処理を実行する必要が無い。さらに、フラグメンテーションも発生しないので、データ#4、データ#3’を移動する処理を実行する必要もなくなる。
図6は、SSD3内のデータ配置(圧縮データ配置)を示す。
図6の左部は、データ#1、データ#2、データ#3、データ#4が書き込まれた後のSSD3内の物理記憶領域上のデータ配置を示している。
1MBのデータ#1はSSD3のコントローラ4によって圧縮される。データ#1の圧縮によって700KBの圧縮データ#1が生成された場合、コントローラ4は、700KBの圧縮データ#1をNANDフラッシュメモリ5内の700KB分の記憶領域に書き込み、LBA範囲#1内の最初の700KBのLBAそれぞれに対してのみ、圧縮データ#1が書き込まれた記憶領域の物理アドレスそれぞれをマッピングし、LBA範囲#1内の残りの300KB分のLBAそれぞれをアンマップ状態に設定する。
次の1MBのデータ#2はSSD3のコントローラ4によって圧縮される。データ#2の圧縮によって500KBの圧縮データ#2が生成された場合、コントローラ4は、500KBの圧縮データ#2をNANDフラッシュメモリ5内の次の500KB分の記憶領域に書き込み、LBA範囲#2内の最初の500KBのLBAそれぞれに対してのみ、圧縮データ#2が書き込まれた記憶領域の物理アドレスそれぞれをマッピングし、LBA範囲#2内の残りの500KB分のLBAそれぞれをアンマップ状態に設定する。
次の1MBのデータ#3はSSD3のコントローラ4によって圧縮される。データ#3の圧縮によって200KBの圧縮データ#3が生成された場合、コントローラ4は、200KBの圧縮データ#3をNANDフラッシュメモリ5内の次の200KB分の記憶領域に書き込み、LBA範囲#3内の最初の200KBのLBAそれぞれに対してのみ、圧縮データ#3が書き込まれた記憶領域の物理アドレスそれぞれをマッピングし、LBA範囲#3内の残りの800KB分のLBAそれぞれをアンマップ状態に設定する。
次の1MBのデータ#4はSSD3のコントローラ4によって圧縮される。データ#4の圧縮によって600KBの圧縮データ#4が生成された場合、コントローラ4は、600KBの圧縮データ#4をNANDフラッシュメモリ5内の次の600KB分の記憶領域に書き込み、LBA範囲#4内の最初の600KBのLBAそれぞれに対してのみ、圧縮データ#4が書き込まれた記憶領域の物理アドレスそれぞれをマッピングし、LBA範囲#4内の残りの400KB分のLBAそれぞれをアンマップ状態に設定する。
図6の右部は、データ#3’が書き込まれた後のSSD3内の物理記憶領域上のデータ配置を示している。
1MBのデータ#3’はSSD3のコントローラ4によって圧縮される。データ#3’の圧縮によって600KBの圧縮データ#3’が生成された場合、コントローラ4は、600KBの圧縮データ#3’をNANDフラッシュメモリ5内の600KB分の記憶領域に書き込み、LBA範囲#3内の最初の600KBのLBAそれぞれに対してのみ、圧縮データ#3’が書き込まれた記憶領域の物理アドレスそれぞれをマッピングし、LBA範囲#3内の残りの400KB分のLBAそれぞれをアンマップ状態に設定する。
次に、SSD3によって実行される書き込み動作と読み出し動作の仕様の概要について説明する。
(1)書き込み動作(圧縮書き込み動作)
ホスト2は、先頭LBAとデータ長との組を指定するライトコマンドをSSD3に送出する。
SSD3のコントローラ4は、圧縮データが記録済みの領域の途中からの書き換えは許容しない。つまり、SSD3のコントローラ4は、ライトコマンドの先頭LBAの既存データが圧縮データであり、ライトコマンドの先頭LBAが前回記録時の先頭LBAと一致しなかった場合は、エラーを示すレスポンスをホスト2に返す。いま、例えば、ある1MBのLBA範囲に対応するデータがSSD3によって圧縮され、この圧縮データがSSD3内に記録されている状態を想定する。もしホスト2から受信される後続のライトコマンドによってこのLBA範囲の途中から始まる範囲が書き込み対象のLBA範囲として指定されたならば、SSD3のコントローラ4は、このライトコマンドの実行を許容せず、エラーを示すレスポンスをホスト2に返す。一方、もしホスト2から受信される後続のライトコマンドによってこのLBA範囲の先頭LBAから始まる範囲が書き込み対象のLBA範囲として指定されたならば、SSD3のコントローラ4は、このライトコマンドの実行を許容し、このデータを圧縮して書き込むための書き込み動作(圧縮書き込み動作)を実行する。
圧縮対象のデータ長の最小データ長は、管理サイズよりも大きい。最小データ長は、例えば1MBで、ホスト2はその整数倍の長さを任意に選択できる。
データの長さは書き込みの都度選択可能であるが、書き込み可能なデータの最大長は圧縮エンジンの制約を受ける。
SSD3のコントローラ4は、複数種の圧縮方法(圧縮メソッド)をサポートする。ホスト2は、必要に応じて、使用すべき圧縮方法(圧縮メソッド)を指定することができる。ライトコマンドは複数種の圧縮方法の一つを指定するパラメータを含んでもよい。SSD3のコントローラ4は、このパラメータによって指定される圧縮方法を使用してライトデータを圧縮する。ホスト2が圧縮方法を指定しない場合、SSD3のコントローラ4は、デフォルトの圧縮方法メソッドを使用してライトデータを圧縮する。
さらに、SSD3は、非圧縮モードもサポートする。この場合、ライトコマンドは、圧縮または非圧縮を指定するパラメータを含む。コントローラ4は、パラメータによって非圧縮が指定された場合、ライトデータを圧縮せずに、ライトデータをNANDフラッシュメモリ5内の記憶領域に書き込む。
さらに、SSD3のコントローラ4は、SSD3を非圧縮データと圧縮データの混在を許容するドライブ(ストレージデバイス)として機能させることができる。
ホスト2は、ネームスペース毎に圧縮か非圧縮を選択することができる。コントローラ4は、圧縮または非圧縮をネームスペース毎に指定するホスト2からの要求に基づいて、複数のネームスペースの各々に圧縮モードまたは非圧縮モードを関連付ける。ライトコマンドに含まれるネームスペースIDに対応するネームスペースに圧縮モードが関連付けられている場合、コントローラ4は、ライトデータを圧縮する。ライトコマンドに含まれるネームスペースIDに対応するネームスペースに非圧縮モードが関連付けられている場合、コントローラ4は、ライトデータを圧縮しない。
同一ネームスペース内に非圧縮データと圧縮データとが混在されてもよい。この場合には、ライトコマンドは、ネームスペースIDと、圧縮または非圧縮を指定するパラメータとを含んでもよい。
(2)読み出し動作
ホスト2は、基本的には、書き込み時に指定した先頭LBAとデータ長との組と同じ先頭LBAとデータ長との組を指定するリードコマンドをSSD3に送出すればよい。
SSD3のコントローラ4は、圧縮データが記録済みの領域内の途中の一部のデータの読み出しをサポートしない。
SSD3のコントローラ4は、圧縮データが記録済みの領域の先頭から始まる一部のデータの読み出しをサポートする。
いま、例えば、ある1MBのLBA範囲に対応するデータがSSD3によって圧縮され、この圧縮データがSSD3内に記録されている状態を想定する。もしホスト2から受信されるリードコマンドによってこのLBA範囲の途中から始まる範囲が読み出し対象のLBA範囲として指定されたならば、SSD3のコントローラ4は、このリードコマンドの実行を許容せず、エラーを示すレスポンスをホスト2に返す。一方、もしホスト2から受信されるリードコマンドによってこのLBA範囲の先頭LBAから始まる範囲が読み出し対象のLBA範囲として指定されたならば、SSD3のコントローラ4は、このリードコマンドの実行を許容する。
図7は、SSD3によって実行される書き込み動作(圧縮書き込み動作)を示す。
SSD3のコントローラ4は、ホスト2からのライトコマンドの受信に応答して、上述の最小データ長以上のデータ長(例えば1MB)を有するライトデータをホスト2から受信する。ライトコマンドは、先頭LBA(LBAx)とデータ長(例えば1MB)とを含む。
コントローラ4は、ホスト2から到着したライトデータを圧縮し、この圧縮データのデータ長を確定する(ステップS11)。コントローラ4は、圧縮データのデータ長を4KB単位(管理サイズ単位)に切り上げて丸めることによって圧縮データのデータ長を調整してもよい(ステップS12)。コントローラ4は、通常のデータ書き込み動作と同様に圧縮データをNANDフラッシュメモリ5の物理記憶位置、つまり現在の書き込み先ブロックの利用可能なページそれぞれに、書き込む(ステップS13)。コントローラ4は、LUT32を更新して、圧縮データ(有効データ)を書き込むLBA範囲内のLBAそれぞれに、圧縮データ(有効データ)が書き込まれた物理記憶位置それぞれの物理アドレスをマッピングする(ステップS14)。圧縮データ(有効データ)を書き込むLBA範囲は、先頭LBA(LBAx)から始まり、圧縮データのデータ長に対応する範囲を有する。例えば、圧縮データのデータ長が700KBであれば、先頭LBA(LBAx)から始まる700KBのLBA範囲にのみ物理アドレスがマッピングされ、これによってこのLBA範囲内の各LBAが対応する物理アドレスに関連付けられる。そして、コントローラ4は、残りの300KBのLBA範囲を物理アドレスがマッピングされていないアンマップ状態に設定する(ステップS15)。残りの300KBのLBA範囲に対応するLUT32内のエントリーそれぞれが既に空き状態に設定されているか、あるいはアンマップ状態を示す値が各エントリーに設定されていれば、コントローラ4は、これらエントリーに物理アドレスを登録しなければよい。ステップS15では、コントローラ4は、このLBA範囲に後続する残りの300KBのLBA範囲に対して必要に応じてトリム(Trim)処理を実施する。これにより、たとえ残りの300KBのLBA範囲に古いデータの物理アドレスが関連付けられていたとしても、残りの300KBのLBA範囲をアンマップ状態にすることができる。
この結果、コントローラ4は、ライトデータのデータ長と圧縮データのデータ長との間の差分領域(ここでは、残りの300KBのLBA範囲)を、トリム/アンマップされたLBA範囲であるかのように扱うことができる。先頭LBA(LBAx)から始まる1MBのLBA範囲に対応するデータが圧縮によってどのようなデータ長に変わったとしても、ホスト2は、この1MBのLBA範囲を使用して、このデータのリード及びライト(書き替え)を実行することができる。よって、図2で説明したようなホスト側でのガベージコレクションが不要となるので、SSD3へ書き込まれるデータ量も減少される。
図8は、SSD3によって実行されるデータ読み出し動作を示す。
ホスト2が、図7で書き込まれた上述のデータをリードすることが必要になった時、ホスト2は、先頭LBA(LBAx)とデータ長(1MB)とを含むリードコマンドをSSD3に送出する。
このリードコマンドの受信に応答して、SSD3のコントローラ4は、LUT32を参照して、先頭LBA(LBAx)から始まる1MBのLBA範囲にマッピングされた物理アドレスそれぞれを特定する(ステップS21)。本実施形態においては、このLBA範囲内の最初の700KBバイト分の範囲についてのみ物理アドレスが割り当てられており、残りの300KBバイト分の範囲については物理アドレスは割り当てられていない。したがって、コントローラ4は、最初の700KBバイト分の範囲内のLBAそれぞれに対応する物理アドレスに基づいて、700KBバイトの圧縮データをNANDフラッシュメモリ5からリードする(ステップS23)。コントローラ4は、リードされた圧縮データを伸張して1MBのデータを得る(ステップS23)。そして、コントローラ4は、伸張によって得られた1MBのデータをホスト2に返す(ステップS24)。
もしホスト2が先頭LBA(LBAx)とデータ長(例えば256KB)とを含むリードコマンドをSSD3に送出したならば、コントローラ4は、伸張によって得られる最初の256KBのデータのみをホスト2に返す。
図9は、SSD3のNANDフラッシュメモリ5に保存される管理情報の例を示す。
この管理情報は、受信されたライトコマンドそれぞれに対応する複数の記憶領域を含む。各記憶領域は、「先頭LBA」フィールド、「圧縮前のデータ長」フィールド、「圧縮後のデータ長」フィールド、「圧縮メソッド」フィールド、「圧縮フラグ」フィールドを含んでいてもよい。「先頭LBA」フィールドは、対応するライトコマンドによって指定された先頭LBAを示す。「圧縮前のデータ長」フィールドは、圧縮前のデータ(ホストから到来するライトデータ)のデータ長、つまり対応するライトコマンドによって指定されたデータ長を示す。「圧縮後のデータ長」フィールドは、圧縮後のデータのデータ長を示す。「圧縮メソッド」フィールドは、データ圧縮のために使用された圧縮方法を示す。「圧縮フラグ」フィールドは、書き込まれたデータが圧縮データまたは非圧縮データのいずれであるかを示す。
SSD3のコントローラ4は、この管理情報に基づいて、データ読み出し動作やガベージコレクション動作をより精度良く実行することができる。
図10は、NANDフラッシュメモリ5の各ブロックの各ページに書き込まれる管理情報の例を示す。
各ページには、ユーザデータに加え、このユーザデータに関する管理情報が書き込まれても良い。この管理情報には、このユーザデータのLBA、このユーザデータが圧縮データまたは非圧縮データのいずれであるかを示す圧縮フラグ、このユーザデータに適用された圧縮方法を示す圧縮メソッド情報が含まれていても良い。さらに、このユーザデータに関する管理情報は、このユーザデータのLBAが先頭LBAであるか否かを示す情報を含んで良い。
図11は、SSD3に適用されるライトコマンドを示す。
ライトコマンドは、以下のパラメータを含む。
(1)先頭LBA
(2)データ長(論理ブロックの数)
(3)圧縮モード
先頭LBAは、書き込まれるべきデータの先頭LBAを示す。
データ長は、書き込まれるべきデータの長さ(書き込まれるべきデータに対応する論理ブロックの数)を示す。最小データ長は、管理サイズよりも大きいデータ長である。ホスト2は最小データ長の整数倍の長さを指定することができる。
圧縮モードは、「00」、「01」、「10」、「11」に対応する4つのモードのいずれかを指定することができる。「00」は、デフォルトの圧縮方法を使用することを指定する。「01」は、圧縮方法#1を使用することを指定する。「10」は、圧縮方法#1とは異なる圧縮方法#2を使用することを指定する。「11」は、データを圧縮せずに書き込むことを指定する。
図12は、SSD3に適用される拡張ネームスペース管理コマンドを示す。
拡張ネームスペース管理コマンドは、ネームスペースの作成および削除と、ネームスペースと圧縮モードとの間の関連付け、とを含むネームスペース管理のために使用される。拡張ネームスペース管理コマンドは、以下のパラメータを含む。
(1)作成/削除
(2)LBA範囲(論理ブロックの数)
(3)物理リソースサイズ
(4)圧縮モード
作成/削除のパラメータ「0」は、ネームスペースの作成をSSD3に要求する。作成/削除のパラメータ「1」は、ネームスペースの削除をSSD3に要求する。ネームスペースの削除を要求する場合には、削除対象のネームスペースのIDを示すパラメータが拡張ネームスペース管理コマンドに設定されてもよい。ネームスペースの削除を要求する場合には、LBA範囲(論理ブロックの数)、物理リソースサイズ、圧縮モードは無視されても良い。
LBA範囲は、ネームスペース用のLBA範囲(LBA0〜n−1)を示す。このLBA範囲は、このネームスペースのユーザ領域にマッピングされる。
物理リソースサイズは、ネームスペース用に確保されるべき物理ブロックの個数を示す。
圧縮モードは、このネームスペースに関連付けるべき圧縮モードを示す。圧縮モードは、「00」、「01」、「10」、「11」に対応する4つのモードのいずれかを指定する。「00」は、デフォルトの圧縮方法を使用することを指定する。「01」は、圧縮方法#1を使用することを指定する。「10」は、圧縮方法#1とは異なる圧縮方法#2を使用することを指定する。「11」は、データを圧縮せずに書き込むことを指定する。
図13は、SSD3に適用されるリードコマンドを示す。
リードコマンドは、以下のパラメータを含む。
(1)先頭LBA
(2)データ長(論理ブロックの数)
先頭LBAは、読み出すべきデータの先頭LBAを示す。
データ長は、読み出すべきデータの長さ(読み出すべきデータに対応する論理ブロックの数)を示す。典型的には、
最小データ長は、管理サイズよりも大きいデータ長である。ホスト2は最小データ長の整数倍の長さを指定することができる。典型的には、先頭LBAとデータ長の組は、書き込み時のLBAとデータ長との組と同じである。
図14は、SSD3によって実行されるライト処理の手順を示す。
SSD3のコントローラ4は、書き込み要求(ライトコマンド)と書き込むべきデータ(ライトデータ)とをホスト2から受信する(ステップS31、S32)。コントローラ4は、ライトコマンド内の先頭LBAの既存データが圧縮データであるか否かを判定する(ステップS33)。ライトコマンド内の先頭LBAの既存データが圧縮データであるならば(ステップS33のYES)、コントローラ4は、ライトコマンド内の先頭LBAが既存データ(圧縮データ)の先頭LBAに一致するか否かを判定する(ステップS34)。ライトコマンド内の先頭LBAが既存データ(圧縮データ)の先頭LBAに一致しないならば(ステップS34のNO)、コントローラ4は、ライトコマンドに含まれる先頭LBAおよびデータ長の組によって指定される書き込み対象のLBA範囲が既存データ(圧縮データ)のLBA範囲の途中のLBAから始まるLBA範囲であると認識し、このライトコマンドを実行せず、エラーを示すレスポンスをホスト2に返す(ステップS35)。
ライトコマンド内の先頭LBAの既存データが圧縮データではないならば(ステップS33のNO)、またはライトコマンド内の先頭LBAの既存データが圧縮データであり且つライトコマンド内の先頭LBAが既存データ(圧縮データ)の先頭LBAに一致するならば(ステップS34のYES)、コントローラ4は、ライトコマンドを実行する。
この場合、コントローラ4は、まず、ライトコマンド内の圧縮モードのパラメータをチェックし(ステップS36)、圧縮モードまたは非圧縮モードのどちらが指定されているかを判定する(ステップS37)。
非圧縮モードが指定されたならば(ステップS37のNO)、コントローラ4は、ライトデータをNANDフラッシュメモリ5の物理記憶位置、つまり現在の書き込み先ブロックの利用可能なページそれぞれに書き込み(ステップS38)、LUT32を更新してライトデータのLBA範囲内のLBAそれぞれに物理記憶位置の物理アドレスそれぞれをマッピングし(ステップS39)、ライト完了を示すレスポンスをホスト2に返す(ステップS40)。
圧縮モードが指定されたならば(ステップS37のYES)、コントローラ4は、指定された圧縮方法(デフォルトの圧縮方法、またはライトコマンドによって明示的に指定された圧縮方法)を使用してライトデータを圧縮し、圧縮データのデータ長を確定する(ステップS41)。コントローラ4は、圧縮データのデータ長を4KB単位(管理サイズ単位)に切り上げて丸めることによって圧縮データのデータ長を調整してもよい(ステップS42)。コントローラ4は、圧縮データをNANDフラッシュメモリ5の物理記憶位置、つまり現在の書き込み先ブロックの利用可能なページそれぞれに書き込む(ステップS43)。コントローラ4は、LUT32を更新して、圧縮データ(有効データ)が書き込まれたLBA範囲内のLBAそれぞれに、圧縮データ(有効データ)が書き込まれた物理記憶位置それぞれの物理アドレスをマッピングする(ステップS44)。圧縮データが書き込まれたLBA範囲は、ライトコマンド内の先頭LBAから始まり、圧縮データのデータ長に対応する範囲を有する。そして、コントローラ4は、ライトデータのデータ長と圧縮データのデータ長との間の差分に対応する残りのLBA範囲内の各LBAを、物理アドレスがマッピングされていないアンマップ状態に設定する(ステップS45)。この後、コントローラ4は、ライト完了を示すレスポンスをホスト2に返す(ステップS40)。このレスポンスは、ホスト2に圧縮データ長を通知するために、圧縮データのデータ長を示すパラメータを含んでいてもよい。
図15は、SSD3に適用される、ネームスペース用のライトコマンドを示す。
ネームスペース用のライトコマンドは、以下のパラメータを含む。
(1)先頭LBA
(2)データ長(論理ブロックの数)
(3)NSID
先頭LBAは、書き込まれるべきデータの先頭LBAを示す。
データ長は、書き込まれるべきデータの長さ(書き込まれるべきデータに対応する論理ブロックの数)を示す。最小データ長は、管理サイズよりも大きいデータ長である。ホスト2は最小データ長の整数倍の長さを指定することができる。
NSIDは、データが書き込まれるべきネームスペースの識別子(ID)を示す。
図16は、指定されたネームスペースにデータを書き込むライト処理の手順を示す。
SSD3のコントローラ4は、書き込み要求(ライトコマンド)と書き込むべきデータ(ライトデータ)とをホスト2から受信する(ステップS51、S52)。コントローラ4は、ライトコマンド内の先頭LBAの既存データが圧縮データであるか否かを判定する(ステップS53)。ライトコマンド内の先頭LBAの既存データが圧縮データであるならば(ステップS53のYES)、コントローラ4は、ライトコマンド内の先頭LBAが既存データ(圧縮データ)の先頭LBAに一致するか否かを判定する(ステップS54)。ライトコマンド内の先頭LBAが既存データ(圧縮データ)の先頭LBAに一致しないならば(ステップS54のNO)、コントローラ4は、ライトコマンドに含まれる先頭LBAおよびデータ長の組によって指定される書き込み対象のLBA範囲が既存データ(圧縮データ)のLBA範囲の途中のLBAから始まるLBA範囲であると認識し、このライトコマンドを実行せず、エラーを示すレスポンスをホスト2に返す(ステップS55)。
ライトコマンド内の先頭LBAの既存データが圧縮データではないならば(ステップS53のNO)、またはライトコマンド内の先頭LBAの既存データが圧縮データであり且つライトコマンド内の先頭LBAが既存データ(圧縮データ)の先頭LBAに一致するならば(ステップS54のYES)、コントローラ4は、ライトコマンドを実行する。
この場合、コントローラ4は、まず、ライトコマンド内のNSIDに関連付けられている圧縮モード情報をチェックし(ステップS56)、このNSIDに圧縮モードまたは非圧縮モードのどちらが関連付けられているかを判定する(ステップS57)。
非圧縮モードが関連付けられているならば(ステップS57のNO)、コントローラ4は、ライトデータをNANDフラッシュメモリ5の物理記憶位置、つまりこのNSIDのネームスペース用に割り当てられている現在の書き込み先ブロックの利用可能なページそれぞれに書き込み(ステップS58)、このNSIDのネームスペース用のLUTを更新してライトデータのLBA範囲内のLBAそれぞれに物理記憶位置の物理アドレスそれぞれをマッピングし(ステップS59)、ライト完了を示すレスポンスをホスト2に返す(ステップS60)。
圧縮モードが関連付けられているならば(ステップS57のYES)、コントローラ4は、このNSIDに関連付けられた圧縮方法(デフォルトの圧縮方法、または拡張ネームスペース管理コマンドによって明示的に指定された圧縮方法)を使用してライトデータを圧縮し、圧縮データのデータ長を確定する(ステップS61)。コントローラ4は、圧縮データのデータ長を4KB単位(管理サイズ単位)に切り上げて丸めることによって圧縮データのデータ長を調整してもよい(ステップS62)。コントローラ4は、圧縮データをNANDフラッシュメモリ5の物理記憶位置、つまりこのNSIDのネームスペース用に割り当てられている現在の書き込み先ブロックの利用可能なページそれぞれに書き込む(ステップS63)。コントローラ4は、このNSIDのネームスペース用のLUTを更新して、圧縮データ(有効データ)が書き込まれたLBA範囲内のLBAそれぞれに、圧縮データ(有効データ)が書き込まれた物理記憶位置それぞれの物理アドレスをマッピングする(ステップS64)。圧縮データが書き込まれたLBA範囲は、ライトコマンド内の先頭LBAから始まり、圧縮データのデータ長に対応する範囲を有する。そして、コントローラ4は、ライトデータのデータ長と圧縮データのデータ長との間の差分に対応する残りのLBA範囲内の各LBAを、物理アドレスがマッピングされていないアンマップ状態に設定する(ステップS65)。この後、コントローラ4は、ライト完了を示すレスポンスをホスト2に返す(ステップS60)。このレスポンスは、ホスト2に圧縮データ長を通知するために、圧縮データのデータ長を示すパラメータ(リターン値)を含んでいてもよい。
図17は、SSD3によって実行されるリード処理の手順を示す。
SSD3のコントローラ4は、読み出し要求(リードコマンド)をホスト2から受信する(ステップS71)。コントローラ4は、リードコマンド内の先頭LBAの既存データが圧縮データであるか否かを判定する(ステップS72)。リードコマンド内の先頭LBAの既存データが圧縮データであるならば(ステップS72のYES)、コントローラ4は、リードコマンド内の先頭LBAが既存データ(圧縮データ)の先頭LBAに一致するか否かを判定する(ステップS73)。リードコマンド内の先頭LBAが既存データ(圧縮データ)の先頭LBAに一致しないならば(ステップS73のNO)、コントローラ4は、リードコマンドに含まれる先頭LBAおよびデータ長の組によって指定される読み出し対象のLBA範囲が既存データ(圧縮データ)のLBA範囲の途中のLBAから始まるLBA範囲であると認識し、このリードコマンドを実行せず、エラーを示すレスポンスをホスト2に返す(ステップS74)。
リードコマンド内の先頭LBAの既存データが圧縮データではないならば(ステップS72のNO)、またはリードコマンド内の先頭LBAの既存データが圧縮データであり且つリードコマンド内の先頭LBAが既存データ(圧縮データ)の先頭LBAに一致するならば(ステップS73のYES)、コントローラ4は、リードコマンドを実行する。
この場合、コントローラ4は、リードコマンドに含まれる先頭LBAおよびデータ長によって指定される読み出し対象のLBA範囲に対応する既存データが圧縮データであるか非圧縮データであるかを判定するために既存データの圧縮モードをチェックする(ステップS75)。以下では、読み出し対象のLBA範囲に対応する既存データが圧縮データである場合を想定する。
コントローラ4は、LUT32を参照し(ステップS76)、読み出し対象のLBA範囲内のLBAそれぞれにマッピングされた物理アドレスそれぞれを取得する(ステップS77)。本実施形態においては、このLBA範囲内の最初の範囲(圧縮データが書き込まれている物理記憶位置それぞれに対応するLBA範囲)についてのみ物理アドレスが割り当てられており、このLBA範囲の残りの範囲については物理アドレスは割り当てられていない。したがって、コントローラ4は、最初の範囲内のLBAそれぞれに対応する物理アドレスに基づいて、圧縮データをNANDフラッシュメモリ5からリードする(ステップS78)。コントローラ4は、リードされた圧縮データを伸張し(ステップS79)、伸張によって得られたデータをホスト2に返す(ステップS80)。ステップS79では、コントローラ4は、対応する「圧縮前のデータ長」フィールドを参照することにより、リードされた圧縮データをオリジナルのデータ長に伸張することができる。
図18は、SSD3によって実行されるガベージコレクション(GC)動作を示す。
コントローラ4は、有効データと無効データとが混在するブロック群から一つ以上のGC対象ブロックを選択する。図18では、ブロックB11、B12、B13がGC対象ブロックとして選択された場合が想定されている。また、コントローラ4は、全てのフリーブロックを含むフリーブロックプール(フリーブロックリスト)60を管理する。コントローラ4は、これらフリーブロックから一つのフリーブロックB101をコピー先ブロックとして割り当てる。コントローラ4は、各GC対象ブロックの有効データのみをコピー先ブロックにコピーする。
有効データが圧縮データであるならば、コントローラ4は、この有効データを再圧縮し、この有効データよりもデータ長の短い圧縮データを生成する。そして、コントローラ4は、この生成された圧縮データをコピー先フリーブロックにコピーする。
図19は、SSD3によって実行されるガベージコレクション処理の手順を示す。
SSD3のコントローラ4は、GC開始条件が満たされたか否かを判定する(ステップS91)。GC開始条件は、GC動作を開始するための条件である。例えば、残りフリーブロックの数が閾値以下になった場合、あるいはGC開始を要求するコマンドがホスト2から受信された場合に、コントローラ4は、GC開始条件が満たされたと判定する。
GC開始条件が満たされたならば(ステップS91のYES)、コントローラ4は、有効データと無効データとが混在する一つ以上のブロックをGC対象ブロックとして選択する(ステップS92)。
コントローラ4は、あるGC対象ブロック内の有効データを選択し(ステップS93)、この有効データを読み出し、この有効データが圧縮データであるか否かを判定する(ステップS94)。
読み出された有効データが圧縮データであるならば(ステップS94のYES)、コントローラ4は、この圧縮データを伸張し(ステップS95)、伸張されたデータを、読み出された圧縮データに適用されていた圧縮方法よりも高圧縮率の別の圧縮方法を使用して圧縮(再圧縮)して、圧縮データよりもデータ長の短い圧縮データ(再圧縮データ)を生成する(ステップS96)。そして、コントローラ4は、この再圧縮データをコピー先ブロックにコピーする(圧縮書き込む)(ステップS97)。ステップS97では、読み出された圧縮データの圧縮前のデータ長に対応するLBA範囲は、このLBA範囲の先頭LBAから開始され且つ再圧縮データのデータ長に対応する範囲を有するLBA範囲#Aと、圧縮前のデータ長と再圧縮データのデータ長との間の差分に対応するLBA範囲#Bとに論理的に分割される。そして、LUT32が更新されて、LBA範囲#Aにのみコピー先ブロックの物理アドレスそれぞれがマッピングされ、LBA範囲#Bはアンマップ状態に設定される。
読み出された有効データが圧縮データでないならば(ステップS94のYES)、コントローラ4は、読み出された有効データを、コピー先ブロックにコピーする(ステップS97)。ステップS97では、読み出された有効データのLBA範囲内のLBAそれぞれにコピー先ブロックの物理アドレスそれぞれがマッピングされる。
図20は、SSD3によって実行されるガベージコレクション処理の別の手順を示す。ここでは、図19のステップS94とS95との間にステップS100が追加されている。
読み出された有効データが圧縮データであるならば(ステップS94のYES)、コントローラ4は、読み出された有効データ(圧縮データ)が、頻繁に更新されるデータ(ホットデータ)、または、頻繁に更新されないかあるいは滅多に更新されないデータ(コールドデータ)のいずれであるかを判定する(ステップS100)。ホットデータは、ある高い更新頻度を有する第1タイプデータである。コールドデータは、ホットデータの更新頻度よりも低い更新頻度を有する第2タイプデータである。
読み出された有効データがホットデータであるならば、たとえこの有効データを高い圧縮率で再圧縮しても、この再圧縮されたデータは再び書き替えられてしまう可能性が高い。したがって、本実施形態では、読み出された有効データ(圧縮データ)がコールドデータである場合に、再圧縮が実行される。
すなわち、読み出された有効データ(圧縮データ)がコールドデータであるならば、コントローラ4は、読み出された有効データ(圧縮データ)を伸張し(ステップS95)、伸張されたデータを、読み出された圧縮データに適用されていた圧縮方法よりも高圧縮率の別の圧縮方法を使用して圧縮(再圧縮)して、圧縮データよりもデータ長の短い圧縮データ(再圧縮データ)を生成する(ステップS96)。そして、コントローラ4は、この再圧縮データをコピー先ブロックにコピーする(圧縮書き込む)(ステップS97)。
このように、GC時にコールドデータを再圧縮してコピー先ブロックにコピーすることにより、ホストデータの格納に必要な物理記憶容量をより削減することができる。
ホットデータ/コールドデータを判定する方法の例について説明する。
コントローラ4は、ブロック使用順序管理リストを管理しても良い。ブロック使用順序管理リストは、書き込み先ブロック用に割り当てられたブロックそれぞれに付与される割り当て番号(シーケンシャル番号)を保持する。すなわち、コントローラ4は、書き込み先ブロックとして割り当てられたブロックそれぞれに対してその割り当て順序を示す番号(割り当て番号)を付与する。番号は1から始まるシーケンシャル番号であってもよい。例えば、最初に書き込み先ブロック用に割り当てられたブロックには割り当て番号=1が付与され、2番目に書き込み先ブロック用に割り当てられたブロックには割り当て番号=2が付与され、3番目に書き込み先ブロック用に割り当てられたブロックには割り当て番号=3が付与される。これにより、どのブロックがどのような順序で書き込み先ブロックとして割り当てられたかを示すブロック使用履歴を管理することができる。割り当て番号としては、新たなフリーブロックが書き込み先ブロック用に割り当てられる度にインクリメントされるカウンタの値を使用できる。
古い割り当て番号が付与されたブロックに存在する有効データは、現在までに更新されなかったデータである。したがって、コントローラ4は、例えば、現在の書き込み先ブロックの割り当て番号とGC対象ブロックの割り当て番号との差が閾値以上であるならば、このGC対象ブロック内の有効データをコールドデータであると判定してもよい。
あるいは、コントローラ4は、GC回数管理リストを管理しても良い。GC回数管理リストは、ホスト2によって書き込まれたデータを含むブロック毎にガベージコレクション回数(GC回数)を保持するためのリストである。GC回数は、ホスト2によって書き込まれたデータを含む各ブロック内のデータがガベージコレクション(GC)動作によって当該ブロックにコピーされた回数を示す。GC回数管理リストは、GC回数(例えば、GC回数=0〜GC回数=n)別にブロックそれぞれを管理するための複数のGC回数リストから構成されてもよい。ここで、nは、管理すべきGC回数の上限値である。例えば、GC回数=0のGC回数リストは、0回のGC回数に関連づけられたブロックそれぞれのブロックID(例えば物理ブロックアドレス)のリストを保持する。GC回数=1のGC回数リストは、1回のGC回数に関連づけられたブロックそれぞれのブロックID(例えば物理ブロックアドレス)のリストを保持する。
図21は、SSD3によって実行されるGC回数管理動作とGC動作とを示す。
SSD3のコントローラ4は、あるフリーブロックを、ホスト2からのデータ(ライトデータ)の書き込み用の書き込み先ブロックとして割り当て、ホスト2から受信されるライトデータをこの書き込み先ブロック内の利用可能ページそれぞれに順次書き込む。現在の書き込み先ブロックの全てのページがデータで満たされた時、コントローラ4は、現在の書き込み先ブロックをアクティブブロック(データを含むブロック)として管理する。さらに、コントローラ4は、別のフリーブロックを新たな書き込み先ブロックとして割り当てる。このようにして、SSD3においては、ホスト2から受信されるデータ(ライトデータ)は、その到着順に、現在の書き込み先ブロックの最初のページから最後のページに向けて順次書き込まれる。
図21のブロックB11〜B18は、ホスト2によってデータがライトされた直後のブロック、つまりそのブロック内のデータがガベージコレクション(GC)動作によって一度もコピーされたことのないブロックである。これらブロックB11〜B18に対応するGC回数は0である。
時間が経過するにつれ、ブロックB11〜B18の各々のデータは、その書き換えによって無効化されるかもしれない。これにより、ブロックB11〜B18の各々においては、有効データと無効データとが混在される場合がある。
フリーブロックの数が閾個数以下に低下した場合、コントローラ4は、有効データと無効データとが混在される幾つかのブロックからフリーブロックを作り出すGC動作を開始する。
コントローラ4は、まず、有効データと無効データとが混在する幾つかのブロックをGC対象ブロックとして選択する。このGC対象ブロックの選択においては、コントローラ4は、同じGC回数に関連づけられたブロック群をGC対象ブロックとして選択する。
コントローラ4は、選択した幾つかのGC対象ブロック(同じGC回数に関連づけられた幾つかのブロック)内の有効データをコピー先ブロックにコピーし、これらGC対象ブロックのGC回数に1を加えた値を、コピー先ブロックのGC回数として設定する。これにより、GC対象ブロックのGC回数に1を加えた値がコピー先ブロックに引き継がれるので、コピー先ブロックのGC回数は、そのコピー先ブロック内のデータがGC動作によって過去に何回コピーされたかを正しく表すことができる。
例えば、同じGC回数に関連づけられた2つのブロックB11,B12がGC対象ブロックとして選択され、これらブロックB11,B12の有効データがコピー先ブロックB21にコピーされたならば、このコピー先ブロックB21のGC回数は、ブロックB11,B12のGC回数(ここでは、0)に1を加えた値(ここでは1)に設定される。
同様に、同じGC回数に関連づけられた3つのブロックB13、B14、B15がGC対象ブロックとして選択され、これらブロックB13、B14、B15の有効データがコピー先ブロックB22にコピーされたならば、このコピー先ブロックB22のGC回数は、ブロックB13、B14、B15のGC回数(ここでは、0)に1を加えた値(ここでは1)に設定される。
同様に、同じGC回数に関連づけられた2つのブロックB16、B17がGC対象ブロックとして選択され、これらブロックB16、B17の有効データがコピー先ブロックB23にコピーされたならば、このコピー先ブロックB23のGC回数は、ブロックB16、B17のGC回数(ここでは、0)に1を加えた値(ここでは1)に設定される。
時間が経過するに連れ、ブロックB21、B22、B23の各々のデータは、その書き換えによって無効化されるかもしれない。これにより、ブロックB21、B22、B23の各々においては、有効データと無効データとが混在される場合がある。
同じGC回数に関連づけられた2つのブロックB21、B22がGC対象ブロックとして選択され、これらブロックB21、B22の有効データがコピー先ブロックB31にコピーされたならば、このコピー先フリーブロックB31のGC回数は、ブロックB21、B22のGC回数(ここでは1)に1を加えた値(ここでは2)に設定される。
このように、ブロック毎に管理されるGC回数はそのブロック内のデータが過去のGC動作によってコピーされた回数を示す。このGC回数を正しく管理するために、GC対象ブロックのGC回数に1を加えた値が、コピー先フリーブロック内のデータに引き継がれる。
図22は、GC回数管理リストの例を示す。
管理すべきGC回数の上限値nが例えば10である場合、GC回数管理リストは、GC回数=0〜GC回数=10にそれぞれ対応する11個のGC回数リストから構成されてもよい。
GC回数=0のGC回数リストは、GC回数=0に関連づけられたブロックそれぞれのブロックID(例えば物理ブロックアドレス)のリストを示す。GC回数=1のGC回数リストは、GC回数=1に関連づけられたブロックそれぞれのブロックID(例えば物理ブロックアドレス)のリストを示す。同様にして、GC回数=10のGC回数リストは、GC回数=10に関連づけられたブロックそれぞれのブロックID(例えば物理ブロックアドレス)のリストを示す。各GC回数リストは、限定されないが、有効データと無効データとが混在するブロックだけを含んでもよい。
図23は、SSD3に書き込まれる複数種のデータの例を示す。
図23では、互いに更新頻度の異なる3種類のデータ(データA、データB、データC)がSSD3に書き込まれる場合が想定されている。SSD3のデータ記憶領域(LBA空間)は、LBAグループA、B、Cに対応する3つのスペースを含む。
LBAグループAに書き込まれるデータAは更新頻度の低いデータであり、且つデータAの量はデータA、B、Cの中で最も多い。つまり、LBAグループAは最も大きいLBA範囲を有する。
LBAグループCに書き込まれるデータCは、更新頻度の高いデータであり、且つデータCの量はデータA、B、Cの中で最も少ない。つまり、LBAグループCは最も小さいLBA範囲を有する。
LBAグループBに書き込まれるデータBは、データAとデータCの中間の更新頻度を有するデータであり、且つデータBの量はデータAの量とデータCの量の中間である。
SSD3の総ユーザ容量に対するデータAの量の割合は、例えば、50%であってもよい。SSD3の総ユーザ容量に対するデータBの量の割合は、例えば、30%であってもよい。SSD3の総ユーザ容量に対するデータCの量の割合は、例えば、20%であってもよい。
データAの更新頻度つまりLBAグループAへのライトの頻度は、例えば、20%であってもよい。データBの更新頻度つまりLBAグループBへのライトの頻度は、例えば、30%であってもよい。データCの更新頻度つまりLBAグループCへのライトの頻度は、例えば、50%であってもよい。
この場合、例えば、SSD3がデータA、データB、データCで満たされた後は、2回のライトコマンドに1回の割合で、データC(LBAグループC)へのライトを要求するライトコマンドがホスト2からSSD3に発行され、また5回のライトコマンドに1回の割合で、データA(LBAグループA)へのライトを要求するライトコマンドがホスト2からSSD3に発行される。例えば、データCは、2回のライトコマンドに1回の割合(50%)という高い頻度で更新される。
SSD3に書き込まれるデータが図23のようなデータ局所性を有する場合においては、図23の下部に示すように、各書き込み先ブロックにはデータA、データB、データCが混在される。
一つの書き込み先ブロックにおいて、ブロックの容量に対するデータCの量の割合は50%、ブロックの容量に対するデータBの量の割合は30%、ブロックの容量に対するデータAの量の割合は20%となる。
上述したように、データCの量は、データA、データBよりも少なく、且つデータCの更新頻度は、データA、データBよりも高いので、各ブロック内のデータCのほとんどは速いタイミングで無効化される確率が高い。一方、データAおよびデータBについては、特にデータAについては、長い間、有効状態に維持される確率が高い。
データCの更新(書き換え)よって無効データ量が増えたブロックそれぞれは、いずれGC対象ブロックとなり、これらブロックからコピー先ブロックに有効データがコピーされる。各GC対象ブロックにおいては、データCの多くが無効化され且つデータA、データBの多くが有効データに維持されている確率が高い。このため、コピー先ブロックにおいては、GC対象ブロックに比べてデータAの量とデータBの量とが増え、代わりに、GC対象ブロックに比べてデータCの量が減る。
本実施形態では、同じGC回数の幾つかのブロック内の有効データがコピー先フリーブロックにコピーされるので、GC回数の少ないブロック内の有効データとGC回数の多いブロック内の有効データとがGC動作によって同じコピー先フリーブロックにコピーされることはない。したがって、GC回数の多いブロックほど、そのブロックの容量に対するデータAの量の割合を増やすことができ、これによってデータA(Coldデータ)を、データC(ホットデータ)から分離することができる。
図24は、GC回数と、各ブロック内のデータA,B,C間のデータ量の割合との関係の例を示す。
GC回数=0の各ブロックにおいては、ブロックの容量に対するデータCの量の割合は50%、ブロックの容量に対するデータBの量の割合は30%、ブロックの容量に対するデータAの量の割合は20%である。
ブロックの容量に対するデータCの量の割合は、1回または2回程度のGC動作によって速く低下される。GC回数が増えるにつれて、ブロックの容量に対するデータBの量の割合も徐々に低下される。
上述したように、本実施形態では、GC回数の少ないブロック内の有効データとGC回数の多いブロック内の有効データとが同じコピー先フリーブロックにコピーされることはないので、データを含むブロックそれぞれを、(1)ほぼデータAのみを含むグループ(例えばGC回数7〜10程度)、(2)データAとデータBとを含み、且つデータCをほとんど含まないグループ(例えばGC回数3〜6程度)、(3)データAとデータBとデータCを含むグループ(例えばGC回数0〜2程度)に分類できる。
このように、ホスト2によって書き込まれたデータを含むブロック毎に、当該ブロック内のデータがガベージコレクション(GC)動作によってコピーされた回数を示すGC回数が管理され、GC動作では、同じGC回数に関連づけられた複数のブロックがGC対象ブロックとして選択される。そして、これら第1ブロック内の有効データがコピー先ブロックにコピーされ、これらGC対象ブロックのGC回数に1を加えた値が、コピー先ブロックのGC回数として設定される。したがって、更新頻度の高いデータと更新頻度の低いデータとがGC動作によって一緒に同じブロックにコピーされてしまうことを防止できるようになるので、GC回数の多いブロックにコールドデータを集めることができる。
図25は、GC回数を利用してホット/コールドを判定する処理を含むGC処理の手順を示す。
SSD3のコントローラ4は、GC開始条件が満たされたか否かを判定する(ステップS101)。GC開始条件は、GC動作を開始するための条件である。例えば、残りフリーブロックの数が閾値以下になった場合、あるいはGC開始を要求するコマンドがホスト2から受信された場合に、コントローラ4は、GC開始条件が満たされたと判定する。
GC開始条件が満たされたならば(ステップS101のYES)、コントローラ4は、同じGC回数を有するブロック群をGC対象ブロックとして選択する(ステップS102)。
コントローラ4は、あるGC対象ブロック内の有効データを選択し(ステップS103)、この有効データを読み出し、この有効データが圧縮データであるか否かを判定する(ステップS104)。
読み出された有効データが圧縮データであるならば(ステップS104のYES)、コントローラ4は、GC対象ブロックのGC回数が閾値以上であるか否かを判定する(ステップS105)。GC対象ブロックのGC回数が閾値以上であるならば(ステップS105のYES)、コントローラ4は、読み出された有効データ(圧縮データ)がコールドデータであると判定することができる。
したがって、GC対象ブロックのGC回数が閾値以上であるならば(ステップS105のYES)、コントローラ4は、読み出された有効データ(圧縮データ)を伸張し(ステップS106)、伸張されたデータを、読み出された圧縮データに適用されていた圧縮方法よりも高圧縮率の別の圧縮方法を使用して圧縮(再圧縮)して、圧縮データよりもデータ長の短い圧縮データ(再圧縮データ)を生成する(ステップS107)。そして、コントローラ4は、この再圧縮データをコピー先ブロックにコピーする(圧縮書き込む)(ステップS108)。ステップS108では、読み出された圧縮データの圧縮前のデータ長に対応するLBA範囲は、このLBA範囲の先頭LBAから開始され且つ再圧縮データのデータ長に対応する範囲を有するLBA範囲#Aと、圧縮前のデータ長と再圧縮データのデータ長との間の差分に対応するLBA範囲#Bとに論理的に分割される。そして、LBA範囲#Aにのみコピー先ブロックの物理アドレスそれぞれがマッピングされ、LBA範囲#Bはアンマップ状態に設定される。
この後、コントローラ4は、GC対象ブロックのGC回数をコピー先ブロックのGC回数として設定する(ステップS109)。
読み出された有効データが圧縮データでないならば(ステップS104のNO)、コントローラ4は、ステップS105〜S107の処理を実行せずに、読み出された有効データをコピー先ブロックにコピーする(ステップS108)。そして、コントローラ4は、ステップS109に進む。
読み出された有効データが圧縮データであるが、GC対象ブロックのGC回数が閾値以上でないならば(ステップS105のNO)、コントローラ4は、ステップS106〜S107の処理を実行せずに、読み出された有効データ(圧縮データ)をコピー先ブロックにコピーする(ステップS108)。そして、コントローラ4は、ステップS109に進む。
図26は、ホスト2として機能する情報処理装置(コンピューティングデバイス)のハードウェア構成例を示す。
この情報処理装置は、サーバ(例えばストレージサーバ)のようなコンピューティングデバイスとして実現される。この情報処理装置は、プロセッサ(CPU)101、メインメモリ102、BIOS−ROM103、ネットワークコントローラ105、周辺インタフェースコントローラ106、コントローラ107、およびエンベデッドコントローラ(EC)108等を含む。
プロセッサ101は、この情報処理装置の各コンポーネントの動作を制御するように構成されたCPUである。このプロセッサ101は、複数のSSD3のいずれか1つからメインメモリ102にロードされる様々なプログラムを実行する。メインメモリ102は、DRAMのようなランダムアクセスメモリから構成される。プロセッサ101によって実行されるプログラムは、上述のアプリケーションソフトウェアレイヤ41、OS42およびファイルシステム43を含む。また、プロセッサ101によって実行されるプログラムは、I/O管理モジュール44を含んでいてもよい。このI/O管理モジュール44は、上述の最小データ長の単位で、またはこの最小データ長の整数倍のデータ長単位で、SSD3にデータI/O要求(書き込み要求、読み出し要求)を送出する。I/O管理モジュール44は、アプリケーションソフトウェアレイヤ41に含まれていても良いし、あるいはOS42またはファイルシステム43に含まれていてもよい。
I/O管理モジュール44は、SSD3のLBA空間を使用して、図5で説明したデータ管理を実行する。上述したように、SSD3のコントローラ4は、NANDフラッシュメモリ5の容量よりも大きな容量をSSD3の容量としてホスト2に報告してもよい。I/O管理モジュール44は、SSD3から報告された容量に対応するLBA空間を使用して、図5で説明したデータ管理を実行することができる。
また、プロセッサ101は、不揮発性メモリであるBIOS−ROM103に格納された基本入出力システム(BIOS)も実行する。BIOSはハードウェア制御のためのシステムプログラムである。
ネットワークコントローラ105は、有線LANコントローラ、無線LANコントローラのような通信デバイスである。周辺インタフェースコントローラ106は、USBデバイスのような周辺デバイスとの通信を実行するように構成されている。
コントローラ107は、複数のコネクタ107Aにそれぞれ接続されるデバイスとの通信を実行するように構成されている。本実施形態では、複数のSSD3が複数のコネクタ107Aにそれぞれ接続される。コントローラ107は、SAS expander、PCIe Switch、PCIe expander、フラッシュアレイコントローラ、またはRAIDコントローラ等である。
EC108は、情報処理装置の電力管理を実行するように構成されたシステムコントローラとして機能する。EC108は、ユーザによる電源スイッチの操作に応じて情報処理装置をパワーオンおよびパワーオフする。EC108はワンチップマイクロコントローラのような処理回路として実現されている。EC108は、キーボード(KB)などの入力デバイスを制御するキーボードコントローラを内蔵していてもよい。
図27は、複数のSSD3とホスト2とを含む情報処理装置の構成例を示す。
この情報処理装置は、ラックに収容可能な薄い箱形の筐体201を備える。多数のSSD3は筐体201内に配置されても良い。この場合、各SSD3は筐体201の前面201Aに設けられたスロットに取り外し可能に挿入されてもよい。
システムボード(マザーボード)202は筐体201内に配置される。システムボード(マザーボード)202上においては、CPU101、メモリ102、ネットワークコントローラ105、コントローラ107を含む様々な電子部品が実装されている。これら電子部品がホスト2として機能する。
以上説明したように、本実施形態によれば、管理サイズよりも大きなデータ長を有する書き込みデータがSSD3のコントローラ4によって圧縮され、この圧縮データがNANDフラッシュメモリ5の記憶領域に書き込まれる。そして、書き込みデータのデータ長と圧縮データのデータ長との差分がコントローラ4によって識別され、この差分に基づいて、LUT32が自動的に更新されて、書き込まれるべき第1論理アドレス範囲(第1LBA範囲)の先頭論理アドレス(先頭LBA)から始まり圧縮データのデータ長に対応する第1範囲(LBA範囲#A)内の論理アドレス(LBA)それぞれに、圧縮データが書き込まれた記憶領域の物理アドレスそれぞれがマッピングされ、さらに、第1範囲(LBA範囲#A)に後続し、書き込みデータ(圧縮前のデータ)のデータ長と圧縮データのデータ長との差分に対応する第2範囲(LBA範囲#B)内の論理アドレス(LBA)の各々が、物理アドレスがマッピングされていない状態に設定される。したがって、書き込みデータのデータ長と圧縮データのデータ長との間の差分領域をトリム/アンマップされたLBA範囲であるかのように扱うことができる。よって、書き込みデータが圧縮によってどのようなデータ長に変わったとしても、ホスト2は、圧縮前のデータのデータ長に対応するLBA範囲を使用して、このデータのリード及びライト(書き替え)を実行することができる。この結果、図2で説明したようなホスト側でのガベージコレクションが不要となるので、SSD3へ書き込まれるデータ量も減少され、SSD3のライトアンプリフィケーションを低下させることが可能となる。
また、本実施形態では、不揮発性メモリとしてNANDメモリを例示した。しかし、本実施形態の機能は、例えば、MRAM(Magnetoresistive Random Access Memory)、PRAM(Phase change Random Access Memory)、ReRAM(Resistive Random Access Memory)、又は、FeRAM(Ferroelectric Random Access Memory)のような他の様々な不揮発性メモリにも適用できる。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。