SLCキャッシュ(1/3)：仕組みとポイント

# はじめに
　NANDフラッシュメモリを搭載したSSD（以降SSD）を使用している、もしくはSSDの性能について調べたことがある、という方であれば、「SLCキャッシュ（SLC Cache、メーカーによりTurbo Writeなどと呼ぶこともある）」という機能をご存知だと思います。

　SLCキャッシュという技術を端的にまとめると、「**SLC NAND以外のNAND（TLCなど多値NAND）を不揮発性記憶媒体とするSSDにおいてSLC (NAND)をキャッシュにして、データ読み書き性能向上や寿命長期化を図る技術**」となります。

　NANDフラッシュメモリがTLC、QLCと多値度を増すにつれてその読み書き時間が長くなる中、高まり続けるSSDへの性能要求に応え続けられたのはSLCキャッシュのおかげです。

　そこで、今回の記事でSLCキャッシュの仕組みを説明し、次回以降の記事でSLCキャッシュのメリットとデメリット、SLCキャッシュの効果を得られる使いかたと得られない使いかた、を説明します。

:::note warn
この記事の内容はSLCキャッシュのごく基本的な仕組みです。実製品ではメーカー独自の工夫が加えられることが多く、細部においてこの記事の内容と異なることがあり得ますのでご注意ください。
:::

# まとめ
* SLCキャッシュは、一般的なキャッシュの性質を備え、SSDが搭載するNANDフラッシュメモリの一部で実現される
* 通常のキャッシュと異なり、SLCキャッシュからのデータ追い出しと容量復活処理が重要な鍵を握る

# SLCキャッシュが機能する理由
　SLCキャッシュは、その名の通り、コンピュータアーキテクチャの教科書で言うところの「キャッシュ」の性質を持ちます。

　図1は、SSD内部でのユーザデータに対するメモリ階層を、L1キャッシュとL2キャッシュと主記憶(DRAM)から構成されたプロセッサと対比させたものです。SSDの場合、L1キャッシュがSRAMやDRAM、L2キャッシュがSLCキャッシュ、主記憶がTLCやQLCのNANDとなります。

