SLCキャッシュ(3/3)：使いかたの向き不向き

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

　そこで最後となる今回は、SLCキャッシュに向く使いかたと向かない使いかた、言い替えると「SLCキャッシュのメリットを引き出してデメリットの影響を抑えるにはSSDをどのように使えば良いのか」ということを説明します。

　具体的には以下の2点がポイントになります。それぞれ1回目と2回目の記事で少しだけ触れました。

1. SLCキャッシュは「キャッシュ」の性質を持つため一般的なキャッシュが得意なアクセスがよい
1. SLCキャッシュのデメリットはライトバック発生時に生じるのでライトバックの発生を抑えればよい

　なお最近のSSDでは、SLCキャッシュの名称やアルゴリズムそして挙動はメーカーや製品により多種多様です。検討しているSSDがSLCキャッシュ機能を有するのかどうか、機能オンオフの可否、そして内部アルゴリズムなどの詳細については、各メーカーにお問い合わせください。

# まとめ
* SLCキャッシュに向く使いかたの特徴は以下の3点
    1. フットプリントがSLCキャッシュの最大サイズ以下
    1. アクセス先LBA領域に偏りがある
    1. アイドル時間がある（多い）
* コンシューマ向けPCでは上記2と3を満たすためSLCキャッシュの効果を得やすい
* 「SLCキャッシュに向かない使いかた」は上記の逆

# 復習：SLCキャッシュの仕組みと構成
　図1は、SSD内部でのユーザデータに対するメモリ階層を示したイメージ図です（1回目の記事から再掲）。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キャッシュのイメージ図です（これも1回目の記事からの再掲）。

