SLCキャッシュ(2/3)：メリットとデメリット

# はじめに
　[前回の記事](https://qiita.com/ken-yossy/items/b784f5d96e56fc516fb5)で、NANDフラッシュメモリを搭載したSSD（以降単にSSDと記載）を語る上で欠かせないSLCキャッシュの基本的な仕組みについて説明しました。

　そこで今回は、SSDの利用者が一番気になるであろう「SLCキャッシュのメリットとデメリット」を説明します。メリットとデメリット共に、そのポイントは「**キャッシュであること**」と「**キャッシュがNANDフラッシュメモリであること**」の2点です。

# まとめ
* SLCキャッシュのメリット例：高いデータアクセス性能、主記憶の寿命温存、データ保護
* SLCキャッシュのデメリット例（ライトバック発生時の事象）：データアクセス性能低下、性能のブレ、寿命消費加速

# 復習：SLCキャッシュの仕組みと構成
　図1は、SSD内部でのユーザデータに対するメモリ階層を示したイメージ図です（前回の記事から再掲）。SSDの場合、主記憶がTLC NANDやQLC NAND、L2キャッシュがSLCキャッシュ、L1キャッシュが揮発RAMキャッシュとなります。

![SSD内部のキャッシュ階層イメージ図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/2108bfef-06c7-080c-6d52-d82657dd852e.png "SSD内部のキャッシュ階層イメージ図")
_図1：SSD内部のユーザデータ向けメモリ階層イメージ図（再掲）_

　図1のように、SLCキャッシュは、主記憶であるTLC NANDやQLC NANDとSLCの読み書きのレイテンシ差を利用して構成されたキャッシュです。

　そして図2が、FIFO構造でかつ追い出すブロックの選択アルゴリズムにFIFOを採用したSLCキャッシュのイメージ図です（これも前記事からの再掲）。

![FIFO構造で追い出し方式がFIFOのSLCキャッシュイメージ図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/4f09b1d1-8603-06dc-68a2-ad96d7788c83.png "FIFO構造で追い出し方式がFIFOのSLCキャッシュイメージ図")
_図2：FIFO構造で追い出し方式がFIFOのSLCキャッシュイメージ図（再掲）_

　SLCキャッシュの入口（FIFOの入口）にはホストからの書き込みとそれにより主記憶から読み出されたデータが書き込まれ、追い出すブロックの選択アルゴリズムがFIFOであればSLCキャッシュの出口（FIFOの出口）のブロック内の有効データが主記憶に追い出されます（コピーされます）。

　追い出されたブロックは回収され、消去され、その後の書き込みで再利用されます。また、FIFOの入口のブロックの全ページにデータが書き込まれると、新しいブロックが供給されて、SLCキャッシュは動作を継続します。

# メリット
　ではこの記事の本題に移ります。まずはSLCキャッシュのメリットです。

　ここでは、「**高いデータアクセス性能**」「**主記憶の寿命温存**」そして「**データ保護**」の3点を説明します。

## 高いデータアクセス性能
　SLCキャッシュの最大のメリットは、WriteコマンドがSLCキャッシュで吸収できている限り、そしてReadコマンドがSLCキャッシュにヒットしている限り、SSDが搭載するNANDフラッシュメモリがTLC NANDでもQLC NANDでも、SLC NANDフラッシュメモリとほぼ同等のデータ読み書き性能を得られることです。

　図3は、512 Gb (64 GB)のTLC NANDフラッシュメモリチップ（ページサイズ16 KB、4プレーン品）を32チップ搭載した2 TBのSSDを例に、SLCキャッシュを使用する場合と使用しない場合の書き込み性能の比較です。

:::note warn
ここで使用したNANDフラッシュメモリの諸元は説明用の数値であり実際の値とは限りません
:::

![SLCキャッシュ使用有無による書き込み性能の差](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/32731f62-99a1-7201-c19a-8dd7e14adffa.png "SLCキャッシュ使用有無による書き込み性能の差")
_図3：SLCキャッシュ使用有無による書き込み性能の差_

　SSDは、ホストから書き込まれたデータを複数のNANDフラッシュメモリに振り分けて同時並列でデータを書き込むこと（インターリーブ動作）により高い書き込み性能を実現します。

　図3で仮定したNANDフラッシュメモリチップは一度に64 KB（16 KB x 4プレーン）のデータを書き込めるので、この仕様のNANDフラッシュメモリチップを32チップ搭載したSSDは1回の書き込みレイテンシで2 MB（64 KB x 32チップ）のデータを書き込めます。そこでSLCキャッシュへの書き込みレイテンシを300 usとすると、その書き込み性能は図3のようになります。

　図3に示したSLCキャッシュ使用時の書き込み性能(6,666 MB/s)が、PCIe Gen4x4接続SSDのシーケンシャル書き込みの典型的な最大性能に近いことがわかります。

　ランダムライトでは、多少様子は異なりますが、やはりSLCキャッシュで書き込みを受けている間は高い性能が得られます。

　つまり、ホストからのデータ書き込みをSLCキャッシュで吸収できている間は、シーケンシャルライトでもランダムライトでも、SLCキャッシュの効果である高い性能を得られます。

## 主記憶の寿命消費温存
　SLCキャッシュは、実現方法が疑似SLCの場合は少なくともSLCキャッシュを構成するNANDフラッシュメモリブロックをSLCキャッシュ用として使い続けている限り、当該ブロックの保証書き換え回数が主記憶（TLCやQLC）と比較して多いです。つまり**寿命が長い**です。

　具体的な数値を記載するのは避けますが、SLCキャッシュとして使い続ければ、主記憶と比較して2桁から3桁程度多く書き換え可能です。

　SLCキャッシュは、その容量は最大でもSSD全体の1/3（主記憶がTLCの場合）や1/4（主記憶がQLCの場合）ですが、SLCキャッシュがライトバックキャッシュであれば、ホストからのデータ書き込みをSLCキャッシュで受けている間は主記憶の限られた書き換え回数を消費せずに済んでいる、と言えます。

　一般的にキャッシュは主記憶よりもアクセスされる回数が多くなるので、SLCキャッシュの書き換え回数が主記憶より多いことはまさにキャッシュの条件を満たしています。SLCキャッシュにより、特にQLC NANDのような書き換え回数制約が厳しいメディアを、SSD全体としてカバーしています。

　この効果は、SLCキャッシュがキャッシュであることとSLCキャッシュの寿命面での特徴が活きている、と言えます。

## データ保護
　これまでに説明した通り、SLCキャッシュの書き込みレイテンシはTLC NANDやQLC NANDと比較して短いです。このことは、不意の電源断（"Sudden Power Loss"とか"Unexpected Power Loss"などと呼ばれる）時のデータ保護にも効果があります。

　NANDフラッシュメモリにデータを書き込んでいる最中に不意の電源断が発生すると、NANDフラッシュメモリへの電源供給などが不安定になり、データを書き込んでいたメモリセルの状態が不安定になる、NANDフラッシュメモリの内部動作や状態が不安定になる、などの現象が発生することがあります。それらの現象が発生した場合、ユーザデータや管理データの破損や喪失に繋がる可能性があります。

　SLCキャッシュの書き込みレイテンシは主記憶と比較して短いため、不意の電源断の発生タイミングがNANDフラッシュメモリのデータ書き込みタイミングと重なる可能性が確率的に減ります。

　この効果は、SLCキャッシュの書き込みレイテンシ面での特徴が活きている、と言えます。

# デメリット
　SLCキャッシュのデメリットは、いずれも「主記憶へのライトバック発生」により生じます。逆に言えば、主記憶へのライトバックが発生しなければこれらのデメリットは生じません。

　ここでは、「**データアクセス性能の低下**」「**性能のブレ**」そして「**寿命消費加速**」の3点を説明します。

## データアクセス性能低下
　追い出しアルゴリズムにかかわらず、SLCキャッシュから追い出されたデータは主記憶にコピーしなければなりません（これがライトバック）。

　SLCキャッシュの容量は、主記憶がTLCであれば最大でもSSD容量の3分の1までしか大きくなりません。SSDにそれ以上の容量の有効データを記録するにはライトバックが必要です。例えばTLC NANDフラッシュメモリによる1,000 GBのSSDがあり、SLCキャッシュの最大容量が333 GBの場合、SSD内の有効データサイズが333 GBを超えると一部データが主記憶(TLC)にライトバックされます。

　ライトバックは、SLCキャッシュを構成するNANDフラッシュメモリから対象データを読み出して、主記憶を構成するNANDフラッシュメモリに書き込む、という処理です。データアクセス性能の低下は、このライトバック処理がホストからのデータ書き込み処理を邪魔するために生じます。

　図4は、SLCキャッシュからのライトバックによりホストから見たデータアクセス性能が低下することを示したイメージ図です。

:::note warn
　図4では、ライトバックするデータをNANDフラッシュメモリから読み出す時間は省略しています。また、ホストからSLCキャッシュに書き込むサイズとSLCキャッシュから主記憶にライトバックするサイズはたいてい後者が前者より小さいです。図4では説明を簡単にするために同じ(2 MB)にしています。このあたりも製品によりアルゴリズムが異なります。
:::

![SLCキャッシュから主記憶へのライトバックによるデータアクセス性能低下のイメージ図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/357dc681-5167-21b7-1682-5e90744a952c.png "SLCキャッシュから主記憶へのライトバックによるデータアクセス性能低下のイメージ図")
図4：SLCキャッシュから主記憶へのライトバックによるデータアクセス性能低下のイメージ図

　ライトバックが必要な状況では、SSDはホストからの書き込みを処理する傍らでSLCキャッシュから主記憶へのライトバックを行います。ライトバック対象データをNANDフラッシュメモリに書き込んでいる最中は、ホストから書き込まれたデータをNANDフラッシュメモリに書き込めません。

　このためホストからは、ホストからのデータ書き込みにかかる時間はホストからのSLCキャッシュへのデータ書き込みにかかる時間にSLCキャッシュから主記憶へのライトバックの時間を足したものに見えます。結果的に、図4に示したようにライトバックがない時と比較して大きくデータアクセス性能が低下して見えます。

## 性能のブレ
　ドライブ内の有効データサイズが増えてSLCキャッシュから主記憶へのライトバックが定常的に起こる状態になると、大きな性能のブレを観測することがあります。

　具体的には、ライトバック発生時と非発生時の性能差が大きいことと、ライトバックが必要な状態と不要な状態の間で遷移を繰り返すこと、の2点によりデータアクセス性能の大きなブレとして見えることがあります。図5はこの「性能のブレ」を多少誇張して示したイメージ図です。

![SLCキャッシュ使用時の性能のブレ（イメージ）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/8dd63bc0-54d5-3a41-c19a-894f76d60748.png "SLCキャッシュ使用時の性能のブレ（イメージ）")
図5：SLCキャッシュ使用時の性能のブレ（イメージ）

　図4で示した通り、SLCキャッシュのみにデータを書き込んでいる状態と、SLCキャッシュだけでなくSLCキャッシュからのライトバックにより主記憶にも書き込んでいる状態とでは、書き込み性能に大きな差があります。

　SLCキャッシュからのライトバックを素直に設計・実装してしまうと、ある一定の相対的に低い性能に落ち着くのではなく、この大きな差がある性能を行き来してしまいます。

　図6は、SLCキャッシュからのライトバック処理の素直な設計例です。

![SLCキャッシュからのライトバック処理例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/fe92f3c8-79d2-e6e7-4a7d-89de34f8a4c6.png "SLCキャッシュからのライトバック処理例")
図6：SLCキャッシュからのライトバック処理例

　SLCキャッシュのブロック数が最大になると、SLCキャッシュから何らかのアルゴリズムでブロックを選択し、それらのブロックに記録されている有効データがライトバック対象になります。主記憶がTLC NANDの場合、ライトバック先のブロック（TLCとして使用）を埋めるには少なくともSLCキャッシュ内のブロックが3つ必要です（図6の(A)）。これは、SLCキャッシュとして使用している際はTLC使用時と比較して1/3しかデータを書き込めないためです。実際には3つより多く必要になるケースがほとんどです。そしてライトバック処理が行われます。

　このときホストは、SLCキャッシュへの書き込みと主記憶への書き込みが行われている時の書き込み性能を観測します。

　ライトバック処理が完了するとSLCキャッシュ内のブロック数が3つ減ります（図6の(B)）。その後SLCキャッシュのブロック数が最大になり図6 (A)の状態に戻るまではSLCキャッシュにのみデータを書き込みます。図6 (B)の状態から図6 (A)の状態に戻るまではライトバックは発生しません。

　しかしまた図6の(A)の状態に戻るとライトバックが発生し、ホストが観測する性能が低下します。図5の性能のブレは、この図6の挙動によるものです。

　実際の製品では、じんわり少しずつライトバック処理を行う、ライトバック処理の頻度を調整する、ホストからの書き込み性能を調整する、などの様々な技術を適用しています。性能のブレが小さい、もしくは性能のブレがホストからは観測できないほど短い時間に収められているSSDは優れた製品であると言えます。

　この挙動は、SSDがメディアとしてNANDフラッシュメモリを使用していること、そしてキャッシュにSLCを使用していることが要因です。

## 寿命消費加速
　プロセッサキャッシュ（ライトバックキャッシュ）の場合、キャッシュにのみ記録されている未ライトバックデータは、最終的に（例えば電源断時に）主記憶にライトバックしなければなりません。

　多少異なりますが、同様のことがSLCキャッシュにも当てはまります。SLCキャッシュの場合、SSDの容量ぎりぎりまで有効データを書き込もうとするとSLCキャッシュ内のデータを必ず主記憶にライトバックしなければなりません。

　これは[前回説明した](https://qiita.com/ken-yossy/items/b784f5d96e56fc516fb5)ように、SLCキャッシュはSSDの空き容量を使用しているようなものであり、容量ギリギリまで使う場合はその「空き」がなくなるためです。

　ここで「最後にライトバックするのなら最初にSLCキャッシュに書いたことは無駄ではないのか？」と思われるかもしれません。（一時的に）高い性能が得られたことは無駄ではありません。

　しかし、SLCキャッシュは書き換え回数に制限のあるNANDフラッシュメモリを使用しています。このため、あるデータがSLCキャッシュに書き込まれてその後で主記憶にライトバックされた場合、SLCキャッシュに書き込む際に1回そして主記憶にライトバックする際に1回の合計2回書き換え回数を消費します。最初から主記憶に書き込んでいれば書き換え回数の消費は1回で済みます（図7）。

![SLCキャッシュ使用時にライトバックが発生して同じデータを2回書き込む様子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/263030a7-8e43-a25e-664f-cfcfa750e137.png "SLCキャッシュ使用時にライトバックが発生して同じデータを2回書き込む様子")
_図7：SLCキャッシュ使用時にライトバックが発生して同じデータを2回書き込む様子（追い出すブロックをFIFOで選択する場合）_

　これは明らかに寿命の消費が加速していますのでデメリットであり無駄です。このデメリットは、SLCキャッシュにNANDフラッシュメモリを使用していることが要因です。

　SLCキャッシュからのライトバックをできるだけ行わないことでこの寿命消費加速を抑制可能です。実際の製品では、ライトバック削減のために、ホストから書き込まれたデータをSLCキャッシュに書き込むかどうかをチェックするなどの工夫をしています。

# さいごに
　この記事では、SLCキャッシュの説明2回目として、SLCキャッシュのメリットとデメリットを説明しました。

　具体的には、SLCキャッシュのメリットとして、高いデータアクセス性能、主記憶の寿命温存、そしてデータ保護を挙げて説明しました。またSLCキャッシュのデメリットとして、ライトバック発生時に起こり得る、データアクセス性能の低下、性能のブレ、そして寿命消費加速、を挙げて説明しました。

　SLCキャッシュのデメリットは、いずれもSLCキャッシュからのライトバック発生に起因するものです。つまり、SLCキャッシュのデメリットを抑制するにはライトバックの発生を抑制することが一番の近道です。

　そこで次回の記事では、SLCキャッシュからのライトバックの発生を抑制するにはどうしたらよいか、を含め、SLCキャッシュを上手く活用する方法について説明します。

# ライセンス表記
<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>の下に提供されています。