:::note warn
図1は説明用に簡略化したもので実際には様々な構成があることにご注意ください。またここでのレイテンシは「単位データあたりのレイテンシ」ではなく、Readなら最初のデータが出始めるまで、Writeなら1単位の書き込みが完了するまで、です。
:::
:::note
SRAMとDRAMのレイテンシは[こちらの記事](https://qiita.com/zacky1972/items/e0faf71aa0469141dede)を参考にさせていただきました。
:::
![プロセッサのメモリ階層とSSD内部のメモリ階層の比較](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/e3108d67-0518-2195-c410-3dc711feb6a3.png "プロセッサのメモリ階層とSSD内部のメモリ階層の比較")
_図1：プロセッサのメモリ階層とSSD内部のメモリ階層の比較_

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

　同じく図1のように、SSD側の階層間レイテンシ差はReadとWriteで異なります。この **ReadとWriteのレイテンシ差の違いがSSD（というかNANDフラッシュメモリ）の大きな特徴です**。 Writeのレイテンシ差が大きいため、**キャッシュの効果が最大になるのはWriteをキャッシュで吸収できた時**です。

# キャッシュ割り当て
　プロセッサの（命令、データ）キャッシュの割り当て方法には、大きく分けてダイレクトマップ、フルアソシアティブ、セットアソシアティブ、の3つの方式があります。

　キャッシュ内での割り当て場所が、ダイレクトマップはアドレスなどから一意に決まる、フルアソシアティブはどこでも良い、セットアソシアティブは前記2方式を併用する方式です。

　SLCキャッシュは、一般的に**フルアソシアティブ**を採用します。その理由は、**SLCキャッシュがNANDフラッシュメモリで実装されるから**です。

　ご存知の通り、NANDフラッシュメモリはページ単位でデータの書き込みを行います。そして書き込み先のページをランダムには選択できず、ページ番号の昇順で書き込まなければなりません（図2）。

![NANDフラッシュメモリのデータ書き込み順序制約](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/77f8a3cc-53dc-c32f-2f2d-ed38a3d66829.png "NANDフラッシュメモリのデータ書き込み順序制約")
_図2：NANDフラッシュメモリのデータ書き込み順序制約_

　このため、キャッシュがNANDフラッシュメモリで構成されるSLCキャッシュの場合、キャッシュ内でランダムなデータ書き込みが必要なダイレクトマップとセットアソシアティブの両方式は実装が難しく、また実装してもキャッシュに期待される効果（性能向上）を実現できません。このような点から、SLCキャッシュではフルアソシアティブが一般的です。

　フルアソシアティブでのキャッシュ割り当てアルゴリズムはシンプルで、かつ「キャッシュのどこにどのデータが格納されているのか」の管理コストも、管理テーブルの扱いに注意すればSLCキャッシュの効果に十分見合うもので済みます。

# キャッシュフィル
　ここからはフルアソシアティブのSLCキャッシュを仮定します。

　キャッシュフィル動作はとてもシンプルです……が、キャッシュフィルはRead-Modify-Writeが必要な場合にのみ行われることが多いです（図3）。

![SLCキャッシュのキャッシュフィル動作](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/8a674bb3-f6f1-8198-5d43-594b4e049dce.png "SLCキャッシュのキャッシュフィル動作")
_図3：SLCキャッシュのキャッシュフィル動作_

　プロセッサのキャッシュであれば、プロセッサが主記憶から読み出したデータもキャッシュに書き込む方式が一般的です。これをSSDとSLCキャッシュに当てはめると、ホストから受領したReadコマンドに対してTLCやQLC NANDから読み出したデータをSLCキャッシュに書き込む、という動作になります。

　……お気づきでしょうか。SLCキャッシュが有効なSSDがプロセッサのキャッシュ同様この動作をしてしまうと、**ひたすらReadするだけでSSDの寿命を使い果たしてしまいます**（詳細は記載しません）。

　このため、ホストがReadしたデータは通常SLCキャッシュには書き込みません。

# ライトバック
　最初に説明した通り、SLCキャッシュの効果が最大限発揮されるのはホストからのWriteをSLCキャッシュで吸収できた時です。そして可能な限り主記憶（TLCやQLC NAND）へのライトバックは行いたくありません。

　そもそもSLCキャッシュがライトスルー方式で実装されることは少ないです。

　キャッシュが揮発性メモリで構成されている場合は、ライトスルー方式により例えば電源断時のデータ消失被害軽減が図れます。しかし、SLCキャッシュはNANDフラッシュメモリつまり不揮発性メモリですので書き込んでしまえば電源が切れてもデータは保持可能です。

　その上、主記憶（TLCやQLC NAND）も書き換え回数に制約があるNANDフラッシュメモリですから、できるだけ主記憶への書き込み回数も減らすことが望ましいです。

![SLCキャッシュの構造とライトバックのイメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/4f09b1d1-8603-06dc-68a2-ad96d7788c83.png "SLCキャッシュの構造とライトバックのイメージ")
_図4：SLCキャッシュの構造とライトバックのイメージ_

　以上のことから、SLCキャッシュは一般的に図4のようなFIFOで構成されます。

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

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

　この追い出し処理はほぼGarbage Collection (GC)と同様の処理になります。このため、SLCキャッシュからの追い出し処理のアルゴリズムは、メーカーや製品により大きく異なります。

:::note warn
（2023年5月20日更新）図4や上記説明では、SLCキャッシュからの追い出し（ライトバック）をFIFOの出口からのみ行うように記載していますが、実際のアルゴリズムは多種多様です。

　キャッシュとしての機能を優先する場合、SLCキャッシュ内のブロックをLRU (Least Recently Used)などで管理して追い出すブロックを決定する方法があります。

　また、追い出し時の処理（データコピー）の効率を優先する場合、有効データが少ないブロックを追い出す方法があります。

　そしてSLCキャッシュのバッファとしての機能を優先した場合、図4のように単純にFIFOの出口から追い出す方法があります。
:::

# SLCキャッシュの実体
　SLCキャッシュを調達する最も簡単な方法はキャッシュ用SLC NANDフラッシュメモリをSSDに搭載する方法ですが、それではコストなどの点で製品として成立させるのが難しいです。

　そこで、一般的には **「疑似SLC (Pseudo SLC)」** などと呼ばれる技術を使います。この技術は **「TLC NANDやQLC NANDをSLC NANDのように使用してSLC NANDに匹敵する読み書き性能や寿命を実現する」** というものです。最近のSLCキャッシュは、ほぼ全てこの疑似SLCで実装されているはずです。ただし、疑似SLCはあくまでSLCキャッシュの実現方法の一部であり「SLCキャッシュ≠疑似SLC」であることにご注意ください。

　この疑似SLC技術により、SLC NANDフラッシュメモリそのものを搭載していなくてもSLCキャッシュが実現可能です。

# SLCキャッシュの容量
　SLCキャッシュを特徴づけるパラメータの筆頭は「SLCキャッシュの容量」です。具体的なイメージで言うと、**図4内のSLCキャッシュのブロック数を何個まで許容するか**になります。

　これには大きく分けて2つあります。ひとつは「**可能な限りSLCキャッシュを大きくする**」というもので、もうひとつは「**SLCキャッシュの最大容量を規定する**」というものです。

　どちらも最大容量で規定している点で似ているように見えますが、前者は相対的な比較でかつ動的にサイズが変わり得るのに対し、後者は例えば「100 GB」などと固定サイズとなる点が異なります（後者でも状況に応じてサイズを変えることもあり得る）。

　どちらの場合でも、SLCキャッシュは主記憶がTLCなら3倍（QLCなら4倍）の容量を消費しますので、主記憶として使用している容量に応じてSLCキャッシュとしての最大容量が決まります。言い方をかえると、「**SLCキャッシュはSSDの空き容量を活用している**」 と言えます。

![SSD容量とSLCキャッシュ容量の関係](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/fc295305-8ec6-919c-8f42-92b1693c3ac3.png "SSD容量とSLCキャッシュ容量の関係")
_図5：SSD容量とSLCキャッシュ容量の関係_

　図5 (A)は主記憶がゼロの場合です。この場合、理論上SLCキャッシュの容量は333 GBまで拡大可能です。しかし、図5 (C)のように主記憶に700 GBのデータが記録されている場合はSLCキャッシュの容量は最大100 GBとなります。

# SLCキャッシュの容量復活
　そしてSLCキャッシュに特徴的な動作が「容量復活処理」です。

　図6 (A)は、SLCキャッシュの容量が100 GB、主記憶の容量が400 GB、空き容量がTLC換算で300 GBという状態のSSDを示しています。この状態からSLCキャッシュに記録されている60 GBのデータを主記憶に移動させたものが図6 (B)です。SLCキャッシュから主記憶へのデータの移動のみで空き容量が増えています。これはSLCキャッシュがTLC換算で3倍の容量を占めているためです（60 GB x 2 = 120 GBの容量が開放された）。

![SLCキャッシュの容量復活](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/a3427d60-43f9-3618-392a-fc4c9c4bb0ed.png "SLCキャッシュの容量復活")
_図6：SLCキャッシュの容量復活_

　図6のSSDが「SLCキャッシュの最大容量が100 GB」設定の場合、図6（A)ではもうSLCキャッシュを拡大できませんが、図6 (B)では再び60 GB分SLCキャッシュとして使用可能です。

