以下、図面を参照して、実施形態を説明する。
まず、図1を参照して、一実施形態に係るメモリシステムを含む情報処理システム1の構成を説明する。
このメモリシステムは、不揮発性メモリにデータをライトし、不揮発性メモリからデータをリードするように構成された半導体ストレージデバイスである。このメモリシステムは、例えば、NANDフラッシュ技術ベースのソリッドステートドライブ(SSD)3として実現されている。
情報処理システム1は、ホスト(ホストデバイス)2と、SSD3とを含む。ホスト2は、サーバ、パーソナルコンピュータのような情報処理装置である。
SSD3は、ホスト2として機能する情報処理装置のメインストレージとして使用され得る。SSD3は、情報処理装置に内蔵されてもよいし、情報処理装置にケーブルまたはネットワークを介して接続されてもよい。
ホスト2とSSD3とを相互接続するためのインタフェースとしては、SCSI、Serial Attached SCSI(SAS)、ATA、Serial ATA(SATA)、PCI Express(PCIe)、Ethernet(登録商標),Fibre channel等が使用し得る。
SSD3は、コントローラ4、不揮発性メモリ(NANDメモリ)5、および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)論理ブロックアドレス(LBA)と物理アドレスとの間の対応関係を示すマッピング情報の管理、(2)ページ単位のリード/ライトとブロック単位の消去動作とを隠蔽するための処理、等が含まれる。LBAと物理アドレスとの間のマッピングの管理は、論理物理アドレス変換テーブルとして機能するルックアップテーブル(LUT)33を用いて実行される。ルックアップテーブル(LUT)33は、所定の管理サイズ単位で、LBAと物理アドレスとの間のマッピングを管理する。ホスト2からのライトコマンドの多くは、4Kバイトのデータの書き込みを要求する。したがって、ルックアップテーブル(LUT)33は、例えば4Kバイト単位で、LBAと物理アドレスとの間のマッピングを管理してもよい。あるLBAに対応する物理アドレスは、このLBAのデータがライトされたNANDメモリ5内の物理記憶位置を示す。物理アドレスは、物理ブロックアドレスと物理ページアドレスとを含む。物理ページアドレスは全てのページに割り当てられており、また物理ブロックアドレスは全てのブロックに割り当てられている。
ページへのデータ書き込みは、1消去サイクル当たり1回のみ可能である。
このため、コントローラ4は、同じLBAへのライト(上書き)を、NANDメモリ5上の別のページにマッピングする。つまり、コントローラ4は、この別のページにデータをライトする。そして、コントローラ4は、ルックアップテーブル(LUT)33を更新してこのLBAをこの別のページに関連付けると共に、元のページ(つまりこのLBAが関連付けられていた古いデータ)を無効化する。
ブロック管理には、不良ブロックの管理と、ウェアレベリングと、ガベージコレクション動作等が含まれる。ウェアレベリングは、物理ブロックそれぞれのプログラム/イレーズ回数を平準化するための動作である。
ガベージコレクション動作は、NANDメモリ5内のフリースペースを作り出すための動作である。このガベージコレクション動作は、NANDメモリ5のフリーブロックの個数を増やすため、有効データと無効データとが混在する幾つかのブロック内の全ての有効データを別のブロック(コピー先フリーブロック)にコピーする。そして、ガベージコレクション動作は、ルックアップテーブル(LUT)33を更新して、コピーされた有効データのLBAそれぞれを正しい物理アドレスにマッピングする。有効データが別のブロックにコピーされることによって無効データのみなったブロックはフリーブロックとして開放される。これによって、このブロックは消去後に再利用することが可能となる。
ホスト2は、ライトコマンドをSSD3に送出する。このライトコマンドは、ライトデータ(つまり書き込むべきデータ)の論理アドレス(開始論理アドレス)と、転送長とを含む。この実施形態においては、LBAが論理アドレスとして使用されるが、他の実施形態においてはオブジェクトIDが論理アドレスとして使用されても良い。LBAは、論理セクタ(論理ブロック)に付与されるシリアル番号によって表現される。シリアル番号はゼロから始まる。論理セクタのサイズは、例えば512バイトである。
SSD3のコントローラ4は、ライトコマンド内の開始論理アドレスと転送長とによって指定されるライトデータを、NANDメモリ5内のブロックのページにライトする。さらに、コントローラ4は、ルックアップテーブル(LUT)33を更新することによって、ライトされたデータに対応するLBAを、このデータがライトされた物理記憶位置を示す物理アドレスにマッピングする。
より詳しくは、コントローラ4は、NANDメモリ5内のフリーブロックの一つを、ホスト2からのデータの書き込みのために割り当てる。この割り当てられたブロックは、ホスト2からのデータが書き込まれるべき書き込み対象ブロックであり、「書き込み先ブロック」、または「入力ブロック」、等とも称される。コントローラ4は、ルックアップテーブル(LUT)33を更新しながら、ホスト2から受信されるライトデータを書き込み対象ブロック(書き込み先ブロック)の利用可能ページに順次書き込む。書き込み先ブロックに利用可能ページが無くなった場合に、コントローラ4は、新たなフリーブロックを書き込み先ブロックとして割り当てる。
次に、コントローラ4の構成について説明する。
コントローラ4は、ホストインタフェース11、CPU12、NANDインタフェース13、DRAMインタフェース14、SRAM15等を含む。これらCPU12、NANDインタフェース13、DRAMインタフェース14、SRAM15は、バス10を介して相互接続される。
ホストインタフェース11は、ホスト2から様々なコマンド(ライトコマンド、リードコマンド、アンマップ(UNMAP)コマンド、等)を受信する。
ライトコマンドは、SSD3に対し、このライトコマンドによって指定されたデータをライトするように要求する。ライトコマンドは、ライトされるべき最初の論理ブロックのLBA(開始LBA)と、転送長(論理ブロックの数)とを含む。リードコマンドは、SSD3に対し、このリードコマンドによって指定されたデータをリードするように要求する。リードコマンドは、リードされるべき最初の論理ブロックのLBA(開始LBA)と、転送長(論理ブロックの数)とを含む。
CPU12は、ホストインタフェース11、NANDインタフェース13、DRAMインタフェース14、SRAM15を制御するように構成されたプロセッサである。CPU12は、上述のFTLの処理に加え、ホスト2からの様々なコマンドを処理するためのコマンド処理等を実行する。
例えば、コントローラ4がホスト2からライトコマンドを受信した時、CPU12の制御の下、コントローラ4はライトコマンドによって指定されるライトデータをNANDメモリ5に書き込む以下のライト動作を実行する。
つまり、コントローラ4は、ライトデータを現在の書き込み先ブロックの物理記憶位置(利用可能ページ)に書き込み、そしてルックアップテーブル(LUT)33を更新して、ライトコマンドに含まれるLBA(開始LBA)にこの物理記憶位置の物理アドレスをマッピングする。
これらFTL処理およびコマンド処理は、CPU12によって実行されるファームウェアによって制御されてもよい。このファームウェアは、CPU12を、ガベージコレクション(GC)回数管理部21、ガベージコレクション(GC)動作制御部22、および更新頻度情報応答部23として機能させる。
ホスト2によってSSD3に書かれるデータには、そのデータの一部分が頻繁に書き換えられ、残りの部分は頻繁には書き換えられない、というデータ局所性が存在する場合がある。この場合、例えば、無効データ量の多い上位幾つかのブロックをGC対象ブロックとして選択するという通常のGCアルゴリズムによってGC動作が実行されると、何度もGC動作が繰り返されるにつれて、更新頻度の高いデータと更新頻度の低いデータとが同じブロックに混在しやくなる。更新頻度の高いデータと更新頻度の低いデータとの混在は、SSD3のライトアンプリフィケーションを増加させる要因となり得る。
なぜなら、更新頻度の高いデータ(Hotデータ)と更新頻度の低いデータ(Coldデータ)とが混在するブロックにおいては、Hotデータの更新によってブロック内の一部の領域だけが早いタイミングで無効化される一方、このブロック内の残りの領域(Coldデータ)は有効状態に長い間維持されるからである。
もしHotデータのみによってブロックが満たされていたならば、このブロック内の全てのデータがそれらデータの更新(書き替え)によって、比較的速いタイミングで無効化される可能性が高い。したがって、このブロックは、ガベージコレクション動作を実行すること無しで、このブロックを消去することのみによって、再利用することが可能となる。
一方、Coldデータのみによってブロックが満たされているならば、このブロック内の全てのデータは、長い間、有効状態に維持される。したがって、このブロックは、長い間、ガベージコレクション動作の対象とならない可能性が高い。
ライトアンプリフィケーション(WA)は、以下のように定義される。
WA=「SSDにライトされたデータの総量」 / 「ホストからSSDにライトされたデータの総量」
「SSDにライトされたデータの総量」は、ホストからSSDにライトされたデータの総量とガベージコレクション動作等によって内部的にSSDにライトされたデータの総量との和に相当する。
ライトアンプリフィケーション(WA)の増加は、SSD3内のブロックそれぞれの書き換え回数(プログラム/イレーズ回数)の増加を引き起こす。つまり、ライトアンプリフィケーション(WA)が大きい程、ブロックのプログラム/イレーズ回数が、そのプログラム/イレーズ回数の上限値に速く達しやすくなる。この結果、SSD3の耐久性および寿命の劣化が引き起こされる。
本実施形態では、更新頻度の高いデータと更新頻度の低いデータとを分離できるようにするために、「ブロック内のデータのGC回数を考慮したGC機能」と、「LBAベースの更新頻度通知機能」とを有している。
ガベージコレクション(GC)回数管理部21およびガベージコレクション(GC)動作制御部22は、「ブロック内のデータのGC回数を考慮したGC機能」を実行する。「ブロック内のデータのGC回数を考慮したGC機能」は、データ局所性に起因するSSD3のライトアンプリフィケーションの増加を抑制可能な改善されたガベージコレクション(GC)動作を実行する。
ガベージコレクション(GC)回数管理部21は、ホスト2によって書き込まれたデータを含むブロック毎に、ガベージコレクション(GC)回数を管理する。あるブロックのGC回数は、このブロック内のデータがガベージコレクション(GC)動作によってコピーされた回数を示す。つまり、あるブロックのGC回数は、このブロック内のデータが有効データとして過去に何回コピーされたかを示す。
ホスト2によってデータがライトされた直後のブロック、つまりそのデータがGCによって一度も集められた(コピーされた)ことのないブロックについては、このブロックのGC回数はゼロに設定される。
GC回数がゼロである幾つかのブロックがGCの対象ブロック(コピー元ブロック)として選択され、これらブロックの有効データがコピー先フリーブロックにコピーされたならば、GC回数管理部21は、このコピー先フリーブロックのGC回数を1に設定する。コピー先フリーブロック内のデータは、有効データとしてGC対象ブロック(コピー元ブロック)から1回コピーされたデータであるからである。
有効データがコピー先フリーブロックにコピーされることによって無効データのみなった各ブロック(コピー元ブロック)は、フリーブロックとなる。フリーブロックはデータを含まないので、このフリーブロックのGC回数は管理する必要はない。
GC回数が1である幾つかのブロック(コピー元ブロック)がガベージコレクション(GC)の対象ブロックとして選択され、これらブロックの有効データがコピー先フリーブロックにコピーされたならば、GC回数管理部21は、このコピー先のフリーブロックのGC回数を2に設定する。このコピー先フリーブロック内のデータは、有効データとして過去に2回コピーされたデータであるからである。
このように、あるブロックに関連づけられたGC回数の値は、このブロック内のデータが過去のGC動作によって何回コピーされたか、つまりこのブロック内のデータに対して過去に何回のGC動作が実行されたかを示す。
GC動作制御部22は、同じGC回数に関連づけられた幾つかのブロックをガベージコレクション(GC)動作の対象ブロックとして選択し、これら同じGC回数に関連づけられたブロックの有効データのみを同じコピー先ブロックにコピーする、という改良されたGC動作を実行する。
例えば、GC動作制御部22は、同じGC回数に関連づけられたブロック群(つまり、同じGC回数を有するブロックの集合)の中から、幾つかのブロックを、GCのための対象ブロックとして選択する。GC動作制御部22は、このGC対象ブロックとして選択されたこれらブロック内の有効データをコピー先フリーブロックにコピーする。そして、GC対象ブロックとして選択されたこれらブロックのGC回数に1を加えた値が、GC回数管理部21によって、このコピー先フリーブロックのGC回数として設定される。
「LBAベースの更新頻度通知機能」は、個々のライトコマンドに含まれる個々のLBAへのライトの頻度をホスト2に通知することによって、ホスト2がHotデータ/Coldデータを分離するのを効率良くアシストする機能である。
「LBAベースの更新頻度通知機能」は、更新頻度情報応答部23によって実行される。
更新頻度情報応答部23は、ホスト2からLBAを含むライトコマンドを受信した際に、このLBAへの前回のライトからこのLBAへの今回のライトまでの時間経過に関する値、またはこのLBAへの前回のライトからこのLBAへの今回のライトまでの累積データ書き込み量を、このライトコマンドに対する応答としてホスト2に通知する。これにより、ホスト2に対して、ユーザデータの実際の更新頻度(書き替え頻度)を知らせることができるので、ホスト2は、ユーザデータを互いに更新頻度の異なる複数種のデータ、例えば、頻繁に更新されるタイプのデータ(Hotデータ)、更新の頻度が低いタイプのデータ(Coldデータ)、HotデータとColdデータの中間の更新頻度を有するタイプのデータ(Warmデータ)に、に分類できる。この結果、例えば、ホスト2は、必要に応じて、これら異なるタイプのデータを、異なるSSDに分散させるための処理等を実行することができる。
次に、コントローラ4内の他のコンポーネントについて説明する。
NANDインタフェース13は、CPU12の制御の下、NANDメモリ5を制御するように構成されたNANDコントローラである。
DRAMインタフェース14は、CPU12の制御の下、DRAM6を制御するように構成されたDRAMコントローラである。
DRAM6の記憶領域の一部は、NANDメモリ5にライトすべきデータを一時的に格納するためのライトバッファ(WB)31として利用されてもよい。また、DRAM6の記憶領域は、ガベージコレクション(GC)動作中に移動されるデータを一時的に格納するためのGCバッファ32として利用されてもよい。また、DRAM6の記憶領域は、上述のルックアップテーブル33の格納のために用いられてもよい。
さらに、DRAM6の記憶領域は、GC回数管理リスト34、およびブロック使用順序管理リスト35として利用されてもよい。
GC回数管理リスト34は、ホスト2によって書き込まれたデータを含むブロック毎に、GC回数を保持するためのリストである。GC回数管理リスト34は、ブロックそれぞれのブロックID(例えば物理ブロックアドレス)とこれらブロック内のデータのGC回数との間の対応関係を示す表であってもよい。
あるいは、GC回数管理リスト34は、GC回数(例えば、GC回数=0〜GC回数=n)別にブロックそれぞれを管理するための複数のGC回数リストから構成されてもよい。ここで、nは、管理すべきGC回数の上限値である。例えば、GC回数=0のGC回数リストは、0回のGC回数に関連づけられたブロックそれぞれのブロックID(例えば物理ブロックアドレス)のリストを保持する。GC回数=1のGC回数リストは、1回のGC回数に関連づけられたブロックそれぞれのブロックID(例えば物理ブロックアドレス)のリストを保持する。
ブロック使用順序管理リスト35は、書き込み先ブロック用に割り当てられたブロックそれぞれに付与される割り当て番号(シーケンシャル番号)を保持する。すなわち、コントローラ4は、書き込み対象ブロックとして割り当てられたブロックそれぞれに対してその割り当て順序を示す番号(割り当て番号)を付与する。番号は1から始まるシーケンシャル番号であってもよい。例えば、最初に書き込み先ブロック用に割り当てられたブロックには割り当て番号=1が付与され、2番目に書き込み先ブロック用に割り当てられたブロックには割り当て番号=2が付与され、3番目に書き込み先ブロック用に割り当てられたブロックには割り当て番号=3が付与される。これにより、どのブロックがどのような順序で書き込み先ブロックとして割り当てられたかを示すブロック使用履歴を管理することができる。割り当て番号としては、新たなフリーブロックが書き込み先ブロック用に割り当てられる度にインクリメントされるカウンタの値を使用できる。
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〜図12を参照して、「ブロック内のデータのGC回数を考慮したGC機能」の詳細を説明する。
図2は、SSD3によって実行されるGC回数管理動作とGC動作とを示す。
SSD3のコントローラ4は、あるフリーブロックを、ホスト2からのデータ(ライトデータ)の書き込み用のブロック(書き込み先ブロック)として割り当て、ホスト2から受信されるライトデータをこの書き込み先ブロック内の利用可能ページに順次書き込む。現在の書き込み先ブロックの全てのページがデータで満たされた時、コントローラ4は、現在の書き込み先ブロックをアクティブブロック(データを含むブロック)として管理する。さらに、コントローラ4は、別のフリーブロックを新たな書き込み先ブロックとして割り当てる。このようにして、SSD3においては、ホスト2から受信されるデータ(ライトデータ)は、その到着順に、現在の書き込み先ブロックの最初のページから最後のページに向けて順次書き込まれる。
図2のブロックB11〜B17は、ホスト2によってデータがライトされた直後のブロック、つまりそのブロック内のデータがガベージコレクション(GC)動作によって一度もコピーされたことのないブロックである。これらブロックB11〜B17に対応するGC回数は0である。
時間が経過するにつれ、ブロックB11〜B17の各々のデータの一部は、その書き換えによって無効化されるかもしれない。これにより、ブロックB11〜B17の各々においては、有効データと無効データとが混在される場合がある。
フリーブロックの数が閾個数以下に低下した場合、コントローラ4は、有効データと無効データとが混在される幾つかのブロックからフリーブロックを作り出すGC動作を開始する。
コントローラ4は、まず、有効データと無効データとが混在する幾つかのブロックをGC対象ブロックとして選択する。このGC対象ブロックの選択においては、コントローラ4は、上述したように、同じGC回数に関連づけられたブロック群をGC対象ブロックとして選択する。このブロック群は、例えば、最も無効データの量が多いブロックが属するブロック群、つまり最も無効データの量が多いブロックのGC回数と同じGC回数を有するブロックの集合、であってよい。この場合、コントローラ4は、最初に、ホスト2によって書き込まれたデータを含むブロックから、無効データ量が最も多いブロックを選択してもよい。次いで、コントローラ4は、無効データ量が最も多いブロックと、この無効データ量が最も多いブロックのGC回数と同じ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を加えた値が、コピー先フリーブロック内のデータに引き継がれる。
図3は、GC回数管理リスト34の例を示す。
管理すべきGC回数の上限値nが例えば10である場合、GC回数管理リスト34は、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回数リストは、限定されないが、有効データと無効データとが混在するブロックだけを含んでもよい。
図4は、コントローラ4によって実行されるGC対象ブロック選択動作を示す。
GC対象ブロックを選択する処理においては、コントローラ4のガベージコレクション動作制御部22は、最初に、異なるGC回数にそれぞれ関連づけられた複数のブロック群(複数のGC回数リスト)から、GC対象のブロック群を選択してもよい。図4では、GC回数=5のブロック群(ブロックB2、ブロックB5、ブロックB11、ブロックB21)がGC対象のブロック群として選択され、さらに、このGC回数=5のブロック群から、幾つかのGC対象ブロックが選択される場合が例示されている。
GC対象ブロックを選択する処理においては、例えば、まず、所定の条件に合致するブロックが最初のGC候補として選択されてもよい。所定の条件に合致するブロックは、アクティブブロック(ホスト2によって書き込まれたデータを含むブロック)の中で最も無効データ量が多いブロックであってもよい。他の実施形態では、所定の条件に合致するブロックは、アクティブブロックの中で最も古いブロックであってもよい。以下では、最も無効データ量が多いブロックが、最初のGC候補として選択される場合を想定する。
最も無効データ量が多いブロックがブロックB5であるならば、コントローラ4は、ブロックB5を含むGC回数リスト(ここでは、GC回数=5のGC回数リスト)を特定し、このGC回数=5のGC回数リストによって示されるブロック群(ブロックB2、ブロックB5、ブロックB11、ブロックB21)をGC対象のブロック群として選択し、このGC対象のブロック群から、幾つかのGC対象ブロックを選択する。例えば、これらブロックB2、ブロックB5、ブロックB11、ブロックB21の中で無効データ量が多い上位幾つかのブロックがGC対象ブロックとして選択されてもよい。この場合、例えば、ブロックB5と、ブロックB2、ブロックB11、ブロックB21内の中で最も無効データ量が多い上位の一つ以上のブロックとが、GC対象ブロックとして選択されてもよい。
図5は、コントローラ4によって実行されるGC動作を示す。
コントローラ4は、全てのフリーブロックを含むフリーブロックプール(フリーブロックリスト)60を管理する。コントローラ4は、これらフリーブロックから一つのフリーブロックを選択する。コントローラ4は、選択されたフリーブロックを、コピー先フリーブロックB1000として割り当てる。コントローラ4は、同じGC回数を有するGC対象ブロック(ここでは、ブロックB2、B5、B11)からコピー先フリーブロックB1000に全ての有効データをコピーする。そして、コントローラ4は、ルックアップテーブル33を更新して有効データのLBAそれぞれをコピー先フリーブロックB1000の物理アドレスそれぞれにマッピングする。
コピー先フリーブロックB1000のGC回数は、ブロックB2、B5、B11のGC回数(=5)+1に設定される。ブロックB1000は、GC回数=6のGC回数リストに追加される。ブロックB2、B5、B11は、有効データを含まないフリーブロックとなる。フリーブロックとなったブロックB2、B5、B11は、GC回数=5のGC回数リストから破棄される。
図6は、SSD3に書き込まれる複数種のデータの例を示す。
図6では、互いに更新頻度の異なる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に書き込まれるデータが図6のようなデータ局所性を有する場合においては、図6の下部に示すように、各書き込み先ブロックにはデータ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(ホットデータ)から分離することができる。
図7は、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程度)に分類できる。
換言すれば、本実施形態では、同じGC回数のブロックについては、それらブロックに含まれるデータA、B、Cの量の割合を同じにすることができる。
よって、同じGC回数の幾つかのブロック内の有効データを同じコピー先フリーブロックにコピーするという本実施形態の改良されたGC動作は、たとえSSD3に書かれるデータが高いデータ局所性を有する場合であっても、ほぼデータAのみを含むブロックのグループと、データAとデータBとを含み且つデータCをほとんど含まないブロックのグループと、データAとデータBとデータCを含むブロックのグループとを作ることができ、これによってHotデータとColdデータとを徐々に分離することができる。この結果、SSD3のライトアンプリフィケーションの増加を抑制することができる。
図8のフローチャートは、コントローラ4によって実行されるGC動作の手順を示す。
コントローラ4は、残りフリーブロックの数をチェックし(ステップS11)、残りフリーブロックの数が閾値th1以下であるか否かを判定する(ステップS12)。このチェックは、定期的に実行されてもよい。例えば、新たなフリーブロックを書き込み先ブロックとして割り当てるべき時に残りフリーブロックの数をチェックしてもよい。
残りフリーブロックの数が閾値th1以下であるならば(ステップS12のYES)、コントローラ4は、まず、全てのアクティブブロックから最初のGC候補を選択する。最初のGC候補は、最大無効データ量のブロックであってもよい。この場合、全てのアクティブブロックから最大無効データ量のブロックが最初のGC候補として選択される(ステップS13)。コントローラ4は、GC回数管理リスト34を参照して、最初のGC候補(ここでは、例えば、最大無効データ量のブロック)のGC回数と同じGC回数に関連づけられたブロック群(第1ブロック群)を選択し、さらに、この第1ブロック群から、幾つかのGC対象ブロックを選択する(ステップS14)。ステップS14では、最初のGC候補(例えば、最大無効データ量のブロック)が含まれているGC回数リストによって示されるブロック群(第1ブロック群)が選択され、そして第1ブロック群から、幾つかのGC対象ブロックが選択される。この場合、最初のGC候補(例えば、最大無効データ量のブロック)と、このGC回数リストに含まれる別の1以上のブロックとが、GC対象ブロックとして選択されてもよい。
コントローラ4は、これら選択されたGC対象ブロック内の全ての有効データをコピー先フリーブロックにコピーする(ステップS15)。ステップS15では、これら選択されたGC対象ブロック内の有効ページそれぞれから有効データがリードされ、リードされた有効データがコピー先フリーブロックの利用可能ページそれぞれに書き込まれる。ステップS15では、さらに、コントローラ4は、ルックアップテーブル(LUT)33を更新して、コピーされた有効データのLBAをコピー先フリーブロックの物理アドレスに関連付けると共に、ページ管理テーブルを更新して、各GC対象ブロック内の元のページ(つまりこのLBAが関連付けられていた古いデータ)を無効化する。この場合、コントローラ4は、まず、ルックアップテーブル(LUT)33を参照することによって、コピーされた有効データが格納されている元のページの物理アドレスを取得してもよく、そして、ページ管理テーブルを更新して、この物理アドレスに対応する有効/無効フラグを無効を示す値に設定してもよい。
この後、コントローラ4は、これら選択されたGC対象ブロックのGC回数+1、つまり第1ブロック群のGC回数に1を加えた値を、コピー先フリーブロックのGC回数として設定する(ステップS16)。
図9は、異なるGC回数を有する2つのブロック群の有効データをマージする処理を含むGC動作を示す。
例えば、最大無効データ量のブロックのGC回数と同じGC回数に関連づけられたブロック群(GC対象ブロック群)に含まれる有効データの量が閾値よりも少ない場合、コントローラ4は、異なるGC回数を有する2つのブロック群の有効データをマージする処理を実行する。この場合、コントローラ4は、GC対象ブロック群のGC回数と出来るだけ近いGC回数を有する別の一つのブロック群を選択してもよい。
例えば、いま、最大無効データ量のブロックがブロックB300であり、ブロックB300のGC回数が10である場合を想定する。この場合、コントローラ4は、GC回数=10のGC回数管理リストに含まれるブロック群の総有効データ量をチェックする。例えば、GC回数=10のGC回数管理リストに含まれるブロックがブロックB300のみである場合、あるいはGC回数=10のGC回数管理リストに2つまたは3つ程度のブロックが含まれているがこれら各々の有効データ量が非常に少ない場合には、コントローラ4は、GC回数=10のブロック群と一緒にGC動作が実行されるべきブロック群を選択する。
この場合、コントローラ4は、最大無効データ量のブロックB300のGC回数よりも1回以上少ないGC回数を有する全てのブロック群(ここでは、GC回数9のブロック群、GC回数8のブロック群、GC回数7のブロック群、…GC回数0のブロック群)の中で、最大のガベージコレクション回数を有するブロック群を選択してもよい。
コントローラ4は、最初にGC回数=9のGC回数管理リストを参照して、GC回数=9のブロックが存在するか否かを判定する。GC回数=9のブロックが存在しないならば、コントローラ4は、GC回数=8のGC回数管理リストを参照して、GC回数=8のブロックが存在するか否かを判定する。
GC回数=9のブロックが存在せず、GC回数=8のブロックが存在するならば、コントローラ4は、GC回数=8のブロック群(例えば、ブロックB41、B42、B43)を、選択する。そして、コントローラ4は、ブロックB300の有効データとGC回数=8のブロック群の有効データとをコピー先フリーブロックにコピーする。この場合、ブロックB41、B42、B43の全ての有効データが必ずしも利用される必要は無く、ブロックB41、B42、B43内の少なくとも一つのブロック内の有効データが利用されればよい。
図10のフローチャートは、異なるGC回数を有する2つのブロック群の有効データをマージする処理を含むGC動作の手順を示す。
コントローラ4は、残りフリーブロックの数をチェックし(ステップS21)、残りフリーブロックの数が閾値th1以下であるか否かを判定する(ステップS22)。上述したように、このチェックは、定期的に実行されてもよい。
残りフリーブロックの数が閾値th1以下であるならば(ステップS22のYES)、コントローラ4は、まず、全てのアクティブブロックから最初のGC候補を選択する。最初のGC候補は、最大無効データ量のブロックであってもよい。この場合、全てのアクティブブロックから最大無効データ量のブロックが最初のGC候補として選択される(ステップS23)。コントローラ4は、GC回数管理リスト34を参照して、最初のGC候補(ここでは、例えば、最大無効データ量のブロック)のGC回数と同じGC回数に関連づけられたブロック群(第1ブロック群)を選択し、このブロック群(第1ブロック群)の有効データの総量が閾値th2以下であるか否かを判定する(ステップS24)。
閾値th2の値は、固定であっても良いし、必要に応じて変更できる値であっても良い。閾値th2の値が大きいほど、上述のマージ処理の実行が許可されやすくなる。
例えば、閾値th2は、SSD3内の一つのブロックの容量を示す値に予め設定されていてもよい。これにより、最初のGC候補のGC回数と同じGC回数に関連づけられたブロック群のみでGC動作が実行できない場合にのみ、マージ処理の実行を許可することができる。あるいは、閾値th2は、SSD3内の1つのブロックの容量の整数倍、例えば2倍の値に設定されていても良い。
この第1ブロック群の有効データの総量が閾値th2以下でないならば(ステップS24のNO)、コントローラ4は、この第1ブロック群から、幾つかのGC対象ブロックを選択する(ステップS25)。ステップS25では、最初のGC候補(例えば、最大無効データ量のブロック)が含まれているGC回数リストによって示される第1ブロック群から、これらGC対象ブロックが選択される。この場合、最初のGC候補(例えば、最大無効データ量のブロック)と、このGC回数リストに含まれる別のブロックとが、GC対象ブロックとして選択されてもよい。
ステップS25では、コントローラ4は、これら選択されたGC対象ブロック内の全ての有効データをコピー先フリーブロックにコピーする。ステップS25では、さらに、コントローラ4は、ルックアップテーブル(LUT)33を更新して、コピーされた有効データのLBAをコピー先フリーブロックの物理アドレスに関連付けると共に、各GC対象ブロック内の元のページを無効化する。
この後、コントローラ4は、これら選択されたGC対象ブロックのGC回数+1を、つまり第1ブロック群のGC回数に1を加えた値を、コピー先フリーブロックのGC回数として設定する(ステップS26)。
一方、第1ブロック群の有効データの総量が閾値th2以下であるならば(ステップS24のYES)、コントローラ4は、この第1ブロック群のGC回数よりも1回以上少ないGC回数に関連づけられた全てのブロック群の中で、最大GC回数に関連づけられたブロック群(第2ブロック群)を選択する(ステップS27)。
コントローラ4は、第1ブロック群の有効データと第2ブロック群の有効データとをコピー先フリーブロックにコピーする(ステップS28)。ステップS28では、さらに、コントローラ4は、ルックアップテーブル(LUT)33を更新して、コピーされた有効データのLBAをコピー先フリーブロックの物理アドレスに関連付けると共に、各GC対象ブロック内の元のページを無効化する。
コントローラ4は、第2ブロック群のGC回数+1をコピー先フリーブロックのGC回数として設定するか、あるいは第1ブロック群のGC回数+1をコピー先フリーブロックのGC回数として設定する(ステップS29)。あるいは、第1ブロック群内のGC対象ブロックの数よりも第2ブロック群内のGC対象ブロックの数が多い場合には、第2ブロック群のGC回数+1をコピー先フリーブロックのGC回数として設定してもよく、第1ブロック群内のGC対象ブロックの数が第2ブロック群内のGC対象ブロックの数よりも多い場合には、第1ブロック群のGC回数+1をコピー先フリーブロックのGC回数として設定してもよい。
図11は、マージ処理を特定のGC回数以上のブロック群に対してのみ許可する動作を示す。
GC回数の多いブロック内に含まれている有効データは、更新頻度の低いデータ(データA)である可能性が高い。しかし、データAも20%の割合で書き替えられるので、GC回数の多いブロック、例えばGC回数=10のブロック、についても、その無効データ量が多くなる場合がある。GC回数の多いブロック内の有効データは、これまで一度も更新(書き替え)されたことのないデータ、つまり、長い間、有効状態に維持されているデータである。このため、この有効データは、これからも更新されない確率が高い。
一方、GC回数の少ないブロックにおいては、データBまたはデータCが含まれている可能性が高い。このようなブロックについては、そのブロックのGC動作をすぐに実行せずとも、時管理経過に伴ってブロック内の全てのデータが無効化される可能性がある。
したがって、マージ処理を許可するブロック群をマージ許可閾値th3以上のGC回数を有するブロック群に対してのみに許可することにより、無駄なコピーの発生を防ぐことができ、GCの効率を高めることができる。
図11では、マージ許可閾値th3がGC回数=8に設定されている場合が例示されている。
この場合、最初のGC候補のGC回数と同じGC回数に関連づけられたブロック群(第1ブロック群)のGC回数が8以上であるならば、第1ブロック群と他のブロック群とのマージ処理が許可される。
例えば、GC回数=10のブロック群と他のブロック群とのマージ処理、およびGC回数=9のブロック群と他のブロック群とのマージ処理が、許可される。一方、例えば、GC回数=7のブロック群と他のブロック群とのマージ処理は禁止される。
図12のフローチャートは、マージ処理を特定のGC回数以上のブロック群に対してのみ許可する動作を含むGC動作の手順を示す。
この図12のフローチャートに示されるGC動作においては、図10で説明した処理に加え、ステップS30〜S33の処理が追加されている。以下では、ステップS30〜S33の処理を主に説明する。
第1ブロック群の有効データの総量が閾値th2以下であるならば(ステップS24のYES)、コントローラ4の処理は、ステップS30に進む。ステップS30において、コントローラ4は、第1ブロック群のGC回数がマージ許可閾値th3以上であるか否かを判定する。
第1ブロック群のGC回数がマージ許可閾値th3以上であるならば(ステップS30のYES)、コントローラ4は、図10で説明したステップS27〜S29のマージ処理を実行する。
一方、第1ブロック群のGC回数(最初のGC候補のブロックのGC回数)がマージ許可閾値th3よりも少ないならば(ステップS30のNO)、コントローラ4は、ステップS27〜S29のマージ処理の実行を禁止し、代わりに、ステップS31〜S33の処理を実行する。
ステップS31において、コントローラ4は、第1ブロック群とは異なる別のブロック群をGC対象ブロック群として選択する。例えば、コントローラ4は、最初のGC候補のブロックの次に無効データ量が多いブロックを新たなGC候補として選択し、この新たなGC候補が含まれているGC回数リストによって示されるブロック群をGC対象ブロック群として選択してもよい。
次いで、コントローラ4は、選択されたGC対象ブロック群の有効データをコピー先フリーブロックにコピーし(ステップS32)、コピー先フリーブロックのGC回数を、GC対象ブロック群のGC回数に1を加えた値に設定する(ステップS33)。
最初のGC候補のブロックが、マージ許可閾値th3よりも少ないGC回数に関連付けられている場合には、この最初のGC候補のブロックは、頻繁に更新されるデータを含んでいる可能性が高い。このため、コントローラ4は、最初のGC候補のブロックに対するGCを実行せずに、このブロックの有効データが全て無効化されるまで待っても良い。
次に、図13〜図22を参照して、「LBAベースの更新頻度通知機能」の詳細を説明する。
図13は、フリーブロックをホスト2からのデータの書き込み用に順次割り当てる動作を示す。
コントローラ4は、フリーブロックリスト60によって示されるフリーブロックの一つを書き込み先ブロック62として割り当てる。この場合、コントローラ4は、ブロック使用順序管理リスト35を更新して、書き込み先ブロック62として最初に割り当てられたブロックの割り当て番号(シーケンシャル番号)を1に設定する。ブロック使用順序管理リスト35は、図14に示されているように、ブロックアドレスそれぞれに対応する割り当て番号(シーケンシャル番号)を保持する。これら割り当て番号は、書き込み先ブロック62に割り当てられたブロックの順序関係を示す。つまり、コントローラ4は、書き込み対象ブロックとして割り当てられたブロックそれぞれに対してその割り当て順序を示す割り当て番号を付与し、これら割り当て番号をブロック使用順序管理リスト35を使用して管理する。
コントローラ4は、ホスト2から受信されるライトデータをライトバッファ31に書き込む。この後、コントローラ4は、ルックアップテーブル(LUT)33を更新しながら、ライトバッファ31内のライトデータを書き込み先ブロック62の先頭ページから最終ページに向けて順次ライトする。
書き込み先ブロック62に利用可能ページが無くなったならば、コントローラ4は、書き込み先ブロック62をアクティブブロックリスト61に移動し、フリーブロックリスト60のフリーブロックを新たな書き込み先ブロック62として割り当てる。この場合、コントローラ4は、ブロック使用順序管理リスト35を更新して、この新たな書き込み先ブロック62として割り当てられたこのブロックの割り当て番号(シーケンシャル番号)を2に設定する。
アクティブブロックリスト61内の何れかのブロックの全てのデータがその更新によって無効化されたならば、このブロックはフリーブロックリスト60に移動される。
フリーブロックリスト60内のフリーブロックの数が閾値th1以下に低下したならば、フリーブロックを作り出す上述のGC動作が実行される。
図15は、同じLBAへのライトが要求された時に実行される累積データ書き込み量算出動作を示す。
コントローラ4は、ホスト2からあるLBAを含むライトコマンドを受信した際に、このLBAへの前回のライトからの累積データ書き込み量を、このライトコマンドに対する応答としてホスト2に通知する。累積データ書き込み量は、受信されたライトコマンドのLBAと同じLBAへの前回のライトからライトコマンドのLBAへの今回のライトまでの間にホスト2によってNANDメモリ5に書き込まれたデータの総量を示す。
累積データ書き込み量は、例えば、次の値から算出することができる。
(1)ブロック当たりの容量
(2)ブロック内に含まれるページの数
(3)同じLBAへの前回のライトによってデータが書き込まれたNANDメモリ5内の第1物理記憶位置(旧物理アドレス)
(4)今回のライトによってデータが書き込まれるべきNANDメモリ5内の第2物理記憶位置(新物理アドレス)
(5)第1物理記憶位置(旧物理アドレス)を含むブロックの割り当てから第2物理記憶位置(新物理アドレス)を含むブロックの割り当てまでの間にホスト2からのデータの書き込みのために割り当てられたブロックの数
(1)〜(4)の値は、SSD3内の通常の管理情報であり、累積データ書き込み量の算出のために専用に用意されたものではない。例えば、コントローラ4は、ルックアップテーブル(LUT)33を参照することによって、受信されたライトコマンド内のLBAにマッピングされている物理アドレスを第1物理記憶位置として容易に取得することができる。
(5)の「ブロックの数」は、例えば、第1物理記憶位置を含むブロックに付与された割り当て番号と第2物理記憶位置を含むブロックに付与された割り当て番号とから容易に算出することができる。
割り当て番号(シーケンシャル番号)は、図14のブロック使用順序管理リスト35によって管理されている。これら割り当て番号(シーケンシャル番号)の管理単位は、ブロック単位であるので、これら割り当て番号を保持するために必要な容量は少なくて済む。したがって、累積データ書き込み量は、その算出のための専用の管理情報をほとんど使用すること無く、低コストで取得することができる。
図15では、LBA10を含むライトコマンドが受信された時に実行される累積データ書き込み量算出動作を示している。
ここでは、LBA10への前回のライトによってデータがブロックB51のページPxに既に書き込まれており、且つLBA10への今回のライトによってデータが現在の書き込み先ブロックB62のページPyに書き込まれるべき場合が想定されている。もしブロックB51の割り当て番号が10で、ブロックB51の割り当て番号が13であれば、ブロック51とブロックB62との間に2つの書き込み先ブロック(例えばブロックB52、B61)が割り当てられていたことが分かる。
累積データ書き込み量は、d1+d2+d2+d3で与えられる。
ここで、d1は、ページPxに後続するブロックB51内のページの数、またはこれらページの数に対応する容量を示す。d2は、一つのブロック内のページの数、または一つのブロックの容量を示す。d3は、ページPyに先行するブロックB62内のページの数、またはこのページの数に対応する容量を示す。
LBA10を含む前回のライトコマンドの受信からLBA10を含む今回のライトコマンドの受信までの間にホスト2から受信されるライトコマンドの数が多いほど、累積データ書き込み量は増加する。したがって、上述の累積データ書き込み量は、LBA10によって指定されるデータの更新頻度、つまりLBA10へのライトの頻度を表すことができる。
ライトコマンドの受信時に、コントローラ4は、以下の手順で累積データ書き込み量を取得(算出)してもよい。
まず、コントローラ4は、ルックアップテーブル(LUT)33を参照してライトコマンドに含まれるLBA(ここではLBA10)にマッピングされている旧物理アドレス(ここではPA1)を取得する。そして、コントローラ4は、ブロック使用順序管理リスト35を参照して、旧物理アドレスによって指定されるブロックの割り当て番号(ここでは10)と、新物理アドレス(ここではPA2)によって指定されるブロックの割り当て番号(ここでは13)とを取得する。コントローラ4は、ブロック内に含まれるページの数と旧物理アドレス(PA1)とからd1を求め、ブロック内に含まれるページの数と新物理アドレス(PA2)とからd3を求める。さらに、コントローラ4は、割り当て番号(13)と割り当て番号(10)との間の差分から、旧物理アドレスによって指定されるブロックの割り当てから新物理アドレスによって指定されるブロックの割り当てまでの間に、書き込み先ブロックとして割り当てられたブロックの総数(ここでは、2)を求める。これにより、累積データ書き込み量(=d1+d2+d2+d3)を取得(算出)することができる。
図16は、累積データ書き込み量応答処理の処理シーケンスを示す。
ここでは、この処理シーケンスが、ライトコマンドとライトデータとが分割されているNCQ(Native Command Queing)システムに適用される場合を想定する。
ホスト2は、あるLBA(=LBAx)を示す開始LBAを含むライトコマンドをSSD3に送出する。このライトコマンドの受信に応答して、SSD3のコントローラ4は、LBAxへの前回のライトからLBAxへの今回のライトまでの累積データ書き込み量を算出し(ステップS41)、算出された累積データ書き込み量を含むコマンド許可応答をホスト2に送信する。コマンド許可応答は、受信されたライトコマンドに対するアクノリッジ(ライトコマンドの実行許可)を示す許可応答である。SSD3からホスト2に許可応答が送信されることにより、このライトコマンドによって指定されるライトデータの転送が開始される。許可応答は、実行を許可すべきライトコマンドを識別する値を含んでいても良い。累積データ書き込み量は、例えば、バイトで表されてもよいし、論理ブロック(論理セクタ)の数によって表されてもよい。
コマンド許可応答の受信に応答して、ホスト2は、ライトデータをSSD3に送出する。SSD3のコントローラ4は、ライトデータをライトバッファ31に書き込み、ライトバッファ31のライトデータを書き込み先ブロックに書き込み(ステップS42)、コマンド完了の応答(レスポンス)をホスト2に送信する。なお、ライトデータをライトバッファ31に書き込んだ時点でコマンド完了のレスポンスをホスト2に送信してもよい。
ホスト2は、SSD3から受信されるコマンド許可応答に含まれる累積データ書き込み量に基づいて、LBAxのデータの実際の更新頻度(LBAxへのライトの頻度)を把握することができる。
もしLBAxのデータの実際の更新頻度が、ホスト2によって予期されていたLBAxのデータの更新頻度と異なるならば、例えば、LBAxのデータの実際の更新頻度がホスト2によって予期されていたLBAxのデータの更新頻度よりも高いならば、ホスト2は、必要に応じて、送出したライトコマンドをアボートするためのアボートコマンドをSSD3に送出してもよい。この場合、ライトコマンドによって指定されたデータの書き込みは実行されない。
図17のフローチャートは、コントローラ4によって実行される累積データ書き込み量応答処理の手順を示す。
コントローラ4は、LBAxを開始LBAとして含むライトコマンドをホスト2から受信する(ステップS51)。コントローラ4は、LBAxにマッピングされている旧物理アドレスと、LBAxにマッピングされるべき新物理アドレスと、旧物理アドレスによって指定される物理記憶位置を含むブロックに付与された割り当て番号と、新物理アドレスによって指定される物理記憶位置を含むブロック(現在の書き込み先ブロック)に付与された割り当て番号、等とに基づいて、LBAxへの前回の書き込みからLBAxへの今回の書き込みまでの累積データ書き込み量を算出する(ステップS52)。コントローラ4は、累積データ書き込み量を含む許可応答をホスト2へ返す(ステップS53)。
コントローラ4は、このライトコマンドに対応するライトデータまたはこのライトコマンドをアボートするためのアボートコマンドのいずれがホスト2から受信されるかを判定する(ステップS54)。
もしライトデータが受信されたならば、コントローラ4は、ステップS55に進む。ステップS55では、コントローラ4は、このライトデータをライトバッファ31に書き込み、ライトバッファ31内のライトデータを現在の書き込み先ブロックに書き込み、ルックアップテーブル(LUT)33を更新してLBAxに新物理アドレスをマッピングし、そしてページ管理テーブルを更新して旧物理アドレス(旧データ)を無効化する。
この後、コントローラ4は、コマンド完了のレスポンスをホスト2へ返す(ステップS56)。
なお、上述したように、ライトデータをライトバッファ31に書き込んだ時点でコマンド完了のレスポンスをホスト2に送信してもよい。
一方、アボートコマンドが受信されたならば、コントローラ4は、このライトコマンドを破棄する(ステップS57)。
図18は、累積データ書き込み量応答処理の別の処理シーケンスを示す。
ホスト2は、あるLBA(=LBAx)を開始LBAとして含むライトコマンドをSSD3に送出する。このライトコマンドの受信に応答して、SSD3のコントローラ4は、コマンド許可応答をホスト2に送信する。コマンド許可応答の受信に応答して、ホスト2は、ライトデータをSSD3に送出する。ライトデータはライトバッファ31に書き込まれる。SSD3のコントローラ4は、累積データ書き込み量を算出する(ステップS58)。累積データ書き込み量を算出する処理は、ライトコマンドの受信に応答して開始しても良い。
この後、コントローラ4は、書き込み先ブロックへのライトデータの書き込みを実行し(ステップS59)、算出された累積データ書き込み量を含む、コマンド完了のレスポンスをホスト2に送信する。
なお、上述したように、ライトデータがライトバッファ31に書き込まれた時点で、累積データ書き込み量を含むコマンド完了のレスポンスをホスト2に送信してもよい。
図19のフローチャートは、累積データ書き込み量応答処理の別の手順を示す。
コントローラ4は、LBAxを開始LBAとして含むライトコマンドをホスト2から受信する(ステップS61)。コントローラ4は、許可応答をホスト2へ返す(ステップS62)。コントローラ4は、ライトデータをホスト2から受信する(ステップS63)。ライトデータはライトバッファ31に書き込まれる。
コントローラ4は、LBAxにマッピングされている旧物理アドレスと、LBAxにマッピングされるべき新物理アドレスと、旧物理アドレスによって指定される物理記憶位置を含むブロックに付与された割り当て番号と、新物理アドレスによって指定される物理記憶位置を含むブロック(現在の書き込み先ブロック)に付与された割り当て番号等に基づいて、LBAxへの前回の書き込みからLBAxへの今回の書き込みまでの累積データ書き込み量を算出する(ステップS64)。コントローラ4は、ステップS65に進む。
ステップS65では、コントローラ4は、ライトバッファ31内のライトデータを現在の書き込み先ブロックに書き込み、ルックアップテーブル(LUT)33を更新してLBAxに新物理アドレスをマッピングし、そしてページ管理テーブルを更新して旧物理アドレス(旧データ)を無効化する。
この後、コントローラ4は、累積データ書き込み量を含む、コマンド完了のレスポンスをホスト2へ返す(ステップS66)。
なお、上述したように、ライトデータをライトバッファ31に書き込んだ時点でコマンド完了のレスポンスをホスト2に送信してもよい。
次に、図20〜図23を参照して、累積データ書き込み量の代わりに、同じLBAへの前回のライトからの時間経過値をホスト2に通知する処理について説明する。
この時間経過値は同じLBAへの前回のライトからの時間経過に関する情報であり、時間経過値の例は、同じLBAへの前回のライトの時刻であってもよいし、同じLBAへの前回のライトの時刻とこの同じLBAへの今回のライトの時刻との間の時間間隔であってもよい。
図20は、例えば4Kバイトのような所定の管理単位で、LBAと、物理アドレスと、前回ライトされた時刻との対応関係を管理するように構成されたルックアップテーブル(LUT)33の例を示す。
ルックアップテーブル(LUT)33は、LBA毎に物理アドレス記憶領域33Aと時刻記憶領域33Bとを含む。各時刻記憶領域33Bは、対応するLBAへのライトが発生した時刻を示す値、つまり対応するLBAのデータがライトされた時刻を示す値、を保持するために使用される。各時刻記憶領域33Bに保持される時刻は、例えば、時分秒であってもよい。
あるLBAを含むライトコマンドが受信された時、コントローラ4は、このLBAに対応する物理アドレス領域33Aに物理アドレスを登録すると共に、このLBAに対応する時刻領域33Bに、ライトコマンドによって指定されるデータ(ライトデータ)がライトされた時刻を登録する。物理アドレスは、ライトコマンドによって指定されたデータが書き込まれた物理記憶位置の物理アドレスを示す。ライトされた時刻は、ライトコマンドが受信された時刻であってもよいし、ライトコマンドによって指定されたデータがライトバッファ31に書き込まれた時刻であってもよいし、ライトコマンドによって指定されたデータがNANDメモリ5の書き込み先ブロックにライトされた時刻であってもよい。
図21のフローチャートは、コントローラ4によって実行される時間経過応答処理の手順を示す。
ここでは、時間経過値を含むコマンド許可応答をホスト2に送信する場合を想定する。
コントローラ4は、LBAxを開始LBAとして含むライトコマンドをホスト2から受信する(ステップS71)。コントローラ4は、ルックアップテーブル(LUT)33を参照して、LBAxへの前回のライトの時刻、つまりLBAxを含む前回のライトコマンドによってデータがライトされた時刻を、取得する(ステップS72)。コントローラ4は、LBAxへの前回のライトの時刻を示す時間経過値を含む許可応答をホスト2へ返す(ステップS73)。上述したように、時間経過値は、LBAxへの前回のライトの時刻とLBAxの今回のライトの時刻との間の時間間隔、つまり現在時刻(LBAxへの今回のライトの時刻)からLBAxへの前回のライトの時刻を引いた値であってもよい。
コントローラ4は、このライトコマンドに対応するライトデータまたはこのライトコマンドをアボートするためのアボートコマンドのどちらがホスト2から受信されるかを判定する(ステップS74)。
ライトデータが受信されたならば、コントローラ4は、ステップS75に進む。ステップS75では、コントローラ4は、このライトデータをライトバッファ31に書き込み、ライトバッファ31内のライトデータを現在の書き込み先ブロックに書き込み、ルックアップテーブル(LUT)33を更新してLBAxに新物理アドレスと新ライト時刻とをマッピングし、そしてページ管理テーブルを更新して旧物理アドレス(旧データ)を無効化する。
この後、コントローラ4は、コマンド完了のレスポンスをホスト2へ返す(ステップS76)。
なお、上述したように、ライトデータをライトバッファ31に書き込んだ時点でコマンド完了のレスポンスをホスト2に送信してもよい。
一方、アボートコマンドが受信されたならば、コントローラ4は、このライトコマンドを破棄する(ステップS77)。
図21のフローチャートでは、時間経過値を含むコマンド許可応答をホスト2に送信する場合を説明したが、時間経過値を含むコマンド完了のレスポンスをホスト2に送信してもよい。時間経過値を含むコマンド完了のレスポンスの送信は、図18、図19と同様の手順によって実行することができる。
図22のフローチャートは、SSD3から通知される累積データ書き込み量/時間経過値に基づいてホスト2によって実行される処理の手順を示す。
ホスト2は、SSD3から通知される累積データ書き込み量/時間経過値に基づいて、データを更新頻度の異なる複数種のデータグループに分類してもよい。例えば、ホスト2のファイルシステム43がデータ管理部を含み、このデータ管理部が、データを複数種のデータグループに分類して、データを頻繁に更新されるデータグループ(Hotデータ)と頻度には更新されないデータグループ(Coldデータ)とに分離してもよい。SSD3に書き込んだデータの更新頻度がある閾値以上であるならば、データ管理部は、このデータがHotデータであると認識することができる。
データ管理部は、同じSSD内におけるLBA範囲それぞれの更新頻度をできるだけ同じ範囲の頻度に揃えるために、Hotデータであると認識されたデータをSSD3から別のストレージデバイスに移動しても良い。
あるいは、もしSSD3が高い耐久性を有する高価格SSDとして実現されているならば、HotデータをSSD3内に残し、ColdデータをSSD3から別のストレージデバイスに移動しても良い。高い耐久性を有する高価格SSDの例は、メモリセル当たりに1ビットの情報を格納するSLC−SSDを含む。
SSDの耐久性を示す指標の一つに、DWPD(Drive Write Per Day)がある。例えば、DWPD=10は、1Tバイトの総容量を有するSSDに関しては、1日当たり10Tバイト(=10×1Tバイト)のデータのライトを5年間に渡って毎日実行することができることを意味する。
以下では、前者のための処理の手順の例を説明する。
ホスト2は、LBAxを含むライトコマンドをSSD3に送信し(ステップS81)、累積データ書き込み量または時間経過値を含む応答(許可応答、コマンド完了レスポンス)をSSD3から受信する(ステップS82)。
ホスト2は、累積データ書き込み量または時間経過値に基づき、LBAxのデータの更新頻度(LBAxへのライトの頻度)が所定の上限頻度(閾値th4)以上であるか否かを判定する(ステップS83)。例えば、SSD3から累積データ書き込み量が通知されるケースにおいては、ホスト2は、累積データ書き込み量が閾値th4によって示される閾データ量以上であるかを判定してもよい。SSD3から時間経過値(同じLBAへの前回のライトの時刻)が通知されるケースにおいては、ホスト2は、現在時刻から前回のライトの時刻を引くことによって時間間隔を算出し、この時間間隔が、閾値th4によって示される閾時間間隔以上であるか否かを判定してもよい。あるいは、ホスト2は、累積データ書き込み量または時間経過値を、何回のライトアクセスに1回の割合でLBAxへのライトが発生するかを示す割合[パーセント]に換算し、この時間間隔が、閾値th4によって示される閾時間間隔以上であるか否かを判定してもよい。
LBAxのデータの更新頻度(LBAxへのライトの頻度)が閾値th4以上であるならば(ステップS83のYES)、ホスト2は、LBAxのデータを高更新頻度データグループ(Hotデータ)に分類し(ステップS84)、LBAxのデータをSSD3から他のストレージデバイスに移動する(ステップS85)。
ステップS84においては、もし累積データ書き込み量または時間経過値が含まれるレスポンスがライトコマンドに対する許可応答であったならば、ホスト2は、ライトコマンドをアボートする処理を実行してもよい。
図23は、ホスト2として機能する情報処理装置のハードウェア構成例を示す。
この情報処理装置は、サーバコンピュータ、またはパーソナルコンピュータとして実現される。この情報処理装置は、プロセッサ(CPU)101、メインメモリ102、BIOS−ROM103、ネットワークコントローラ105、周辺インタフェースコントローラ106、コントローラ107、およびエンベデッドコントローラ(EC)108等を含む。
プロセッサ101は、この情報処理装置の各コンポーネントの動作を制御するように構成されたCPUである。このプロセッサ101は、複数のSSD3のいずれか1つからメインメモリ102にロードされる様々なプログラムを実行する。メインメモリ102は、DRAMのようなランダムアクセスメモリから構成される。プロセッサ101によって実行されるプログラムは、上述のアプリケーションソフトウェアレイヤ41、OS42およびファイルシステム43を含む。
また、プロセッサ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)などの入力デバイスを制御するキーボードコントローラを内蔵していてもよい。
図22で説明した処理は、ファイルシステム43の制御の下、プロセッサ101によって実行される。
図24は、複数のSSD3とホスト2とを含む情報処理装置の構成例を示す。
この情報処理装置は、ラックに収容可能な薄い箱形の筐体201を備える。多数のSSD3は筐体201内に配置されても良い。この場合、各SSD3は筐体201の前面201Aに設けられたスロットに取り外し可能に挿入されてもよい。
システムボード(マザーボード)202は筐体201内に配置される。システムボード(マザーボード)202上においては、CPU101、メモリ102、ネットワークコントローラ105、コントローラ107を含む様々な電子部品が実装されている。これら電子部品がホスト2として機能する。
以上説明したように、本実施形態の「ブロック内のデータのGC回数を考慮したGC機能」によれば、ホスト2によって書き込まれたデータを含むブロック毎に、当該ブロック内のデータがガベージコレクション(GC)動作によってコピーされた回数を示すGC回数が管理され、且つ同じGC回数に関連づけられた複数のブロック(第1ブロック)が、ガベージコレクション(GC)動作の対象ブロックとして選択される。そして、これら第1ブロック内の有効データがコピー先フリーブロックにコピーされ、これら第1ブロックのGC回数に1を加えた値が、コピー先フリーブロックのGC回数として設定される。したがって、更新頻度の高いデータと更新頻度の低いデータとがGC動作によって一緒に同じブロックにコピーされてしまうことを防止できるようになる。これにより、GC回数の多いブロックほど、ブロックの容量に対する更新頻度の低いデータの量の割合を増やすことができるので、更新頻度の低いデータを、更新頻度の高いデータから分離することが可能とする。このことは、更新頻度の異なる複数種のデータが混在するブロックの数の増加を抑制できることを意味する。よって、たとえSSD3に書かれるデータが高いデータ局所性を有する場合であっても、更新頻度の高いデータと更新頻度の低いデータとが混在するブロックの数の増加を抑制でき、この結果、SSD3のライトアンプリフィケーションの増加を抑制できる。
なお、本実施形態では、不揮発性メモリとしてNANDメモリを例示した。しかし、本実施形態の機能は、例えば、MRAM(Magnetoresistive Random Access Memory)、PRAM(Phase change Random Access Memory)、ReRAM(Resistive Random Access Memory)、又は、FeRAM(Ferroelectric Random Access Memory)のような他の様々な不揮発性メモリにも適用できる。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。