SSD HOWTO：SLCキャッシュを上手く使う(1/4)

# はじめに
　NANDフラッシュメモリを不揮発性記憶媒体として使用するSolid State Drive（以降SSDと記載）は、SSDコントローラが様々な技術を用いてNANDフラッシュメモリの特性を上手く隠蔽しながら、また時に上手く利用しながら、「データを読み書きする」というストレージ（記憶装置）の機能を実現しています。
 
　SSDが普及するにしたがい、従来ストレージで実現してきた機能をSSDではどのように実現したら良いのか、またSSDに特有の機能をどう使いこなせば良いのか、というノウハウが求められるようになりました。

　そこで、そのような「SSD HOWTO」のいくつかについてまとめたいと思います。

　今回からの記事では、近年のSSDの性能を語る時に欠かせない「SLCキャッシュ」について、寿命や信頼性の観点も含めてまとめます。

# まとめ

* SLCキャッシュの容量は固定もしくは動的に確保する方式が主流
* SLCキャッシュの容量が大きければその効果も大きく、性能だけでなく寿命や信頼性でも効果を得られる場合がある
* SLCキャッシュの容量は、ドライブの空き容量を確保する、容量クリッピングを行う、メーカー製ソフトウェアを使う、などで増やすことが可能

# SLCキャッシュとその利用メリット

