SSDの寿命とNANDフラッシュメモリ(3/3)：SSDが対応するNANDフラッシュメモリの信頼性上の制約

# はじめに

　これまで2回（[こちら](https://qiita.com/ken-yossy/items/3ab1a823dde4ced919fc)と[こちら](https://qiita.com/ken-yossy/items/691b7af628e03616b06e)）にわたり、SSDの寿命を考えるうえで欠かせないNANDフラッシュメモリのメモリセルの「保証書き換え回数」と、SSDにとってのこの「保証書き換え回数」の意味についてまとめました。

　確かに、SSDの寿命を左右する最も大きな要素のひとつは、NANDフラッシュメモリのメモリセルの「保証書き換え回数」です。

　一方で、SSDのコントローラ（以降、単にSSDと記載します）は、メモリセルの書き換え回数増加によるデータ保持能力の低下だけでなく、NANDフラッシュメモリの様々な信頼性上の「制約」に対応することで、工業製品としての信頼性を達成しています。

　今回の記事では、SSDが対応している、それらNANDフラッシュメモリの信頼性上の「制約」のうち2つを説明します。

# まとめ

* メモリセルの「保証書き換え回数」の他にも、SSDが対応すべきNANDフラッシュメモリの信頼性上の制約はある
* NANDフラッシュメモリの技術進化にともない、SSDとしては、それらの制約への対応が重要となっている

# NANDフラッシュメモリが読み書きできなくなる要因

　NANDフラッシュメモリがその機能（特に記録したデータの読み出し）を果たせなくなる要因は、以下の3種類に大別できます。

1. メモリセルのデータ保持能力の低下
2. データ保持能力低下以外のメモリセルの制約
3. 大規模エラー

　「メモリセルのデータ保持能力の低下」は、広く知られているように、主に書き換え回数の増加により、メモリセルのデータ保持能力が低下することです。

　NANDフラッシュメモリの1チップ内には、膨大な数のメモリセルが存在します。例えば、容量が512ギガビットのNANDフラッシュメモリチップには、512ギガ個（＝約5千億個、実際にはもう少し多い）のメモリセルが存在します。これらのメモリセルひとつずつが（モデルとしては）独立に疲弊してデータ保持能力が低下します。

　この要因についてはこれまでの記事で説明しましたので、そちらの記事をご覧ください。

　二つ目の「その他メモリセルの制約」とは、例えば「読み出し回数」に関する制約です。

　もう一つの「大規模エラー」とは、メモリセルを含むNANDフラッシュメモリ構成要素の信頼性低下や故障に起因する、一つ目の「メモリセルのデータ保持能力の低下」を救済するためにSSDが備える誤り訂正機能では対応できないほどビット数の多いエラーのことを指します。

　この記事では、二つ目と三つ目、つまり「データ保持能力低下以外の制約」と「大規模エラー」に対して、SSDがどのように対応しているのかを説明します。

# データ保持能力低下以外のメモリセルの制約

　「データ保持能力低下以外のメモリセルの制約」の例として、先ほど「読み出し回数」に関する制約を挙げました。

　これはいわゆる"Read Disturb"に伴う制約です。NANDフラッシュメモリメーカーによっては、「保証書き換え回数」と同様に、「保証読み出し回数」を定義しているメーカーもあります。

　せっかくですので、「保証書き換え回数」の説明で使用したメモリセルのイメージを使用して、「保証読み出し回数」の説明をします。

　図1は、そのNANDフラッシュメモリのメモリセルのイメージです。メモリセルは図1左側の「目盛付きカップ」に相当します。

　図1右側の装置は、メモリセルにどの程度水がたまっているか、つまりメモリセルにどのような値が記録されているかを確認するための装置です。ですので、本当はこの装置に目盛がついているほうがより正確なのですが、既にメモリセルのほうに目盛をつけてしまったので、こちらの装置には目盛をつけないでおきます。

　この2つの装置は「筒」でつなげられるようになっていて、確認用装置に水を入れて筒でつなげるイメージです。

![MLC (2bit/cell)のNANDフラッシュメモリのメモリセルイメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/23fabbbd-eafe-06c2-2b4d-bb4464ede1ef.png "MLC (2bit/cell)のNANDフラッシュメモリのメモリセルイメージ")
図1：MLC (2bit/cell)のNANDフラッシュメモリのメモリセルイメージ

　NANDフラッシュメモリのメモリセルから記録されているデータを読み出す処理は、図1のモデルでは、内容確認用装置に入れた水量とメモリセル側の水量が「釣り合う位置」を確認すること、になります。

![NANDフラッシュメモリセルに記録されているデータを読み出す処理（イメージ）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/760ce681-bfeb-651a-eee5-29a55e583886.png "NANDフラッシュメモリセルに記録されているデータを読み出す処理（イメージ）")
図2：NANDフラッシュメモリセルに記録されているデータを読み出す処理（イメージ）

　メモリセルが図1の状態の場合、図2の状態まで右側の装置に水を入れた時にメモリセル側と装置側の水量が釣り合うので、その時の水位から、メモリセルに記録されている値が"00"であると判断します（実際には、右側の内容確認用装置の水位を読んで判断します）。

　この時、内容確認用装置からメモリセルに若干水が流れ込んでしまいます。これがRead Disturbです。メモリセルに水を入れることはメモリセルにプログラム（データを書き込む）ことに相当しますので、「弱いプログラム（弱い書き込み）」をしているような状態です。

　メモリセルに記録されたデータを読む度にこのRead Disturbが起きるため、データを記録した（プログラムした）メモリセルを多数回Readした結果、メモリセルの水量がどんどん増えていって、そのうちに記録したデータが誤って判断されるほどになってしまいます（図3）。

![Read Disturbの蓄積によりデータ誤りが起きる仕組み（イメージ）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/42c34e66-4738-db5c-bc23-eecde353937d.png "Read Disturbの蓄積によりデータ誤りが起きる仕組み（イメージ）")
図3：Read Disturbの蓄積によりデータ誤りが起きる仕組み（イメージ）

　実際には、データ読み出しの対象ではないメモリセルでも、周辺のメモリセルが読み出し対象になるとその影響でRead Disturbを被るため、色々と厄介です。

　このため、「保証書き換え回数」と同じ考え方で、「保証読み出し回数」が定義されることもあります。

　これに対してSSDは、もちろん製品によって異なりますが、読み出し回数をチェックするなどして、「保証読み出し回数」を超えそうになったメモリセルに記録されているデータを別の場所（メモリセル）にコピーする、などの対応を行っています。

# 大規模エラー

## 大規模エラーとは

　SSDが対応する、NANDフラッシュメモリに記録したデータに生じる誤り（エラー）は、大きく2つに分類できます。それは、ランダムエラーと大規模エラーです（図4）。

![SSDが対応するNANDフラッシュメモリのエラーの種類](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/d6fc1ec2-0db6-c0da-f68c-dccb6f2565f0.png "SSDが対応するNANDフラッシュメモリのエラーの種類")
図4：SSDが対応するNANDフラッシュメモリのエラーの種類

　これまで一連の記事で説明してきた、書き換え回数の増加によるデータ保持特性低下などの要因でメモリセル一つずつに起こるデータ誤りは、図4のランダムエラーに相当します。

　冒頭でも触れた通り、この要因によるメモリセルに記録したデータの読み出し時の誤り（エラー）は、他のメモリセルがエラーを起こしているかどうかとは関係なく、それぞれのメモリセルにこれらの要因が蓄積した結果として、ビット単位で発生する、とモデル化します。また、発生する位置もランダムであるとモデル化します。

　これが、「ランダムエラー」と呼ばれる理由です。

　SSDは、BCH (Bose-Chaudhuri-Hocquenghem)符号やLDPC (Low-Density Parity-Check)符号などの誤り訂正符号を用いて、このランダムエラーをビット単位で訂正します。

　一方、ランダムエラーとは発生原理もデータ誤りの規模も異なるエラーが存在します。それが大規模エラーです。

　昨年開催されたFlash Memory Summitの講演資料<sup>[1]</sup>では、3D NANDフラッシュメモリで発生する可能性がある大規模エラーの例について、図5のように説明しています。

![3D NANDフラッシュメモリで起こり得る大規模エラー（FMS 2019の講演資料より）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/4fdb5304-eca8-79f8-d184-078f926eb8db.png "3D NANDフラッシュメモリで起こり得る大規模エラー（FMS 2019の講演資料より）")
図5：3D NANDフラッシュメモリで起こり得る大規模エラー（FMS 2019の講演資料<sup>[1]</sup>より）

　図5の"Case 1"（左）と"Case 2"（右）は、説明のためにかなり簡略化されていますが、それぞれ3D NANDフラッシュメモリのブロックを表現しています。

　図5の平たい板のようなものがワードライン(Wordline, WL)です。横に広がった同じ番号のワードライン（"WLx"の`x'がワードラインの番号）は、図中では切れていますが、物理的にはつながった一枚の「板」です。板状のワードラインがY+1枚に切れているのは、切れたそれぞれの部分を独立に操作可能であることを表現しているのだと思います。

　なお、この図5はQLC NANDフラッシュメモリを想定して描かれています。このため、ワードラインを切った個別の板には"4 page"と記載されています。また、ページサイズは16 KiBを仮定しているようです。

　この図5の表記を使うと、ワードライン数（層数）であるN+1と、ワードラインの分割数Y+1と、多値度（QLC NANDであれば4）を掛け算したものが、ブロック内ページ数になります。

　さて、図5の"Case 1"は、ワードラインが電気的にオープン（開放）になる故障を示しています。電気的にオープンになると、対象ワードライン（図5ではワードラインN (WLN)）に対して適切にリードするための電圧を与えることができなくなります。

　つまり、ワードラインNにデータを記録した後にこの故障が起きると、ワードラインN上にある全てのメモリセルに記録されたデータが読めなくなります。

　読めなくなる可能性のあるデータのサイズは、最大で、図5に記載の通り、4（ページ）×16 KiB×(Y+1)<sup>※</sup>、つまり64 KiB以上となります。

※：図5には"4*16*Y"と書かれていますが、添字Yが使われている部分は0から始まっているので0からYまでであればY+1個となるはずです。

　さらに、図5の"Case 2"は、複数枚のワードライン、例として2つのワードラインが電気的にショート（短絡）する故障を示しています。電気的にショートすると、対象ワードライン（図5ではワードラインN (WLN)とワードラインN-1 (WLN-1)）にリードするための電圧を加えても、適切な電圧になりません。

　つまり、ワードラインNとワードラインN-1にデータを記録した後にこの故障が起きると、ワードラインNとワードラインN-1上にある全てのメモリセルに記録されたデータが読めなくなります。

　読めなくなる可能性のあるデータのサイズは、最大で、図5に記載の通り、ショートしたワードラインの枚数をmとすると、4（ページ）×16 KiB×(Y+1)×m、ショートしたワードラインが2枚であれば128 KiB以上となります。

　このように、大規模エラーは、それがひとたび発生するとサイズの大きいデータ喪失につながる可能性がある、という特徴があります。

　ここでもう一度、ランダムエラーと大規模エラーの違いを確認します。

![ランダムエラーと大規模エラーの性質の違い（イメージ）と適用する誤り訂正方式](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/967ea5f9-8ada-264e-ec17-8dedac3787e4.png "ランダムエラーと大規模エラーの性質の違い（イメージ）と適用する誤り訂正方式")
図6：ランダムエラーと大規模エラーの性質の違い（イメージ）と適用する誤り訂正方式

　ランダムエラーは、ECCの符号内で、ビット単位でかつどのビットがエラーを起こすのかがランダムなエラーです。そして、図4に示した要素の蓄積が原因であるため、ECC符号内の誤りビット数はデータを書き込んでからの経過時間が長くなるにしたがって増えます。

　一方大規模エラーは、ランダムエラーと異なり、突発的に発生し、その一回のエラー発生で複数（多数）ビットがまとめてデータ誤りとなるエラーです。誤りビット数が時間経過に依存するランダムエラーとは大きく異なります。

　その他、大規模エラー発生時にエラーとなるデータのサイズは、ランダムエラー向け誤り訂正符号の符号長よりも大きく、かつ大規模エラーの発生確率は、ランダムエラーの発生確率と比較してとても低い、などの違いがあります。

## SSDの大規模エラー対策

　SSDの大規模エラー対策にも誤り訂正が用いられますが、ランダムエラー対策として備えている誤り訂正符号の訂正能力を補完する機能として設計されたものが、前節で説明したような大規模エラーにも対応できる方式に発展した、という側面があります（図7）。

![大規模エラー対策が対象とする範囲（イメージ）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/839fba42-1066-2035-b1a0-82a8d3e8bd75.png "大規模エラー対策が対象とする範囲（イメージ）")
図7：大規模エラー対策が対象とする範囲（イメージ）

　というのも、図7に示したように、ランダムエラーが原因の誤りビット数も、ランダムエラー向け誤り訂正符号の訂正能力を超えてしまう可能性があり、発生頻度の高いランダムエラーの訂正能力を向上させるために、この領域のエラーを訂正可能にすることの方が重要だったからです。

　上記のような能力が求められる誤り訂正符号として、最近のSSDが備える機能が、Redundant Arrays of Inexpensive Disks (RAID)です。

　ただし、ここで言うSSDが備えるRAID機能とは、1台のSSDがその内部に備える複数のNANDフラッシュメモリチップで構成するものです（図8 (B)）。

![HDDで構成するRAIDとSSD内部で構成するRAIDの違い](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/873329a6-f809-cc20-e431-8fae7286ff0e.png "HDDで構成するRAIDとSSD内部で構成するRAIDの違い")
図8：HDDで構成するRAIDとSSD内部で構成するRAIDの違い

　図8 (B)の具体例を挙げると、図9のような仕組みになります。

![SSDが備えるNANDフラッシュメモリチップ単位でRAIDを構成する例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/df2b9ce0-50cb-dedc-14a2-cdf68a1a3d3b.png "SSDが備えるNANDフラッシュメモリチップ単位でRAIDを構成する例")
図9：SSDが備えるNANDフラッシュメモリチップ単位でRAIDを構成する例

　ホストから受領したライトデータを書き込む際に、チップ1～3に書き込むデータからパリティを計算し（図9ではビット単位の排他的論理和）、そのパリティをチップ4に書き込みます。

　この構成で、チップ3に書き込んだデータCが丸ごと読めなくなったとします。その場合、図10のようにしてデータCに生じた誤りを訂正します。

![図9の構成で誤り訂正を行う例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/bc6c2896-ff8a-5e9c-f3c6-3d6f69c066ee.png "図9の構成で誤り訂正を行う例")
図10：図9の構成で誤り訂正を行う例

　図9のRAIDはビット単位の排他的論理和を用いた構成ですので、パリティ計算に用いたデータ一つ分まで対応可能（訂正可能）です。

　この図8の構成の場合、RAIDを構成するデータの中で、同じビット位置のデータが2ビット以上誤った場合や、データAとデータCの2つを失ってしまった場合などは、データの誤りを訂正できません。

　前者については、NANDフラッシュメモリのビット単位のエラーはランダムエラーであって、RAIDを構成する複数データの同じビット位置のデータがランダムエラー起因で同時にエラーとなる（ランダムエラー向け誤り訂正でも訂正できない）確率は低いと考えられます。

　また後者については、RAIDの構成を工夫して、大規模エラーが発生してもRAIDを構成する複数データのうち誤り訂正に必要なデータが残るようにします。[1]の資料もそのような工夫についての講演の資料です。

　このように、SSDは、製品保証期間（寿命）中に発生する確率が低い事象も含めて、データ喪失を防ぐための機能を備えています。

# まとめ

　今回の記事では、SSD（コントローラ）が対応している、「保証書き換え回数」を除くNANDフラッシュメモリの様々な信頼性上の「制約」について、SSD（コントローラ）での対応方法を含めて説明しました。

　具体的には、「その他メモリセルの制約」として「保証読み出し回数」を、「大規模エラー」として3D NANDフラッシュメモリにおけるワードラインのオープン（開放）やショート（短絡）を、その対策も含めてご説明しました。

　NANDフラッシュメモリを不揮発性記憶媒体とするSSDでは、製品の寿命、製品の信頼性、という視点において、メモリセルの「保証書き換え回数」が最も重要な制約のひとつであることは間違いありませんが、それ以外にも様々な制約に対応することが重要となっています。

# 参考文献
[1] Lin, _"Error Handling Technologies for QLC-Based Storage System"_, Flash Memory Summit 2019, Santa Clara, CA, August 2019

# ライセンス表記
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br />この記事は <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンス</a>の下に提供されています。