![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キャッシュに向く使いかた
## 1. フットプリントが最大サイズ以下
　それでは本題に移ります。一般的なキャッシュにおいてその効果を継続して得る第一の条件は、「**フットプリントがキャッシュサイズに収まること**」です。これをSLCキャッシュに置き換えると「**データ書き込みのフットプリントが最大SLCキャッシュサイズに収まること**」となります。

　「フットプリント」という言葉はあまり馴染みがないかもしれません。ここでのフットプリントとは、ホストからSSDに書き込まれるデータがLBA空間上で占める正味領域サイズ、を意味します（図3）。

:::note warn
一般的なキャッシュのフットプリントでは書き込みだけでなく読み出しも考慮します
:::

![様々なアクセスパターンとフットプリント](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/9208d99d-4464-0615-930b-007c2c791782.png "様々なアクセスパターンとフットプリント]")
_図3：様々なアクセスパターンとフットプリント_

　ホストは同じLBA（セクタ）のデータを何度も書き替えます（更新）。しかしフットプリントではこの更新分を考慮しません。同じセクタを100回更新してもフットプリントとしては1セクタ分しかカウントしません。このため、図3に示したように、フットプリントはLBA空間上の領域サイズになります。書き込んだ実データサイズ（総データサイズ）ではありません。

　このフットプリントがSLCキャッシュの最大サイズに収まれば、同じセクタを何度更新してもその更新はSLCキャッシュ内で完結してライトバックによる主記憶へのコピーが発生しません。ライトバックが発生しないため常にSLCキャッシュの効果を得られることになります。

## 2. アクセス先LBA領域に偏りがある
　とはいえ、主記憶がTLCの場合SLCキャッシュは最大でもSSD容量の3分の1です。TLCで1 TBのSSDであればSLCキャッシュのサイズは最大でも300 GB強です。1 TBのSSDを購入して300 GB（フットプリントで300 GB）しか使わない、というのは現実的ではないと思います。

　SLCキャッシュの最大サイズよりも広いLBA領域を使用する場合、アクセス先LBA領域に偏りがあればSLCキャッシュの効果を得やすくなります。これは「良く更新される（更新頻度の高い）LBA領域」と「あまり更新されない（更新頻度の低い）LBA領域」が存在するアクセスパターンを指します。

　このアクセスパターンが有望である理由は、「更新頻度が高いLBA領域」のフットプリントがSLCキャッシュの最大サイズよりも小さければ、そのLBA領域へのアクセスがSLCキャッシュにヒットし続けると期待できるためです（図4）。この更新頻度が高いLBA領域のデータのことを「**ホットデータ**」、そして更新頻度が低いLBA領域のデータのことを「**コールドデータ**」と呼ぶこともあります。

![更新頻度の異なるLBA領域が存在する例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/b9706221-cfa0-c695-471f-7bda58480538.png "更新頻度の異なるLBA領域が存在する例")
図4：更新頻度の異なるLBA領域が存在する例

　ファイルシステムを使用する環境では、ストレージのLBA空間の使いかたをファイルシステムが決定します。コンシューマ向けPCでSLCキャッシュの効果を得やすい理由のひとつは、Windowsなどのオペレーティングシステムで使われる一般的なファイルシステムにこの偏りが存在することです。

## 3. アイドル時間がある
　フットプリントがSLCキャッシュの最大サイズよりも広い場合、どこかでライトバックが発生してしまいます。

　前回説明したように、ライトバックはバックグラウンドで行われる処理であり、ホストはライトバックがいつ行われているかを知ることができず、ホストからの書き込みとライトバックが重なりホストからの書き込み処理が待たされるとホストからは性能が低下したように見えます。

　逆に言うと、たとえライトバックが発生している状況でもホストからの書き込みとライトバックが重ならなければ、ホストからはライトバックによる性能低下が見えません（図5）。つまり、ライトバックが十分に実行できる程度の時間だけホストから書き込みが行われない「空き時間（アイドル時間）」があれば良い、と言えます。

![アイドル時間にライトバック処理を行う様子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/e2fa3d41-e196-af9a-55b4-9bf02089049c.png "アイドル時間にライトバック処理を行う様子")
図5：アイドル時間にライトバック処理を行う様子

　SSDコントローラにより異なりますが、特に第1回の記事で説明した「積極的にSLCキャッシュを空ける」タイプのSSDでは、このアイドル時間を検出して積極的にライトバック処理を行いSLCキャッシュの空き容量を回復することが多いです。

　コンシューマ向けPCは人間が操作するため、その時間解像度はSSDの内部処理との比較では十分に粗くまたアイドル時間も相当あると考えられます。このことからも、コンシューマ向けPCではSLCキャッシュの効果を得やすいと言えます。

# SLCキャッシュに向かない使いかた
 　SLCキャッシュに向かない、SLCキャッシュの効果を得にくい、さらに言えばSLCキャッシュの存在がデメリットになる使いかたは、**上記「SLCキャッシュに向く使いかた」の逆**になります。わかりやすいです。

　まず、SLCキャッシュはSSDの空き容量を使うため、SSDの残容量が減るとSLCキャッシュの効果を得にくくなります。特にSSDの容量をギリギリまで使う場合は、SLCキャッシュの容量を確保できないためSLCキャッシュの効果を得られません。

　SLCキャッシュの有効・無効を切り替えられるSSDは少ないため、SSDを容量ギリギリまで使うことはできるだけ避けるべきです。

　次に、「アクセス先LBA領域に偏りのない使いかた」も適しません。具体的には、SSDをLBA領域の先頭から末尾までひたすら書き込んでまた先頭に戻り書き続ける、データロガーや監視カメラのような使いかたです。

　条件の一部は「容量をギリギリまで使う」と被りますが、まんべんなく書き込む（アクセスする）使いかたはキャッシュが苦手とする使いかたですので、SLCキャッシュにおいてもこの使いかたでは効果を得られません。

　そして最後に「アイドル時間のない使いかた」つまり「ひたすら書き込む使いかた」です。この使いかたではライトバック処理を「隠す」時間を確保できないため、フットプリントがSLCキャッシュの最大サイズ未満でない限りライトバック処理のためにホストから見える性能が低下します。

　上記の特徴にひとつでも当てはまる場合には、SLCキャッシュを使用してもSLCキャッシュの効果を得られないどころか逆にSLCキャッシュのデメリットを被る結果となります。とはいえ使いかたを変える（≒ファイルシステムなどのソフトウェアを変更する）のは難しいことが多いので、その場合はそもそも**SLCキャッシュを使わない**ことで防ぐことが可能です。

　なお、SLCキャッシュの有効無効を切り替えられるかどうかはメーカーにお問い合わせください。

# さいごに
　SLCキャッシュに関する一連の記事の最後として、今回の記事ではSLCキャッシュに向く使いかたと向かない使いかたをまとめました。

　SLCキャッシュに向く使いかたとして紹介した特徴のうち「アクセス先LBA領域に偏りがある」と「アイドル時間がある」という2つは、まさに私たちが日々使うようなコンシューマ向けPCでのSSDの使いかたであり、これがコンシューマ向けSSDでSLCキャッシュが重要になる理由です。

　一方、上記特徴にあてはまらない使いかたはエンタープライズ、データセンター、そしてインダストリアル機器で良く見られ、それらの市場向けSSDではSLCキャッシュ機能を持たない製品も存在します。

　そもそもSSDは使いかたが寿命まで左右するデバイスです。SLCキャッシュという機能もSSDの使いかたひとつでメリットにもデメリットにもなる機能であることをご理解いただければと思います。

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