　今やクライアント向けおよびコンシューマ向けSSDでは当たり前のように搭載されているSLCキャッシュは、TLCやQLCなどの多値記録可能なNANDフラッシュメモリをSLC（2値記録）として使用し、多値記録時と2値記録時の読み書きレイテンシ差を利用してキャッシュを実現する機能です。技術的な詳細は[別記事](https://qiita.com/ken-yossy/items/b784f5d96e56fc516fb5)にまとめましたのでそちらをご参照ください。

　ホストからの書き込みをSLCキャッシュで吸収できる、ホストから書き込まれるデータのサイズと比較してSLCキャッシュから追い出されるデータのサイズが小さい、などのワークロードに依存しますが、SLCキャッシュを利用することで以下のメリットを得られます。

1. 高い読み書き性能
1. SSDの寿命消費速度緩和
1. 多値記録時よりも高いデータ信頼性

　クライアント向けおよびコンシューマ向けSSDでは上記1と2が製品仕様上とても重要であるため、SLCキャッシュが搭載されています。

# SLCキャッシュの制御方式

　本題に入る前に「SLCキャッシュの制御方式」をまとめます。なぜなら、SLCキャッシュは制御方式によりその挙動が大きく変わるため、効果を最大限に引き出すには「制御方式に合わせた使いかた」が必要だからです。

　SLCキャッシュの挙動を特徴づける項目には大きく4つあります。それは、容量、データ、追い出し処理の契機、そして追い出しアルゴリズム、です。

:::note warn
この記事では代表的なものを示します。ここに示した項目や方式以外にも、各メーカーおよび製品に特有の項目の存在や方式の実装が考えられます。その場合、SLCキャッシュの特性も変化します。
:::

_表：SLCキャッシュの挙動を特徴づける項目と代表的な制御方式_
| 項目| 代表的な制御方式 | 概要 |
|-:|:-|:-|
| 容量  | 静的 | 静的に容量を確保して使用  |
|   | 動的  | データ量に応じて容量を増減  |
| 記録データ  | 何でも  | 区別なし  |
|   | 小サイズのみ  | 一定サイズ未満  |
|   | 特定データのみ | 何らかの法則で決定 |
| 追い出し契機 | 容量 | （残）容量のみで判断 |
|                   | アイドル時 | アイドル時に積極的に実施 |
| 追い出しアルゴリズム | Least Recently Used (LRU) | アクセス頻度が少ない順 |
|                     | First-In-First-Out (FIFO) | 記録された時刻が古い順 |

　今回の記事では、上記の表に記載した項目のうち「容量」について、方式の内容とSLCキャッシュを上手く使う方法をまとめます。

# SLCキャッシュの容量制御方式
　SLCキャッシュの容量の制御方式には主に静的方式と動的方式があります。

　静的方式は、例えばOver Provisioning (OP)から一定のサイズを常に（＝静的に）SLCキャッシュに割り当てる方式です（図1）。OPはあくまで余剰領域ですので（[別記事](https://qiita.com/ken-yossy/items/3292f8930b27076a009f)参照）、容量をあまり大きくできません。

![容量静的方式のSLCキャッシュ（動作イメージ）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/bf54a538-b9c0-0681-7d68-2837487ff856.png "容量静的方式のSLCキャッシュ（動作イメージ）")
_図1：容量静的方式のSLCキャッシュ（動作イメージ）_

　SLCキャッシュにデータを記録していき容量分たまると（図1 (1)から(3)まで）、データの追い出しを実行してSLCキャッシュの空きを作ります（図1 (4)）。追い出されたデータは多値記録で記録されます。
 
　この図1のSSDが搭載するNANDフラッシュメモリをTLC NANDだと仮定し、SLCキャッシュにOPから21 GB分を割り当てたとすると、SLCキャッシュに記録できる実データサイズは最大でもその1/3の7 GBです。SLCキャッシュのサイズが大きくならないことは、逆に管理しやすくなるなどのメリットにもなり得ます。

　これに対して動的方式は、ユーザ領域の空きを「動的に」SLCキャッシュに割り当てる方式です。ドライブの空き容量が大きいと、その分だけSLCキャッシュを大きくできます。逆に、ドライブの空き容量が小さいとSLCキャッシュに割ける容量が小さくなります。「最大容量」は製品容量の1/3（TLC NANDの場合）や1/4（QLC NANDの場合）です。

![動的容量方式のSLCキャッシュ（動作イメージ）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/0960dbaf-1be4-7553-258c-4803fbb599b3.png "動的容量方式のSLCキャッシュ（動作イメージ）")
_図2：動的容量方式のSLCキャッシュ（動作イメージ）_

　静的方式とは容量確保方法が異なるのみで動作はほぼ同じです。SLCキャッシュにデータを記録していき最大容量分たまると（図2 (1)から(3)まで）、データの追い出しを実行してSLCキャッシュの空きを作ります（図2 (4)）。追い出されたデータは多値記録で記録されます。ドライブの空き容量に応じてSLCキャッシュの最大容量を段階的に決定するなど、製品により挙動には違いがあります。

　一般的に、ドライブの空き容量が多い時は動的方式のほうがSLCキャッシュの（最大）容量をより大きくできるためSLCキャッシュの高い性能を長い期間得ることができます。一方、ドライブの空き容量が小さい時は静的と動的のどちらでも同じような性能になることが予想されます。
 
# 容量の視点でSLCキャッシュを上手く使うには

　「容量」の視点でSLCキャッシュを上手く使うには、とにかく「SSDの空き容量を十分に確保する」ことが重要です。特に動的容量方式の場合は空き容量が大きければ大きいほどSLCキャッシュを「伸ばす」ことができます。
 
　**これが、私が「SSDはできるだけ容量の大きい製品がオススメ」と言う理由のひとつです。**

　ドライブの空き容量は、例えばWindowsであればドライブのプロパティで確認可能です（図3）。
 
![Windowsでのドライブプロパティダイアログ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/c2b5466d-c673-8c9b-b74f-87c8315c99c6.png "Windowsでのドライブプロパティダイアログ")
_図3：Windowsでのドライブプロパティダイアログ_

　一概に「これだけ容量を確保しておけばよい」と言う値や割合はありませんが、空き容量はこまめにチェックしたほうが良いです。

　また静的容量方式の場合、OPサイズを大きくするとSLCキャッシュのサイズを大きくできる可能性があります。
 
　具体的には、ユーザが使える容量を小さくすることでOPサイズを大きくしてSLCキャッシュに割り当て可能な容量を増やす、というものです。例えば「容量1 TBのSSDを容量800 GBに減らすことで200 GBをOPに回す」というものです。**ただし、OPサイズを増やしてもSLCキャッシュに使われる容量が増えるとは限りません（製品依存）。**

![容量クリッピングによるSLCキャッシュサイズ増加イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/5e8dc77d-e236-61cb-e56f-4eb6fde62f8e.png "容量クリッピングによるSLCキャッシュサイズ増加イメージ")
_図4：容量クリッピングによるSLCキャッシュサイズ増加イメージ_

　この方法はハードディスクドライブ(HDD)の時代から使われてきたものであり、「容量クリッピング(capacity clipping)」などと呼ばれます。HDDではこの方法を、アクセスに時間のかかるディスク内周部がデータの記録に使われないようにする目的などで使用しています。

　このOPサイズを増やす方法はドライブの空き容量を増やすことにも繋がりますので、静的容量方式だけでなく動的容量方式でも効果があります。

　一部のSSDはメーカーが配布するソフトウェアによりOPサイズの設定が可能です。Samsung製品ではSamsungの[Magicianソフトウェア](https://semiconductor.samsung.com/jp/consumer-storage/magician/)で、CrucialおよびMicronブランドの製品では[Storage Executive](https://www.crucial.com/support/storage-executive)で、OP容量の設定が可能です。

　そしてSLCキャッシュの容量が（だいたいでも）わかる場合、一度に書き込むデータのサイズをSLCキャッシュの容量程度に抑える、頻繁に書き換えるデータのサイズをSLCキャッシュの容量程度に抑える、などの工夫をすると、冒頭で説明した「書き込みをSLCキャッシュで吸収」や「SLCキャッシュから追い出されるデータの容量削減」を実現しやすくなり、SLCキャッシュの効果を得やすくなります。

　これは一般的なキャッシュと同様に「なるべくデータがキャッシュに載るようにする」という工夫をSLCキャッシュで実現するものです。

# SLCキャッシュサイズを増やすと寿命にも利点がある

　以上の通り、ドライブ容量を増やすなどしてSLCキャッシュとして使える容量を増やすことで、SLCキャッシュをより上手く活用できます。

　SLCキャッシュのメリットとしてわかりやすいのは高い性能ですが、SLCキャッシュとして使える容量を増やすことで製品寿命や信頼性の視点でもメリットがあります。

　SLCキャッシュをライトバックキャッシュとして構成しSLCキャッシュ内で書き込みの多くを吸収できるようにすると、結果的にTLCやQLCなど書き換え回数制約のある多値記録の回数を減らすことができます。
 
　NANDフラッシュメモリ（ブロック）の寿命や信頼性について各記録方法（2値記録と多値記録）が独立に寄与するとは限らないのですが、一般的に2値記憶したほうが寿命消費速度緩和やより高い信頼性を実現可能です。

　もちろんSSDは工業製品として製品スペックに記載された寿命や信頼性を満たすものが出荷されます。ただ、特定の使いかた専用というものではありません。一方で、製品の信頼性と直接結びつけて説明されることがあまりないSLCキャッシュという機能でもその使いかたを使用状況に合わせて工夫することで、ドライブをより信頼性の高い状態で運用できます。これはユーザによる工夫の余地があるという点でも重要です。

　ただし、ベンチマーク結果で良く見られるように、SLCキャッシュの容量を使い果たすと性能は大きく低下します。実は、SLCキャッシュの容量を使い果たしてしまうと上記寿命や信頼性のメリットを得られないどころか逆に悪化する可能性すらあります。

　このため、SLCキャッシュが有効なSSDを使用する場合、SLCキャッシュの容量に合わせた使いかた、つまり(1)容量の大きいSSDを使うなどしてSLCキャッシュの容量を大きくする、(2)一度に書き込むサイズをSLCキャッシュの容量以下に抑える、(3)頻繁に書き換えるデータのサイズをSLCキャッシュの容量に抑える、という工夫が重要です。

# おわりに

　この記事では、SSDをより良く使用するためのノウハウのひとつとして、SLCキャッシュの活用方法特に「容量」の視点で見た活用方法をまとめました。

　NANDフラッシュメモリを使用したSSDにおいて、高性能とTLCやQLC NANDフラッシュメモリの活用を両立するためには、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>の下に提供されています。