　また図6のSSDが「可能な限りSLCキャッシュを大きくする」設定の場合も、図6 (A)ではSLCキャッシュとしての利用可能容量は残り100 GBですが、図6(B)では140 GBです。

　これがSLCキャッシュの容量復活処理です。このSLCキャッシュの容量復活処理はSSDにより大きく異なります。主な違いは「SLCキャッシュの容量復活処理をSSDのアイドル時などに積極的に行うか否か」です。

　SLCキャッシュを備えるか否かも含めてタイプ分類すると図7のようになります。

![SLCキャッシュの容量復活処理によるSSDの分類](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/7c632a8f-69c0-997b-33ab-9f63ab616549.png "SLCキャッシュの容量復活処理によるSSDの分類")
_図7：SLCキャッシュの容量復活処理によるSSDの分類_

　図7のタイプAからCまでの3タイプにそれぞれメリットとデメリットがあり、各メーカー、各製品の特徴が色濃く反映されます。メリットとデメリットの詳細は次回の記事で説明します。

# その他動作を決めるパラメータ
　これまでに説明した他にも、SLCキャッシュの動作を決めるパラメータにはメーカーや製品により様々なものが存在します。例えば以下のようなパラメータが考えられます。

* ホストからのWriteデータをSLCキャッシュに書くか直接主記憶に書くかを決める何らかの閾値
* SLCキャッシュへの書き込みを一旦停止するスイッチ
* SLCキャッシュに特定LBA範囲のデータのみ書き込む設定

# さいごに
　SLCキャッシュは、SSDに求められる高い性能を実現するためには欠かせない技術です。

　SLCキャッシュは、NANDフラッシュメモリで構成され、コンピュータアーキテクチャの教科書で言う「キャッシュ」の性質を持ちます。このため仕組みと動作を正しく理解しないとSLCキャッシュの存在がSSDの性能低下を招くことや寿命消費を早めることがあります。

　今回の記事では、SLCキャッシュの仕組みとその動作を決めるポイントを説明しました。

　SLCキャッシュの有無やこの記事で説明したようなSLCキャッシュの構成などは、SSDのカタログには通常記載されません。必要に応じてメーカーへの問い合わせが必要です。

　次回の記事では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>の下に提供されています。