(58)【調査した分野】(Int.Cl.,DB名)
第2ストライプにおけるユーザデータセクタごとに、当該セクタのデータがフラッシュメモリに記憶された場合に、当該セクタのデータを前記フラッシュメモリから読み取って前記キャッシュに書き込むステップと、
前記キャッシュに格納された前記第2ストライプの全てのユーザデータセクタのデータに対してチェック演算を行って前記第2ストライプのチェックデータセクタのチェックデータを取得し、当該チェックデータを前記キャッシュに書き込むステップと、
前記キャッシュに格納された前記第2ストライプの全てのセクタのデータをフラッシュメモリに書き込むステップと、を更に含むことを特徴とする請求項1に記載の方法。
前記N物理チャンネルの1つが失効したことが検出されたときに、前記キャッシュにおける旧ストライプに対して以下のステップを実行することを更に含み、前記以下のステップは、
当該ストライプのうちの失効セクタ以外の他のセクタのデータを前記フラッシュメモリから読み取るステップであって、当該失効セクタが前記失効した物理チャンネルにバインディングされた論理チャンネルに対応するセクタであるステップと、
読み出されたデータを用いて前記失効セクタのデータを回復するステップと、
回復されたデータを前記失効セクタのデータとして前記キャッシュに書き込むステップと、
当該ストライプにおけるそれぞれのユーザデータセクタのLBAに基づいて当該LBAに対応する新ストライプと新ユーザデータセクタとを特定するステップであって、当該新ストライプにおけるセクタの数が前記SSDにおける有効物理チャンネルの数に等しいステップと、
当該ユーザデータセクタのデータが前記キャッシュに記憶された場合に、当該ユーザデータセクタのデータを当該新ストライプにおける当該新ユーザデータセクタに移転するステップと、
当該ユーザデータセクタのデータが前記フラッシュメモリに記憶された場合に、当該ユーザデータセクタのデータを前記フラッシュメモリから読み取って前記キャッシュに書き込んだ後、当該ユーザデータセクタのデータを当該新ストライプにおける当該新ユーザデータセクタに移転するステップと、を含むことを特徴とする請求項1に記載の方法。
【発明を実施するための形態】
【0004】
ここで、例示的な実施例を詳細に説明する。その例示は、図面に示される。以下の記述は、図面に係る際、別途示さない限り、異なる図面における同じ符号が同じ又は類似する要素を示す。以下の例示的な実施例に記述される実施形態が本発明と一致する全ての実施形態を代表するわけではない。逆に、それらは、単に添付する特許請求の範囲に詳細に記述されるような、本発明の幾つかの態様に一致する装置及び方法の例である。
【0005】
本発明で使用される用語は、単に特定の実施例を記述する目的であり、本発明を制限するためのものではない。本発明及び添付する特許請求の範囲で使用される単数形式の「一種」、「前記」及び「当該」も、文脈から他の意味を明瞭で分かる場合でなければ、複数の形式を含むことを意図する。理解すべきことは、本文で使用される用語「および/または」が、1つまたは複数の関連する列挙項目を含む如何なる或いは全ての可能な組み合わせを指す。
【0006】
理解すべきことは、本発明において第1、第2、第3等という用語を用いて各種の情報を記述するが、これらの情報は、これらの用語に限定されるものではない。これらの用語は、単に同一のタイプの情報同士を区分するために用いられる。例えば、本発明の範囲を逸脱しない限り、第1情報が第2情報と呼称されてもよく、類似的に、第2情報が第1情報と呼称されてもよい。これは、コンテキストに依存する。例えば、ここで使用される言葉「場合」は、「…とき」や「…ときに」あるいは「特定の状況に応じて」として解釈されてもよい。
【0007】
マルチチャンネル並行技術の使用により、データ読み書きの並行実行が可能であるが、実際の応用にデータ読み書きが必ずしも連続的とは限らず、ほとんどの場合にランダムな読み書きである。このように、同一の物理チャンネルにマウントされたフラッシュメモリへ同時にアクセスすると、アクセスの衝突になってしまう。上記アクセス衝突問題を解決する手法は、主にデータをストライプ化することである。ストライプ化技術は、データ読み書きの負荷を各物理チャンネルにマウントされたフラッシュメモリへ自動的に均一化させる技術である。
【0008】
図1に示すように、ストライプ化技術の使用により、データを複数の所定大きさのサブデータに分割し、それらを異なる物理チャンネルにマウントされたフラッシュメモリにそれぞれ記憶可能である。これにより、データ並行読み書きが図られ、アクセス衝突が効果的に回避される。
【0009】
また、フラッシュメモリは、先に消去(erase)しないと書き込み(program)できない特性を有する。消去の最小単位は、ブロック(Block)であり、読み書きの最小単位は、ページ(Page)であり、1つのブロックは、複数のページを含んでもよい。したがって、フラッシュメモリにおけるデータを変更する際には、直接既存データを新データで上書きすることができず、全ブロックにおけるデータを読み取ってメモリに保存し、メモリにおいて変更すべきデータを新データに更新し、全ブロックにおけるデータを消去し、メモリにおける変更後のデータを当該ブロックに書き込む必要がある。このように、SSDの書き込み拡大(Write Application)問題が生じる。例えば、1つのブロックにおける1024個のページが全部書き尽くされたと仮定すれば、その中の1つのページにおけるデータを変更する必要がある場合に、当該ページの所属するブロックにおける全てのデータをメモリに読み取って当該ページにおけるデータを変更し、その後フラッシュメモリにおける当該ブロックの全てのデータを消去し、メモリにおける変更後のデータを当該ブロックに書き込む必要はある。その際の書き込み拡大倍率は、1024となる。
【0010】
SSDには書き込み拡大倍率が非常に大きいという問題が存在するため、SSDの性能および使用寿命が影響されてしまう。
【0011】
上記問題を解決すべく、本発明の以下の実施例は、SSDアクセス方法、および当該方法に適用可能な装置を提供する。
図2に示すように、本発明の実施例のSSDは、コントローラ201、キャッシュ(Cache)202、3つ以上の物理チャンネル204、およびそれぞれの物理チャンネル204にマウントされたフラッシュメモリ(Flash)203を備える。キャッシュ202は、メモリ中で区分された記憶空間であってもよい。本発明の実施例のSSDは、マルチチャンネル並行技術およびストライプ化技術を用いてデータ読み書きを行ってもよい。
【0012】
これに基づくと、
図3に示すように、本発明の実施例のSSDアクセス方法は、以下のステップを含む。
【0013】
ステップS301では、データ書き込み命令を受信し、当該データ書き込み命令に付加される書き込み待ちデータのLBA(Logical Block Address、論理ブロックアドレス)に対応する第1ストライプと第1セクタとを特定する。
【0014】
それぞれのストライプは、3つ以上のセクタを含んでもよく、且つそれぞれのストライプに含まれるセクタの数がSSDにおける物理チャンネル数に等しく、SSDにおけるフラッシュメモリの数にも相当する。例えば、SSDにおける物理チャンネル数が4であるときに、それぞれのストライプは、4個のセクタを含む。
【0015】
ステップS302では、キャッシュに第1ストライプが存在するか否かを判断し、そうであれば、ステップS303を実行し、そうでなければ、ステップS304を実行する。
【0016】
ステップS303では、書き込み待ちデータを第1セクタのデータとしてキャッシュに書き込む。
【0017】
ステップS304では、第1ストライプを作成し、書き込み待ちデータを第1セクタのデータとしてキャッシュに書き込む。
【0018】
本発明の上記実施例の方法では、SSDにキャッシュ202が設けられ、SSDがデータ書き込み命令を受信した後、更に書き込み待ちデータをキャッシュ202に格納する。このように、変更頻度の高いホットスポットデータについて、当該ホットスポットデータがキャッシュ202に格納可能であるため、単にキャッシュ202におけるデータを変更すればよく、フラッシュメモリ203に対する消去・書き込みを繰り返す必要がなくなり、これにより書き込み拡大倍率が低減される。
【0019】
以下では、上記SSDアクセス方法を詳細に記述する。SSDは、冗長のチェックデータを算出することでフォールトトレラントメカニズムを供給できる。その原理としては、キャッシュの各ストライプにおけるユーザデータに対してチェック演算を行ってチェックデータを取得し、チェックデータを一定のルールに従って異なる物理チャンネルにマウントされたフラッシュメモリに分散させる。このように、ある物理チャンネルが失効したときに、例えば、当該物理チャンネルに障害が発生し、または当該物理チャンネルにマウントされたフラッシュメモリに障害が発生したときに、データ回復を実現できる。また、ストライプにおけるあるセクタのデータ読取に失敗したときにも、データ回復を実現できる。
【0020】
メモリ中で1つの記憶空間をキャッシュとして区分してもよい。当該記憶空間は、あるストライプのあるセクタのデータをキャッシュし、且つ当該ストライプの記録情報を記憶する。
【0021】
本発明の実施例では、セクタ(sector)大きさをストライプ深度、物理チャンネル数Nをストライプ幅としてもよい。即ち、それぞれのストライプは、N個のセクタを含む。フォールトトレラントメカニズムが供給されるように、それぞれのストライプのN個のセクタは、ユーザデータを格納するためのN1個のユーザデータセクタと、チェックデータを格納するためのN2個のチェックデータセクタとを含む。N1+N2=N、N1>N2を満たす。例えば、1つのセクタの大きさは、4Kビットであってもよい。
【0022】
1つの例示では、それぞれのストライプ(strip)におけるN個のセクタを0から番号付け、順にセクタ0、セクタ1、セクタ2、…、セクタN−1とし、且つ最後N2個のセクタをチェックデータセクタとして固定使用してもよい。
【0023】
これに基づくと、本発明の実施例のSSDアクセス方法は、以下の内容を含む。
データ書き込み
図4に示すように、SSDは、ホスト(Host)から送信されたデータ書き込み命令を受信した後、書き込み操作を以下のように実行する。
【0024】
ステップS401では、ホストから送信されたデータ書き込み命令を受信した後、当該データ書き込み命令に付加される書き込み待ちデータのLBAに対応する第1ストライプと第1セクタとを特定する。
【0025】
LBAに対応する第1ストライプのインデックスstrip_indexと第1セクタの識別子sector_idとを特定する算出方法は、数式(1)及び数式(2)を参照してもよい。
【0030】
は、小数点以下の切り捨て演算子を示し、%は、モジュロ演算子を示す。
数式(1)により、各LBAは、異なるストライプに配分可能である。そして、LBAの初期値から、N1個ずつの連続するLBAは、同一のストライプに配分可能である。
【0031】
N1=4であるときに、数式(1)と数式(2)に応じて算出された各LBAに対応するストライプのインデックスとセクタの識別子は、表1に示される。
【0033】
ステップS401における書き込み待ちデータのLBAが14であると仮定すれば、数式(1)と数式(2)に応じて、当該書き込み待ちデータに対応する第1ストライプのインデックス:3および第1セクタの識別子:2は、特定される。
【0034】
ステップS402では、キャッシュに第1ストライプが存在するか否かを判断し、そうであれば、ステップS403を実行し、そうでなければ、ステップS406を実行する。
【0035】
例えば、メモリに複数のHashバケット(bucket)を予め作成してもよく、それぞれのHashバケットが複数のストライプのインデックスと記録情報のキャッシュアドレスを格納する。これにより、ステップS402においてキャッシュに第1ストライプが存在するか否かを判断する方法は、以下のようになる。
【0036】
第1ストライプのインデックスおよび物理チャンネル数Nに対してハッシュ演算を行い、ハッシュ演算結果をバケットID(識別子)とし、メモリにおいて当該バケットIDでマークされるHashバケットを検索する。例えば、第1ストライプのインデックスとNとの和に対してCRC32(Cyclic Redundancy Check、巡回冗長検査)演算を行ってから、演算結果の下位18ビットをバケットIDとする。
【0037】
検索されたHashバケットに第1ストライプのインデックスが存在するか否かを判断し、存在すれば、キャッシュに第1ストライプが存在すると特定し、当該Hashバケットから第1ストライプの記録情報キャッシュアドレスを取得してもよい。そうでなければ、キャッシュに第1ストライプが存在しないと特定する。
【0038】
ステップS403では、キャッシュに第1セクタのデータが格納されたか否かを判断し、そうであれば、ステップS404を実行し、そうでなければ、ステップS405を実行する。
【0039】
第1ストライプの記録情報キャッシュアドレスが取得された後、キャッシュにおいて第1ストライプの記録情報を検索し、当該取得された記録情報に基づいて、キャッシュに第1セクタのデータが格納されたか否かを判断してもよい。ストライプエージング時にキャッシュに格納された当該ストライプのデータをフラッシュメモリに書き込み可能であり、当該ストライプにおけるあるセクタのデータを変更する必要があるときにキャッシュへ当該セクタの変更後の新データを書き込む。したがって、キャッシュには、これらのセクタの変更後のデータ(最新データとも称する)が格納され、フラッシュメモリには、当該セクタの変更前のデータ(旧データとも称する)が格納される。よって、セクタのデータがキャッシュに格納されたかそれともフラッシュメモリに格納されたかを容易に判断するために、当該ストライプの記録情報には、対応する第1識別子と第2識別子をそれぞれのセクタへ設置してもよい。第1識別子と第2識別子は、連携してキャッシュおよびフラッシュメモリにおけるデータ記憶状況を表してもよい。例えば、セクタの第1識別子が有効、第2識別子が有効であるときに、キャッシュとフラッシュメモリとのいずれにも当該セクタのデータが記憶されたことは、表せる。しかし、キャッシュに記憶されたのが当該セクタの最新データであり、フラッシュメモリに記憶されたのが当該セクタの旧データである可能性はある。セクタの第1識別子が有効、第2識別子が無効であるときに、キャッシュに当該セクタのデータが記憶されたが、フラッシュメモリに当該セクタのデータが存在しないことは、表せる。セクタの第1識別子が無効、第2識別子が有効であるときに、キャッシュに当該セクタのデータが存在せず、フラッシュメモリに当該セクタのデータが記憶されたことは、表せる。セクタの第1識別子が無効、第2識別子が無効であるときに、キャッシュとフラッシュメモリとの何れにも当該セクタのデータが存在しないことは、表せる。
【0040】
その中、ストライプにおけるあるセクタのデータがキャッシュに記憶されたときに、当該ストライプの記録情報には、当該セクタのデータがキャッシュに位置するキャッシュアドレスを記録する。
【0041】
このように、ステップS403において第1セクタの第1識別子が有効であるか否かを判断してもよい。そうであれば、キャッシュに第1セクタのデータが格納されたと特定する。
【0042】
ステップS404では、キャッシュに格納された第1セクタのデータを書き込み待ちデータとして更新する。その際、当該書き込み待ちデータは、第1セクタの最新データとなる。
【0043】
例えば、ステップS404において、キャッシュに格納された第1セクタのデータを書き込み待ちデータに更新する方式は、以下のようになってもよい。つまり、書き込み待ちデータをキャッシュに書き込み、第1ストライプの記録情報に記録された第1セクタのデータのキャッシュアドレスを、当該書き込み待ちデータがキャッシュに書き込まれたキャッシュアドレスとして更新し、第1セクタに対応する第1識別子を有効として維持する。また、後で空きアドレスに他のデータが書き込まれるように、第1セクタの更新前のデータのキャッシュアドレスを当該空きアドレスとして記録してもよい。
【0044】
例えば、キャッシュに格納された更新前データをDada A、Dada AのキャッシュアドレスをAddr A、当該書き込み待ちデータをDada Bと仮定すれば、ステップS404において、キャッシュに格納された第1セクタのデータDada Aを書き込み待ちデータDada Bに更新する方式は、下記のようになってもよい。つまり、Dada Bをキャッシュに書き込み、キャッシュアドレスがAddr Bであり、第1ストライプの記録情報に記録された第1セクタのデータのキャッシュアドレスをAddr AからAddr Bに更新し、また、第1セクタの更新前データDada AのキャッシュアドレスAddr Aを空きアドレスとして記録してもよい。このように、引き続きAddr Aに他のデータを書き込むことは容易になる。
【0045】
第1ストライプにおける第1セクタのデータが頻繁に変更されると、上記ステップS401からステップS404を繰り返し実行する。ステップS404が実行されるたびに、キャッシュに格納された第1セクタのデータを更新する。更新前データは、その際、無効データとして見なされ、後で他のデータで上書きされることを待機する。第1ストライプエージングに至るとき、キャッシュに格納された第1ストライプのデータをフラッシュメモリに書き込む。具体的な方法は、
図5を参照すればよく、ここで繰り返し説明しない。
【0046】
ステップS405では、書き込み待ちデータを第1セクタのデータとしてキャッシュに書き込んでもよい。また、第1ストライプの記録情報に第1セクタのデータのキャッシュアドレスを当該書き込み待ちデータのキャッシュアドレスとして記録し、第1セクタの第1識別子を有効にセットしてもよい。
【0047】
ステップS406では、第1ストライプを作成し、書き込み待ちデータを第1セクタのデータとしてキャッシュに書き込んでもよい。また、第1ストライプの記録情報に第1セクタのデータのキャッシュアドレスを当該書き込み待ちデータのキャッシュアドレスとして記録し、第1セクタの第1識別子を有効にセットしてもよい。
【0048】
例えば、ストライプを作成する手順は、下記のようになってもよい。当該ストライプに対応するHashバケットに、当該ストライプのインデックスと記録情報のキャッシュアドレスを記録し、当該ストライプにおける、それぞれのセクタに対応する論理チャンネルを算出して当該ストライプの記録情報に記録し、当該ストライプの記録情報にそれぞれのセクタの第1識別子と第2識別子とをともに無効にセットする。
【0049】
数式(3)に応じてチェックデータセクタに対応する論理チャンネルの識別子p_logic_channel_idを算出してもよい。
【0051】
数式(4)に応じてユーザデータセクタに対応する論理チャンネルの識別子d_logic_channel_idを算出してもよい。
【0053】
sector_idは、セクタの識別子を示し、strip_indexは、セクタの所在するストライプのインデックスを示し、%は、モジュロ演算子を示す。
【0054】
SSDにおける論理チャンネルの総数が物理チャンネルの総数と同じであってもよい。初期時に、論理チャンネルと物理チャンネルとが1対1の対応関係を有してもよい。例えば、初期時に、論理チャンネル0が物理チャンネル0に対応し、論理チャンネル1が物理チャンネル1に対応し、それを持って類推してもよい。その後、SSDにおける物理チャンネルが失効する可能性がある。例えば、物理チャンネル自身に障害が発生し、あるいは当該チャンネルにマウントされたフラッシュメモリに障害が発生する。その際、失効した物理チャンネルに元々対応する論理チャンネルは、他の正常の物理チャンネルとは対応関係を確立してもよい。論理チャンネルと物理チャンネルとの間の対応関係は、チャンネルマッピング表に保存可能である。
【0055】
数式(3)から分かるように、異なるストライプにおいて、チェックデータセクタに対応する論理チャンネルが全ての論理チャンネルに均一に分散されてもよい。このように、異なるストライプにおけるチェックデータが均一に全ての物理チャンネルにマウントされたフラッシュメモリに分散される。これにより、全てのチェックデータが同一物理チャンネルにマウントされたフラッシュメモリに格納されることによって当該フラッシュメモリの使用寿命へ影響を与えてしまうことは、有効に回避できる。
【0056】
数式(3)と数式(4)から分かるように、同一ストライプにおけるそれぞれのセクタに対応する論理チャンネルも、全ての論理チャンネルに均一に分散されてもよい。これにより、SSDの並行アクセス能力が向上する。
【0057】
図4に示す方法によると、SSDは、ホストから送信されたデータ書き込み命令を受信した後、先に書き込み待ちデータをキャッシュに格納してもよい。このように、変更頻度の高いホットスポットデータについて、単にキャッシュにおけるデータを変更すればよく、フラッシュメモリに対する消去・書き込みを繰り返す必要がなくなり、これによりSSDの書き込み拡大倍率が低減される。
【0058】
ストライプエージング
また、キャッシュに何れか1つのストライプを作成した後、当該ストライプのインデックスをエージング連結リストに追加する。エージング連結リストにおけるそれぞれのストライプは、対応する優先度を有する。ストライプに対応する優先度は、キャッシュの記憶空間の大きさ、データ読み取り/書き込み命令数、ストライプ使用頻度、ストライプ直近使用時間、ストライプ有効データ量等のパラメータのうちの1つまたは複数の組み合わせに関連する。例えば、使用頻度が高いストライプの優先度は、低くされる。このように、よく変更される必要のあるデータをできるだけキャッシュに格納することが確保され、フラッシュメモリに対する消去・書き込み回数の低減も容易になる。例えば、エージング連結リストから1つの最も高い優先度のストライプを周期的に選択してエージングを行う。
【0059】
あるストライプに対してエージングを行う必要が生じるとき、即ち、キャッシュにおける当該ストライプのデータをフラッシュメモリへ書き込むとき、SSDで実行されるステップは、
図5に示され、以下のステップを含む。
【0060】
ステップS501では、第2ストライプにおけるユーザデータセクタごとに、当該セクタのデータが当該セクタに対応するフラッシュメモリに記憶された場合に、当該セクタのデータをフラッシュメモリから読み取ってキャッシュに書き込む。
【0061】
例えば、第2ストライプにおけるユーザデータセクタごとに、当該セクタの第1識別子が無効、第2識別子が有効である場合は、当該セクタのデータがフラッシュメモリに記憶されたことを意味する。当該セクタに対応するLBAを特定し、アドレス変換表から当該LBAに対応するPBA(Physical Block Address、物理ブロックアドレス)を検索し、検索されたPBAに基づいて当該セクタのデータをフラッシュメモリから読み取ってキャッシュに書き込んでもよい。また、更に、当該ユーザデータセクタの第1識別子を有効にセットし、第2ストライプの記録情報に当該ユーザデータセクタのデータのキャッシュアドレスを記録してもよい。ただし、セクタに対応するLBAを特定する方式は、下記のようになってもよい。つまり、ストライプのインデックスとセクタの識別子が既知である場合に、数式(1)と数式(2)に応じて当該セクタに対応するLBAを算出する。
【0062】
このように、ステップS501の実行が完成された後、第2ストライプにおけるそれぞれのユーザデータセクタのデータは、いずれもキャッシュに格納される。
【0063】
ステップS502では、キャッシュに格納された第2ストライプの全てのユーザデータセクタのデータに対してチェック演算を行ってチェックデータを取得し、当該チェックデータを第2ストライプのチェックデータセクタのデータとしてキャッシュに書き込む。その際、第2ストライプにおけるそれぞれのセクタ(ユーザデータセクタとチェックデータセクタを含む)のデータは、何れもキャッシュに格納される。
【0064】
これで、ストライプにおけるデータをフラッシュメモリへ書き込む際、ストライプにおけるユーザデータに基づいてチェックデータを算出してもよい。
【0065】
ステップS503では、キャッシュに格納された第2ストライプのそれぞれのセクタのデータをフラッシュメモリに書き込む。具体的に、第2ストライプにおけるそれぞれのセクタについて、当該セクタに対応する論理チャンネルを特定し、当該論理チャンネルに対応する物理チャンネルを検索し、当該セクタのデータをキャッシュから読み取って当該物理チャンネルにマウントされたフラッシュメモリに書き込み、書き込みの完成後、LBAとPBAとの対応関係をアドレス変換表に記録する。LBAは、ストライプのインデックスとセクタの識別子が既知である場合に、数式(1)と数式(2)に応じて取得可能であり、PBAは、データ書き込みの完成後で分かることができる。例えば、PBAは、フラッシュメモリのブロック、ページにおけるデータのシフト位置を認識できる。
【0066】
キャッシュに格納された第2ストライプのそれぞれのセクタのデータをフラッシュメモリに書き込んだ後、キャッシュにおける第2ストライプを削除してもよい。例えば、第2ストライプを削除する方法は、具体的に下記のようになってもよい。つまり、Hashバケットに記録された第2ストライプのインデックスと記録情報のキャッシュアドレスを削除し、第2ストライプの記録情報を削除する。また、更に、後で他のデータを書き込むことが容易になるように、これらのデータのキャッシュアドレスを空きアドレスとして記録してもよい。
【0067】
図5に示す方法によると、あるストライプのエージング時に、当該ストライプにおけるユーザデータとチェックデータとをともにフラッシュメモリに書き込む。
【0068】
データ読取
図6に示すように、ホストから送信されたデータ読み取り命令が受信された後、SSDで実行される読取操作は、下記のようになる。
【0069】
ステップS601では、ホストから送信されたデータ読み取り命令を受信した後、当該データ読み取り命令に付加される読み取り待ちデータのLBAに対応する第3ストライプと第3セクタとを特定する。
【0070】
ステップS601では、数式(1)と数式(2)に応じてLBAに対応する第3ストライプと第3セクタとを特定してもよい。
【0071】
ステップS602では、キャッシュに第3ストライプが存在するか否かを判断し、存在すれば、ステップS603を実行し、そうでなければ、ステップS606を実行する。
【0072】
例えば、メモリに複数のHashバケットを予め作成してもよく、それぞれのHashバケットが複数のストライプのインデックスと記録情報のキャッシュアドレスを格納する。このように、ステップS602においてキャッシュに第3ストライプが存在するか否かを判断する具体的な方法は、下記のようになる。
【0073】
第3ストライプのインデックスと物理チャンネル数Nとに対してハッシュ演算を行い、ハッシュ演算結果をバケットIDとし、メモリにおいて当該バケットIDでマークされるHashバケットを検索する。例えば、第3ストライプのインデックスとNとの和に対してCRC32演算を行い、その後演算結果の下位18ビットをバケットIDとする。
【0074】
検索されたHashバケットに第3ストライプのインデックスが存在するか否かを判断し、存在すれば、キャッシュに第3ストライプが存在すると特定し、当該Hashバケットから第3ストライプの記録情報のキャッシュアドレスを取得してもよい。そうでなければ、キャッシュに第3ストライプが存在しないと特定する。
【0075】
ステップS603では、第3セクタのデータがキャッシュに記憶されたか否かを判断する。そうであれば、ステップS604を実行し、そうでなければ、第3セクタのデータがフラッシュメモリに格納されたことを意味するため、ステップS606を実行する。
【0076】
第3ストライプの記録情報のキャッシュアドレスが取得された後、キャッシュにおいて第3ストライプの記録情報を検索し、当該第3ストライプの記録情報に基づいて第3セクタのデータがキャッシュに記憶されたか否かを判断してもよい。例えば、当該第3ストライプの記録情報に記録された第3セクタの第1識別子が有効である場合に、第3セクタのデータがキャッシュに記憶されたと判断する。そうでなければ、第3セクタのデータがフラッシュメモリに記憶されたと判断する。しかし、第3セクタのデータがフラッシュメモリに記憶されたか否かは、第3ストライプの記録情報に記録された第3セクタの第2識別子に基づいて判断可能である。例えば、第3ストライプの記録情報に記録された第3セクタの第2識別子が有効である場合に、第3セクタのデータがフラッシュメモリに記憶されたと判断する。そうでなければ、フラッシュメモリに第3セクタのデータが記憶されていないと判断する。このような場合に、読み取り障害が発生する恐れがあり、ホストへ報告する必要がある可能性は存在する。
【0077】
ステップS604では、キャッシュから第3セクタのデータを読み取った後、ステップS605を実行する。
【0078】
例えば、第3ストライプの記録情報から第3セクタのデータのキャッシュアドレスを取得する。このように、当該キャッシュアドレスに基づいて第3セクタのデータを読み取る。
【0079】
ステップS605では、読み出されたデータをホストへ返信する。
ステップS606では、フラッシュメモリから第3セクタのデータを読み取り、その後、ステップS605を実行する。
【0080】
フラッシュメモリからデータを読み取る方式は、下記のようになってもよい。つまり、データのLBAに基づいて、アドレス変換表から当該LBAに対応するPBAを検索し、検索されたPBAに基づいてフラッシュメモリからデータを読み取る。
【0081】
1つの例示によると、ステップS606においてフラッシュメモリから第3セクタのデータを読み取ることに失敗した場合に、第3ストライプのうち、第3セクタ以外の他のセクタのデータをフラッシュメモリから読み取り、読み出された他のセクタのデータを用いて第3セクタのデータを回復してホストへ返信する。
【0082】
図6に示す方法によると、データの読み取り時、キャッシュに読み取り待ちデータが存在する場合に、キャッシュから当該データを読み取り、キャッシュに読み取り待ちデータが存在しない場合に、フラッシュメモリから当該データを読み取ってもよい。このように、キャッシュからデータを読み取る速度がより高速であるため、より高速のデータ読み書き速度をユーザへ供給可能である。
【0083】
物理チャンネル失効時のデータ回復および移転
SSDの信頼性が向上されるように、ある物理チャンネルが失効したときに、サービスを中断せずに、失効した物理チャンネルにマウントされたフラッシュメモリに記憶されたデータを回復し、且つ、失効前のストライプ(以下、旧ストライプとも称する)におけるデータを新ストライプに移転する必要はある。データ回復および移転が完成された旧ストライプを特定するために、旧ストライプにおいてデータ回復および移転を完成した後、当該旧ストライプのインデックスをストライプ回復(strip_recover)表に記録してもよい。
【0084】
例えば、
図7に示すように、ある物理チャンネルの失効が検出されたときに、キャッシュにおけるそれぞれの旧ストライプに対して以下のステップを実行する。
【0085】
ステップS701では、当該旧ストライプのうちの失効セクタ以外の他のセクタのデータをフラッシュメモリから読み取り、読み出されたデータ(ユーザデータとチェックデータを含む)を用いて失効セクタのデータを回復し、回復されたデータを失効セクタのデータとしてキャッシュに書き込む。
【0086】
旧ストライプにおけるセクタの数が失効前の物理チャンネル数に等しい。ある物理チャンネルが失効したときに、当該物理チャンネルにバインディングされた論理チャンネルに対応するセクタも相応に失効する。その際、SSDにおける有効物理チャンネルの数に基づいて新たなストライプとセクタを再特定してもよい。
【0087】
仮に、失効前、SSDにおける物理チャンネル数をNとすれば、その際のストライプが旧ストライプと呼ばれ、それぞれの旧ストライプのN個のセクタは、N1個のユーザデータセクタとN2個のチェックデータセクタを含む。
【0088】
ある物理チャンネルが失効した後、SSDにおける物理チャンネル数がN−1であり、その際のストライプが新ストライプと呼ばれ、それぞれの新ストライプのN−1個のセクタは、N1−1個のユーザデータセクタと、N2個のチェックデータセクタを含んでもよい。その際、読み書きデータ操作を実行するときに、N1−1に準じてLBAに対応する新ストライプと新セクタとを特定してもよい。
【0089】
ステップS702では、当該旧ストライプにおけるそれぞれの旧ユーザデータセクタについて、当該旧ユーザデータセクタのLBAに基づいて当該LBAに対応する新ストライプと新ユーザデータセクタとを特定してもよい。当該旧ユーザデータセクタのデータがキャッシュに記憶された場合に、当該旧ユーザデータセクタのデータを当該新ストライプにおける当該新ユーザデータセクタに移転してもよい。当該旧ユーザデータセクタのデータがフラッシュメモリに記憶された場合に、当該ユーザデータセクタのデータをフラッシュメモリから読み取ってキャッシュに書き込み、当該旧ユーザデータセクタのデータを当該新ストライプにおける当該新ユーザデータセクタに移転してもよい。
【0090】
それから、旧ストライプのデータ移転の完成後、当該旧ストライプを削除し、当該旧ストライプのインデックスをstrip_recover表に記録してもよい。
【0091】
例えば、数式(1)と数式(2)に応じて、LBAに対応する新ストライプと新ユーザデータセクタを特定する。
【0092】
当該旧ユーザデータセクタのデータを当該新ストライプにおける当該新ユーザデータセクタに移転する方式は、下記のようになってもよい。つまり、当該新ストライプの記録情報に、当該新ユーザデータセクタのデータのキャッシュアドレスを当該旧ユーザデータセクタのデータのキャッシュアドレスとして記録する。
【0093】
明らかに、ステップS702では、当該旧ユーザデータセクタのデータを当該新ストライプにおける当該新ユーザデータセクタに移転する前に、キャッシュに当該新ストライプが存在するか否かを判断する必要もある。存在しない場合に、当該新ストライプを先に作成し、その後、当該旧ユーザデータセクタのデータを当該新ストライプにおける当該新ユーザデータセクタに移転する必要がある。
【0094】
失効前よりも、失効後の物理チャンネル数が減っている。新ストライプにおけるセクタ数は、旧ストライプにおけるセクタ数よりも少なくなる。したがって、1つの新ストライプにおけるユーザデータは、1つまたは2つの旧ストライプからのものである。この1つまたは2つの旧ストライプは、当該新ストライプに関連する旧ストライプと呼称されてもよい。
【0095】
実際の実施過程に、何れかの新ストライプが作成された後、当該新ストライプをエージング連結リストに追加してもよい。データ回復および移転過程において、エージング連結リストに旧ストライプも新ストライプも存在する。旧ストライプと新ストライプを容易に区別するために、エージング連結リストにそれぞれのストライプに対応するSSDモードをマークしてもよい。旧ストライプに対応するのが失効前のSSDモードであり、例えば、失効前のSSDモードがN1+N2モードである。新ストライプに対応するのが失効後のSSDモードであり、例えば、失効後のSSDモードが(N1−1)+N2モードである。所定の周期に達するとき、エージング連結リストから優先度の最も高い新ストライプを選択してエージングを行い、旧ストライプについてエージングを行う必要がない。なお、ある新ストライプに対してエージングを行う必要があるとき、当該新ストライプに関連する旧ストライプがデータ回復および移転を完成したか否かを先に判断する必要がある。データ回復および移転が完成されてから初めて当該新ストライプに対してエージングを行い、当該新ストライプのデータをフラッシュメモリに書き込む。データ回復および移転が完成されていない場合に、一旦当該新ストライプに対してエージングを行わず、関連する旧ストライプに対してデータ回復を行った後、旧ストライプのデータを新ストライプに移転する。これにより、旧ストライプのデータが破壊されてデータを回復できないことは、回避可能である。
【0096】
ただし、ある新ストライプに関連する旧ストライプを特定する方法は、下記のようになってもよい。つまり、数式(1)に応じて当該新ストライプのインデックスが既知である場合に、当該新ストライプに対応するLBA範囲を特定し、当該LBA範囲中の最小値について、数式(1)に応じて対応する第1旧ストライプのインデックスを特定し、当該LBA範囲中の最大値について、数式(1)に応じて対応する第2旧ストライプのインデックスを特定し、第1旧ストライプのインデックスと第2旧ストライプのインデックスとが同じである場合に、当該新ストライプに関連する旧ストライプが1つしかなく、即ち、第1旧ストライプ(つまり、第2旧ストライプ)であると特定し、第1旧ストライプのインデックスと第2旧ストライプのインデックスとが異なり、且つ両者の差分が1である場合に、当該新ストライプに関連する旧ストライプが2つあり、それぞれ第1旧ストライプと第2旧ストライプであると特定する。
【0097】
データ回復および移転過程に、SSDがホストから送信されたデータ読み取り命令を受信すると、当該データ読み取り命令に付加される読み取り待ちデータのLBAに対応する新ストライプを特定する。キャッシュに当該新ストライプが存在しない場合に、以下のステップを実行する。
【0098】
当該LBAに対応する旧ストライプと旧セクタとを特定する。
キャッシュに当該旧ストライプが存在する場合に、当該旧セクタに対応する論理チャンネルにバインディングされた物理チャンネルが正常であるとき、キャッシュまたはメモリから当該旧セクタのデータを読み取ってホストに返信し、当該旧セクタに対応する論理チャンネルにバインディングされた物理チャンネルが失効したとき、当該旧ストライプのデータに対してデータ回復および移転を行う。
【0099】
キャッシュに当該旧ストライプが存在しない場合に、当該旧セクタに対応する論理チャンネルにバインディングされた物理チャンネルが正常であるとき、アドレス変換表から当該LBAに対応するPBAを検索し、当該PBAに基づいてフラッシュメモリからデータを読み取ってホストに返信し、当該旧セクタに対応する論理チャンネルにバインディングされた物理チャンネルが失効したとき、当該旧ストライプのデータに対してデータ回復および移転を行う。
【0100】
上記データ回復および移転方法により、物理チャンネルが失効したときに、失効した物理チャンネルにマウントされたフラッシュメモリに記憶されたデータに対して回復を行い、失効前のストライプにおけるデータを新ストライプへ移転することができるため、サービスの継続性が保証され、SSDのフォールトトレラント能力が向上し、サービスの高可用性(HA)が向上し、且つ、データ回復および移転過程に、SSDがデータ読み書きを正常に実行可能であり、新旧ストライプが並行に存在可能である。
【0101】
上記SSDアクセス方法の実施例に対応し、本発明は、SSDアクセス装置の実施例を更に提供する。
【0102】
本発明のSSDアクセス装置の実施例は、SSDに適用可能である。ハードウェア実装から言えば、
図8は、本発明のSSDアクセス装置の所在するSSDの1種のハードウェア構造模式図である。当該SSDは、コントローラ10、3つ以上の物理チャンネル20、各物理チャンネル20にマウントされたフラッシュメモリ30、バス40、および機器読み取り可能な記憶媒体50を備える。ただし、機器読み取り可能な記憶媒体50から1つの記憶空間をキャッシュ70として区画してもよいが、これに限定されず、キャッシュ70は、他の実施形態もあり得る。コントローラ10は、機器読み取り可能な記憶媒体50における機器の実行可能な指令を読み取ることにより、上述したSSDアクセス方法を実行可能である。コントローラ10は、例えば、CPU等のプロセッサであってもよい。実の実施中に、当該SSDの実際の機能に基づき、他のハードウェアを備えてもよいが、ここで繰り返し説明しない。
【0103】
本文における機器読み取り可能な記憶媒体50は、如何なる電気的なもの、磁気的なもの、光学的なものまたは他の物理的記憶装置であってもよく、情報(例えば、実行可能な指令、データ等)を含むか記憶可能である。例えば、機器読み取り可能な記憶媒体は、揮発性メモリ或いは不揮発性メモリ、例えば、RAM(Random Access Memory、ランダムアクセスメモリ)、フラッシュメモリ、記憶ドライバ(例えば、ハードディスクドライバ)、如何なるタイプの記憶ディスク、または上記1種或いは複数種の組み合わせであってもよい。
【0104】
本発明のSSDアクセス装置60の実施例は、ソフトウェアにて実現されてもよく、ハードウェアまたはソフト・ハードウェアの組み合わせの方式にて実現されてもよい。ソフトウェアによる実現を例とすると、1つの論理意味での装置は、所在するSSDのコントローラ10が機器読み取り可能な記憶媒体50における機器の実行可能な指令を読み取って実行することで形成されるものである。
【0105】
図9を参照すると、本発明の実施例のSSDアクセス装置60は、受信手段601および読み書き手段602を備える。
【0106】
受信手段601は、SSDに対するデータ書き込み命令を受信し、データ書き込み命令に付加される書き込み待ちデータのLBAに対応する第1ストライプと第1セクタとを特定する。SSDがN個の物理チャンネルとキャッシュとを含み、それぞれの物理チャンネルにメモリがマウントされ、キャッシュが複数のストライプを含み、それぞれのストライプがN個のセクタを含み、Nが3以上の整数である。
【0107】
読み書き手段602は、キャッシュに第1ストライプが存在する場合に、書き込み待ちデータを第1セクタのデータとしてキャッシュに書き込み、キャッシュに第1ストライプが存在しない場合に、第1ストライプを作成し、書き込み待ちデータを第1セクタのデータとしてキャッシュに書き込む。
【0108】
受信手段601は、具体的に、以下の数式に応じてLBAに対応するストライプのインデックスstrip_indexとセクタ識別子sector_idとを特定する。
【0110】
N1は、1つのストライプにおける、ユーザデータを格納するためのセクタの数を示し、N1は、1より大きくNより小さい整数であり、
【0112】
は、小数点以下の切り捨て演算子を示し、%は、モジュロ演算子を示す。
図10に示すように、上記SSDアクセス装置60は、算出手段603を更に備える。
【0113】
読み書き手段602は、第2ストライプにおけるユーザデータセクタごとに、当該セクタのデータがフラッシュメモリに記憶された場合に、当該セクタのデータをフラッシュメモリから読み取ってキャッシュに書き込む。
【0114】
算出手段603は、キャッシュに格納された第2ストライプの全てのユーザデータセクタのデータに対してチェック演算を行い、第2ストライプのチェックデータセクタのチェックデータを取得する。
【0115】
読み書き手段602は、算出手段603で算出された第2ストライプのチェックデータセクタのチェックデータをキャッシュに書き込むとともに、キャッシュに格納された第2ストライプの全てのセクタのデータをフラッシュメモリに書き込む。
【0116】
読み書き手段602は、更に、以下の方式でキャッシュに格納された第2ストライプのセクタのデータをフラッシュメモリに書き込む。
【0117】
つまり、当該セクタに対応する論理チャンネルを特定し、当該論理チャンネルに対応する物理チャンネルを検索し、キャッシュに格納された当該セクタのデータを当該物理チャンネルにマウントされたフラッシュメモリに書き込む。
【0118】
当該セクタに対応する論理チャンネルを特定することは、
当該セクタがユーザデータを格納するためのユーザデータセクタであるときに、当該ユーザデータセクタに対応する論理チャンネルの識別子d_logic_channel_idを
【0120】
で特定することと、
当該セクタがチェックデータを格納するためのチェックデータセクタであるときに、当該チェックデータセクタに対応する論理チャンネルの識別子p_logic_channel_idをp_logic_channel_id=strip_index%Nで特定することとを含む。
【0121】
sector_idは、セクタ識別子を示し、strip_indexは、セクタの所在するストライプのインデックスを示し、%は、モジュロ演算子を示す。
【0122】
受信手段601は、更に、SSDに対するデータ読み取り命令を受信し、データ読み取り命令に付加される読み取り待ちデータのLBAに対応する第3ストライプと第3セクタとを特定する。
【0123】
読み書き手段602は、更に、キャッシュが第3ストライプに存在し、且つ第3セクタのデータがキャッシュに記憶された場合に、キャッシュから第3セクタのデータを読み取り待ちデータとして読み取り、キャッシュに第3ストライプが存在し、且つ第3ストライプにおける第3セクタのデータがフラッシュメモリに格納した場合に、または、キャッシュに第3ストライプが存在しない場合に、第3セクタに対応するフラッシュメモリから第3セクタのデータを読み取り待ちデータとして読み取る。
【0124】
図10に示すように、上記SSDアクセス装置60は、以下の手段を更に備える。
検出手段604は、物理チャンネルの状態を検出する。
【0125】
回復移転手段605は、N個の物理チャンネルの1つが失効したと検出手段604によって検出されたときに、キャッシュにおける旧ストライプに対して以下のステップを実行する。
【0126】
当該旧ストライプのうちの失効セクタ以外の他のセクタのデータをフラッシュメモリから読み取る。ただし、当該失効セクタは、前記失効した物理チャンネルにバインディングされた論理チャンネルに対応するセクタである。
【0127】
読み出されたデータを用いて失効セクタのデータを回復する。
回復されたデータを失効セクタのデータとしてキャッシュに書き込む。
【0128】
当該ストライプにおけるそれぞれのユーザデータセクタのLBAに対して当該LBAに対応する新ストライプと新ユーザデータセクタとを特定する。ただし、新ストライプにおけるセクタ数は、SSDにおける有効物理チャンネル数に等しい。
【0129】
当該ユーザデータセクタのデータがキャッシュに記憶された場合に、当該ユーザデータセクタのデータを当該新ストライプにおける当該新ユーザデータセクタに移転する。
【0130】
当該ユーザデータセクタのデータがフラッシュメモリに記憶された場合に、当該ユーザデータセクタのデータをフラッシュメモリから読み取ってキャッシュに書き込み、当該ユーザデータセクタのデータを当該新ストライプにおける当該新ユーザデータセクタに移転する。
【0131】
上記装置における各手段の機能及び作用の実現手順は、上記方法の対応ステップの実現手順を詳細に参照すればよいため、ここで繰り返し説明しない。
【0132】
装置実施例は、方法実施例に基本的に対応するため、その関連箇所が方法実施例部分の説明を参照すればよい。上述した装置実施例は、単に例示であり、その中、分離部品として説明される手段が物理的に分離されるものであってもよくでなくてもよい。また、手段として表示される部品は、物理手段であってもでなくてもよい。更に、それらの手段は、1箇所に位置してもよく、複数のネットワークセルに分散してもよい。実際の需要に応じてその中の一部または全部のモジュールを選択して本実施例の目的を果たすことが可能である。当業者は、進歩性に値する労働をせずに、理解して実施可能である。
【0133】
説明すべきことは、本文に、第1と第2等のような関係用語は、単に1つの実体や操作を別の実体や操作と区分させるために用いられ、これらの実体や操作の間になんらかの実際的な関係や順序が存在するとは必ずしも要求やヒントすることではない。用語「含む」、「備える」またはほかの何れかの同義語が非排他的含有をカバーすることを狙う。このように、一シリーズの要素を有する手順、方法、物品または機器は、それらの要素を有するだけではなく、明確に挙げられていない他の要素も有し、またはこのような手順、方法、物品または機器に固有の要素も有する。更なる制限がない限り、語句「1つの…を含む」で限定される要素は、前記要素を有する手順、方法、物品または機器に他の同じ要素を更に有することをあえて排除しない。
【0134】
以上では、本発明の実施例に供される方法と装置を詳細に説明した。本文では、具体的な例を用いて本発明の原理及び実施形態を説明したが、以上の実施例の説明が単に本発明の方法およびその要旨を容易に理解するために用いられる。それとともに、当業者であれば、本発明の思想に基づいて具体的な実施形態及び応用範囲を変更可能である。したがって、本明細書の内容は、本発明に対する制限として理解されるべきではない。