この記事で紹介している製品
おことわり
この記事は、2023年5月にQiitaに投稿した記事を加筆修正したものです。
また、この記事のオリジナルは日本語で書かれています。記事が日本語以外の言語で表示されている場合、それは機械翻訳の結果です。当社は機械翻訳の精度に責任を負いません。
はじめに
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キャッシュの効果を得られる使いかたと得られない使いかた、を説明します。
なお、この記事の内容はSLCキャッシュのごく基本的な仕組みです。実製品ではメーカーが独自の工夫を加えることが多く、細部においてこの記事の内容と異なることがありますのでご注意ください。
まとめ
- SLCキャッシュは、一般的なキャッシュの性質を備え、SSDが搭載するNANDフラッシュメモリの一部で実現される
- 通常のキャッシュと異なり、SLCキャッシュからのデータ追い出しと容量復活処理が重要な鍵を握る
SLCキャッシュが機能する理由
SLCキャッシュは、その名のとおり、コンピュータアーキテクチャの教科書でいうところの「キャッシュ」の性質を持ちます。
図1は、SSD内部でのユーザデータに対するメモリ階層を、L1キャッシュとL2キャッシュと主記憶(DRAM)から構成されたプロセッサと対比させたものです。SSDの場合、L1キャッシュがSRAMやDRAM、L2キャッシュがSLCキャッシュ、主記憶がTLCやQLCのNANDとなります。
なお、図1は説明用に簡略化したもので実際には様々な構成があることにご注意ください。またここでのレイテンシは「単位データあたりのレイテンシ」ではなく、Readなら最初のデータが出始めるまで、Writeなら1単位の書き込みが完了するまで、です。
また、SRAMとDRAMのレイテンシはこちらの記事を参考にさせていただきました。
図1のように、SLCキャッシュはSSD内部の主記憶であるTLC NANDやQLC NANDとSLCの読み書きのレイテンシ差を利用して構成されたキャッシュです。
同じく図1のように、SSDの階層間レイテンシ差はReadとWriteで異なります。この ReadとWriteのレイテンシ差の違いがSSD(NANDフラッシュメモリ)の大きな特徴です。 Writeのレイテンシ差が大きいため、SLCキャッシュの効果が最大になるのはWrite処理をSLCキャッシュで吸収できたときです。
キャッシュ割り当て
プロセッサのキャッシュの割り当て方法には、大きく分けてダイレクトマップ、フルアソシアティブ、セットアソシアティブ、の3つの方式があります。
キャッシュ内での割り当て場所について、ダイレクトマップはアドレスなどから一意に決まる、フルアソシアティブはどこでも良い、セットアソシアティブは前記2方式を併用する方式です。
SLCキャッシュは、一般的にフルアソシアティブを採用します。その理由は、SLCキャッシュがNANDフラッシュメモリで実装されるからです。
ご存知のとおり、NANDフラッシュメモリはページ単位でデータを書き込みます。そして書き込み先のページをランダムには選択できず、ページ番号の昇順で書き込まなければなりません(図2)。
このため、キャッシュがNANDフラッシュメモリで構成されるSLCキャッシュの場合、キャッシュ内でランダムなデータ書き込みが必要なダイレクトマップとセットアソシアティブの両方式は実装が難しく、また実装してもキャッシュに期待される効果(性能向上)を実現できません。このような点から、SLCキャッシュではフルアソシアティブが一般的です。
フルアソシアティブでのキャッシュ割り当てアルゴリズムはシンプルで、かつ「キャッシュのどこにどのデータが格納されているのか」の管理コストも管理テーブルの扱いに注意すればSLCキャッシュの効果に十分見合うもので済みます。
キャッシュフィル
ここからはフルアソシアティブのSLCキャッシュを仮定します。
キャッシュフィル動作はとてもシンプルです。しかし、キャッシュフィルはRead-Modify-Writeが必要な場合にのみ行われることが多いです(図3)。
プロセッサのキャッシュであれば、プロセッサが主記憶から読み出したデータもキャッシュに書き込む方式が一般的です。これをSSDとSLCキャッシュに当てはめると、ホストから受領したReadコマンドに対してTLCやQLC NANDから読み出したデータをSLCキャッシュに書き込む、という動作になります。
お気づきでしょうか。SLCキャッシュが有効なSSDがプロセッサのキャッシュ同様この動作をしてしまうと、Readし続けるだけでSSDの寿命を使い果たしてしまいます(詳細は記載しません)。
このため、ホストがReadしたデータは通常SLCキャッシュには書き込みません。
ライトバック
最初に説明したとおり、SLCキャッシュがその効果を最大限発揮するのはホストからのWriteをSLCキャッシュで吸収出来たときです。そして可能なかぎり主記憶(TLCやQLC NAND)へのライトバックは行いたくありません。
そもそもSLCキャッシュがライトスルー方式で実装されることは少ないです。
キャッシュが揮発性メモリで構成されている場合は、ライトスルー方式により例えば電源断時のデータ消失被害軽減が図れます。しかし、SLCキャッシュはNANDフラッシュメモリつまり不揮発性メモリですので書き込んでしまえば電源が切れてもデータは保持可能です。
その上、主記憶も書き換え回数に制約があるNANDフラッシュメモリですから、できるだけ主記憶への書き込み回数も減らすことが望ましいです。
以上のことから、SLCキャッシュは一般的に図4のようなFIFOで構成されます。
SLCキャッシュの入口(FIFOの入口)にはホストからの書き込みとそれにより主記憶から読み出されたデータが書き込まれ、SLCキャッシュの出口(FIFOの出口)では追い出し対象のブロック内の有効データが主記憶に追い出されます(コピーされます)。
追い出したブロックは回収し、フリーブロックとしてその後の書き込みで利用します。また、FIFOの入口のブロックの全ページにデータを書き込んだら新しいブロックを供給してSLCキャッシュの動作を継続します。
なお、図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の空き容量を活用している」 と言えます。
図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の容量が開放された)。
図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のようになります。
図7のタイプAからCまでの3タイプにそれぞれメリットとデメリットがあり、各メーカー、各製品の特徴が色濃く反映されます。メリットとデメリットの詳細は次回の記事で説明します。
その他動作を決めるパラメータ
これまでに説明した他にも、ホストからのWriteデータをSLCキャッシュに書くか主記憶に書くかを決める閾値や、SLCキャッシュへの書き込みを一旦停止するスイッチなど、SLCキャッシュの動作を決めるパラメータはメーカーや製品により様々なものが存在します。
おわりに
SLCキャッシュは、SSDに求められる高い性能を実現するためには欠かせない技術です。
SLCキャッシュは、NANDフラッシュメモリで構成され、コンピュータアーキテクチャの教科書でいう「キャッシュ」の性質を持ちます。このため仕組みと動作を正しく理解しないとSLCキャッシュの存在がSSDの性能低下を招くことや寿命消費を早めることもあります。
今回の記事では、SLCキャッシュの仕組みとその動作を決めるポイントを説明しました。
SLCキャッシュの有無はSSDのカタログに記載されることがありますが、この記事で説明したようなSLCキャッシュの構成などは通常記載されません。必要に応じてメーカーへの問い合わせが必要です。
次回の記事ではSLCキャッシュのメリットとデメリットを説明します。
他社商標について
記事中には登録商標マークを明記しておりませんが、記事に掲載されている会社名および製品名等は一般に各社の商標または登録商標です。
記事内容について
この記事の内容は、発表当時の情報です。予告なく変更されることがありますので、あらかじめご了承ください。