sside.net

SSDについて勝手に語る

modified: 2017-11-22

自作PC界隈を見ていると「SSDだから速い」「NVMeだから速い」「リードが2GB/sで超高速」みたいな話が散見されるので、SSDの話をします。

SSDとは

Solid State Drive(Disk)の略。HDDはレコードよろしく、回転する円盤(プラッタ)に対して、可動するヘッドがプラッタの内周なり外周を読み取ってデータの読み書きをするストレージデバイス。比べてSSDはその名の通り、solid state(半導体、または可動部分がない)。

何が違うかというと、圧倒的にレイテンシ(遅延時間)が異なります。

レイテンシの違い

レイテンシはCPUがストレージに対して読み書きのコマンドを出してから、実際にデータの転送が始まるまでの待ち時間です。

たとえ話(実際にはありえない例。バーストアクセスや論理ブロックサイズとかパケットサイズとか全部無視)として、10MBのアクセス100回、合計で1GBのアクセスをするとして、下記の性能のストレージがあったとします。レイテンシは10倍、と転送レートは100倍違うと仮定します。単位が秒なのは分かりやすくするためです(実際は500倍以上短い)。

レイテンシ 転送レート
ストレージA 1秒 1MB/秒
ストレージB 10秒 100MB/秒

処理時間は”(アクセスするサイズ / 転送レート * アクセス回数) + (アクセス回数 * レイテンシ)”になります。ストレージAの場合、”(10MB / 1MB * 100)秒 + (100 * 1)秒”は1,000秒 + 100秒で合計1,100秒。ストレージBを見ると”(10MB / 100MB * 100)秒 + (100 * 10)秒”で10秒 + 1,000秒で1,010秒。転送レートの高いストレージBが若干早く見えます。

が、PCを使っていて1ファイルのサイズを平均したら10MBのアクセスなんてことはないでしょう。system32やProgram Filesディレクトリを見ても、読みだすプログラムのファイルサイズは殆どが1MB以下でしょう。ということで今度は条件Bとして100KBのアクセスを10,000回行うとどうなるかが下記の表になります。

レイテンシ 転送レート 条件A(10MBを100回) 条件B(100KBを10,000回)
ストレージA 1秒 1MB/秒 1,100秒 11,000秒
ストレージB 10秒 100MB/秒 1,010秒 100,010秒

ということで今度は転送レートが100倍遅いストレージAが9倍速くなります。ここからは現実の話をしますが、メモリの足りないマシンだとよくスワップファイルへの書き出し、読み込みに加えて、アプリケーションの読み出しなど、ランダムアクセスが無数に行われます。これらのアクセスはモロに個別のアクセスなので、転送レート関係なしに、とにかくレイテンシが重要で、よく「SSDにしたら速くなった」というのは、SSDの転送レートが速いことよりも、アクセスレイテンシが短縮されたことによるものです。

HDDとSSDの違い

実際のデータ転送はこのレイテンシの後に始まります。HDDはデータの読み書きにあたってまずヘッドを動かし、その後アクセスするトラックが来るのを待つ必要があります。

これはHGSTのエンタープライズ向けHDD、Ultrastar He10の数字ですが、回転数が7200rpm(秒間120回転、1回転に8.3ms)で、ヘッドの平均シークタイムが8.0ms(Readの値。Writeは8.6msですが、計算を簡単にするため割愛)。この場合8ms(ヘッドシーク時間) +8.3ms / 2(プラッタの回転待ち、該当トラックに到達するまで半周分掛かると仮定) = 16.3ms掛かる計算になります。実際はヘッド位置合わせや該当トラックの読み出し後内部処理などでプラスアルファされます。「データシートではLatency Avg.が4.16msって記載されてるけど?」というのは、実際にはキャッシュDRAMが載っており、直近のアクセスに関してはキャッシュが効くからです。

対してSSDの場合は、可動部分がないため読み書きレイテンシはSSDコントローラからフラッシュROMに対する動作クロックと、SSDコントローラ内部の処理時間になります。Intel ARKによるとSATAで80-85μs、NVMe(MLC NAND)で20μs、Optane Memoryだと10μsということで、HDDに対して文字通り桁が違うわけです。その差実に50-400倍。

SSDの特徴

SSDは00年代まで主流だった(とはいえ2016年のSSD出荷台数は1億800万台HDDは4億700万台とのことで、未だHDDが主流ですが)HDDに比べて、大きくデバイスの性質が異なります。

メリット

HDD比でSSDが優れているところについて。

耐久性が高い

HDDは回転するプラッタとヘッドの距離が10nmオーダーしかなく、データの読み書き中にHDDに衝撃を与えると容易にぶっ壊れました。稼働中だと大体10G(数10cmの高さから落とす程度)の衝撃で壊れるとか言われてます。

SSDは中に駆動部品を持たないため、外部からの衝撃に対しては頗る強いデバイスです。ノートPCの場合、外部からの衝撃で壊そうとしたら、先にPCの外装が割れるレベルです。

パフォーマンスが高い

アクセスレイテンシの話は先述しましたが、それに加えて純粋な転送レートもSSDの方が上です。

今時のSSDの場合SATA IIIならインターフェイスの転送上限(規格上600MB/s、実効550MB/s前後)を使い切る勢いです。PCI-Expressを使うNVMeでも、データセンター等ハイエンドの方ではそろそろPCI-Express 3.0(1レーンあたり片方向1GB/s)4レーンでも足りなくなってきてます。

SATA SSDでもHDD比でレイテンシは50倍、シーケンシャルアクセス時の転送レートで3倍くらい違うので、最低でもHDDより3倍以上速いことになります。実際に使った場合体感でどう変わるのかは後述します。

軽量

HDDの場合、内部にはプラッタやヘッドに加えて、それらを動かすモーターが必要になります。加えて、それらを保持するハウジングについても使用中の温度差(HDD自体内部での摩擦やコントローラチップの発熱などで10-15℃くらい発熱するのに加えて、PC内部のCPUやGPUが30℃以上発熱する)で歪みが発生しないよう、鋳造されたスチールやアルミニウム合金の筐体が使われています。2.5インチHDDの分解写真を見ると、殆ど隙間なくパーツが密集してます。

引き換え、SSDの場合は基板上にコントローラやNANDのチップ、キャパシタやコネクタが載ってるだけです。2.5インチHDDと同じ形にするためだけに入れてる筐体が一番重いなんてこともあり得ます。百聞は一見に如かないので、Samsung 850 EVOの分解写真を見てください。

低消費電力

HDDの場合はプラッタを回して、ヘッダを動かし、読み取ったデータをコントローラが処理する必要があるため、原理的に消費電力が高くなります。一般的なSATA 2.5インチHDDとSSDの消費電力を比べた表は以下になります。

ストレージ種別(引用元製品名) アクセス時消費電力 アイドル時消費電力 スピンアップ消費電力
HDD (HGST Travelstar Z5K1) 1.5W (R/W Avg.) 1.6W(Seek Avg.) 500mW (Avg.) 5W (Max.)
SSD (Samsung SSD 850 PRO) 3.3 – 3.4W (Avg.) 70mW (Max.) なし

アクセス時消費電力はSSDの方がHDDより1.7Wほど高くなってます。昨今のNVMe SSDだと8W以上に達してるものもあります。

ただ、一般的なデスクトップやノートPCではそれでもSSDの方が消費電力は低くなります。前述したようにSSDとHDDのパフォーマンス差は最低3倍以上(実際は10倍以上)。同じ量のデータを読み書きするならば、SSDの方が3倍以上早く終了し、早期にアイドル状態に落ちることになります。データ転送量単位の電力効率で比較した場合、SSDが3倍高速なら消費電力を3で割れることになるため、SSDの方が優れていることになります。

加えてアイドル時の消費電力を比較すると、概ね7倍以上(表ではHDDがAvg、SSDがMax値)の差が付いています。従ってストレージに対して同じアクセスを試みた場合、3倍早くアイドルに落ち、アイドル時の消費電力は7倍異なる、ということになります。また、一定時間アクセスがない(一定時間以上アイドル状態)だと、ストレージはスリープ状態に落ちてさらに消費電力を下げるモードになりますが、スリープから復帰する場合、HDDでは一番消費電力が増えます(一度スピンドルが回転したら後は慣性で回るが、最初に所定の回転数までスピードを上げる必要がある)。この辺りも勘定に入れると、更に消費電力の差は増えます。

実際の消費電力についてはワークロードによって変わりますし、もうメーター付けて測るしかない奴ですが、仮にPC稼働時間の60%HDDにアクセスしていて、40%アイドル時間と仮定した場合、SSDにするとアクセス時間が20%になり、80%寝ていると仮定できなくはないです。表の消費電力で計算してみると約1.5倍変わる計算です。

ただ、人間が操作するにあたって処理が早期に済んだら、普通は次のタスクを始めてしまう(ワークロードが異なってしまう)ので、実際にはこの比較は不適切ではあります。

デメリット

ここまで良いことづくめのように見えるSSDですが、全面的に良いものであれば、とっくにHDDは駆逐されているはずです。デメリットも幾つか、なおかつクリティカルな奴があります。

メディアの書き換え回数上限

SSDによく使われるNANDフラッシュROMは、名前にROMと付いているだけあって不揮発性(電源がなくてもデータを保持する)読み出し専用メディアに、フラッシュ(データの消去)と書き込み機構が付いたものになります。NANDってのはフラッシュROMの種類です(他にもNOR型、微細化に向かず、セル面積が大きい奴があります)。

NANDフラッシュROMの書き換え

NAND(フローティングゲート形式の話です)のデータ書き込みにあたっては、前提としてフラッシュROMにはデータの書き換えという概念がありません。0を1には出来ても、1を0に書き換えることは出来ません。じゃあどうやってデータの書き込みや書き換えを行っているのかというと、SSD内で一度データを読み取り、保持した状態でフラッシュROMの該当部分を全て消去(フラッシュ。フラッシュROMの由来)します。その上で、SSDコントローラ側で書き換え部分を変更したデータを改めて書き直す、という処理になります。

ROMチップ内では消去の際、チップ内ではゲートからセルに20Vくらいの高電圧を印加してセルの抵抗をゼロにします。続いて、逆方向に電圧を掛けてセルの抵抗を書き込みます。読み出しはゲートから5V程度の電圧を掛けて、抵抗値を読み取ってます。

NANDフラッシュROMはフラッシュや書き換えの際、高電圧で電子が絶縁膜を通過して、中に電子を蓄えることでデータを保持していますが、その高電圧を何度も印加するうちに絶縁膜が劣化したり壊れたりします。これが寿命です。通説ではセルの書き込み回数は以下の表になります。比較対象としてHDDやOptane Memoryも併記しておきます。MLCについては後述します。

HDD SLC NAND 2bit MLC NAND 3bit MLC NAND 4bit MLC NAND Optane Memory
書き換え回数 100万回 1万-10万回 1,000-1万回弱 1,000回未満 数10回 数10万回

更に質が悪いのは、NANDフラッシュROMはその構造上、任意のセル単位での読み書きはできません。セルは2,048個(注: 製品によって異なる)単位で「ページ」という単位で纏まっており、そのページを2,048個束ねたもの(これも製品によって異なる)が「ブロック」になります。イメージとしては以下の図です。

NANDへのRead / Writeはページ単位で行われ、消去はブロック単位で行われます。セルあたりの記録ビット数が1ビットなら、1ページ2KB、1ブロックは4MBに達します。ここで、仮に1KBのファイルがあったとして、その10byteだけ書き換えたい場合、最悪の場合4MB分のセルが書き換えられてしまうことになります。

「じゃあセル単位で消去や書き込みの制御が出来るようにすればいいのでは?」というのは尤もです。が、フラッシュROM自体が元々消去が一番大変なので纏めて行うものなので無理です。書き込みも内部的には纏めて行うような配線になってるので無理です。諦めるかIntelのOptane SSD使ってください。

書き込みコントロールとウェアレベリング

精々数byteの書き換えに毎回4MB分のセルを愚直に書き換えていたら、書き換え回数が1-10万オーダーのSLC NANDでも速攻で壊れます。ただ、先述した通り消去はブロック単位ですが、Writeはページ単位です。ということは書き換えたいページがあったとすれば、どっか使ってない別のページに書き込めば1ページの書き換えに2,048ページを道連れにする必要なく、消費される書き込み回数も1ページ分で収まります。使用するページは同じブロックに属する必要はないので、SSD側で未使用ページを管理していれば、任意のページにデータを書き込めます。

一時期しきりに取り上げられたTRIM機能は、この未使用ページをホストのOSからSSDに通知できるようにした機能になります。OSで削除された該当ファイルシステム上のアドレスをSSDに通知するだけで、以後SSDは即座にそのページを使用することが出来るようになります。

ウェアレベリングについては、SSDコントローラ側で「どのページに何回書き込んだ」かを管理しておき、全てのページの書き込み回数が均等になるように調整します。ウェアレベリングとワンセットで語られるガベージコレクションは、例えばブロックの2,048ページ中、256ページだけ書き込み済みで、かつ書き換えの対象にならず、他の1,792ブロックは書き換えに使用済みだった場合、そのままでは必要な256ページのために残りのページが犠牲になります。この場合は必要なページを読み込んでから「ブロックを消去、同じブロックに必要なページを再書き込みする」か、または「ブロックは消去、必要なページは既に書き込み回数が多いページに移す」等の処理を行います。

また、「予備領域」として、壊れたページの代わりになる領域を用意しています(480GBとか250GBとか2の乗数になってない容量のSSDは足りない分が予備領域です)。読み出し時に著しく劣化していたり、書き込み回数が一定以上になったページは破棄して予備領域に移す処理も書き込みコントロールの一環です。

SSDでよく言われるキャッシュについては、例えば16byte分の書き込みコマンドとデータがやってきた時点では、SSD側はそれが「単に16byte書き込め」なのか、「まだ後続のデータがやってきていない」状態なのかは把握できません。キャッシュRAMを搭載することで愚直にデータが来たらすぐ書き込むのではなく、しばらく溜め込んでから後続アドレスのデータがやって来るか、一定時間待ってから纏めて書き込むようになっています。その他、SSD内部での書き込み遅延の隠蔽、直近に利用されたデータのリクエストに対する高速な応答など、様々な恩恵があります。あと、ウェアレベリングの精度についても、出来ることが増えるのでキャッシュレス(注: ただし、キャッシュレスでもコントローラチップ内にある程度のメモリは積んでる)はおっかないです。

余談ですが実際の書き込みと、実際にNANDに書き込まれるデータ量の比率をWAF(Write Amplification Factor)と呼びます。16byteの書き込みに2,048byte書き換えた場合、WAFは64にもなります。一般的な使用用途では20-30が最大だそうです。勿論、壊すように仕向ければその限りではないです。

ファイルシステムのページ境界とSSD管理ページのミスマッチ

これ自体はもうWindows XP時代の話なので、今は気にしなくてもいいんですけど、XP以前で何も考えずにフォーマットするとファイルシステムのページ境界アドレスがSSDのページ境界とズレてて、書き込みの際に余計にNANDのページ数を消費する現象がありました。

HDDの場合は内部で管理する書き込み単位がズレても、回転するプラッタの隣にあるので問題にならなかったけれど、SSDの場合は一気に顕在化したケースです。「今は解決してるからいいじゃん」という話ではなく、全く性質の異なるデバイスでは、それまで問題にならなかったことが問題になるという話です。

MLC NANDについて

ここまでにもSLCとかMLCとか説明レスで記載してきましたが、NANDフラッシュROMは1セルに2bit以上のデータを書き込みする技術があり、それがMLC(Multi Level Cell)と呼ばれます。SLCは(Single Level Cell)で、1セルに1bit書き込む形式です。

MLCの仕組み

前述したNANDへの書き込みですが、MLCの場合抵抗が0と1となる電子量の間、0.33と0.66になる電子量を注入することで、読み込み時の抵抗を4種類(2bit)得られるようにします。これが2bit MLCになります。3bitの場合は8段階の抵抗となります。

これで同じサイズのセル(実際はMLCにすると周辺回路とかは大きくなる)でそのまま容量が倍になります。勿論コントローラ側の対応が必要とかはあるんですが、ざっくり同じ価格でSSDの容量が倍になる、或いは同じ容量で価格が半分になったりすることが期待されます。実際はそうはなりませんが、SSDのbit単価が急速に安くなった要因の一部ではあります(その他の要因の一部: NANDの微細化、市場規模の増大、チップの開発費回収等々)。

MLCの弱点

SSDが安くなるなら万々歳だろというのは人情ですが、タダでメリットが享受できるわけではなくMLCには様々な弱点があります。

書き込み性能の低下

NANDの書き換え回数の話をしましたが、MLCにすると読み込み性能、書き込み性能が低下します。特に書き込み性能の低下が顕著です。具体的には流し込む電子の量の制御が圧倒的に難しくなります。次の表はあくまでイメージ(実際は絶対に違う)ですが、粒度が全然違うことは見て取れると思います。

SLC 0(2進数): 0% 1: 100%
2bit MLC 00: 0% 01: 33% 10: 66% 11: 100%
3bit MLC 000: 0% 001: 14% 010: 28% 011: 42% 100: 57% 101: 71% 110: 85% 111: 100%

読み込み時、所定の抵抗を得るのに注入する電子の数をどれだけの精度でコントロールする必要があるか、セルに溜められる電子の数はセルのサイズに依存します。現行の3Dじゃない1Z世代プロセスだと電子の数は2桁とのことです。

データ書き込み時の電圧印加も、SLCでは0ならそのセルはそのまま、1は所定の電圧印加で問題なかったものが、2bit MLCの場合は注入する電子量が4パターンあり、かつ注入する電子量は3倍の精度が求められます。2進数10を書き込もうとした場合、まず50%を注入した後、残りを注入する形になります。3bitの場合は3回電圧印加が行われます。

ところでHDDが順調に記録密度を増やしていた頃を覚えている人は、プラッタあたり容量が増加すると速度も増加していたことを思い出して「1セルを読み出すだけで2bitデータが持ってこれるのなら、読み出し時の転送レートは2倍になるのでは?」と考えると思いますが、実際はそうはなりません。MLCにした時点で、抵抗値のマージンが半分以下になっており、読み出し時のエラーレートが劇的に高まっているからです。

元々、SLC NANDでも微細化の進んだ昨今ではエラー検出、訂正(ECC)は必須になっていますが、SLCなら1byteのECCで済んでいたものが、MLCでは4byte以上になってます。ECCの計算量はbit数に対する乗数で効いてくるため、8bit(1byte)に対して32bit(4byte)は4乗の処理時間、または回路規模が必要になります。それ以上のサイズのECCだともっと遅くなります。数学よく分からないので気になったら各自調べてください。

パフォーマンスだけでもデメリットですが、ストレージとして重要な指標となる寿命に対するインパクトはそれ以上です。

セルの記憶容量が倍になると、ページサイズもそのまま倍になります。同じ16byteを書き換えるにしても、今度は4KBが書き換えられることになります。全体のセル数が変わらないままSSDの容量が2倍になれば、ページが書き換えられる可能性も2倍に膨れ上がります。SLCなら書き込まずに済んだページがMLCなら書き換えられる可能性があります。

抵抗値のマージンが小さくなっているため、絶縁膜の劣化の影響をより多く受けて、SLCならマージン内だがMLCだとマージン外でデータが読み出せなくなる可能性が増えます。これも一概に言い切れる事柄ではないですが簡略化すれば「SLCなら抵抗値に20%のマージンがあったが、MLCだと10%しかない、絶縁膜の劣化で書き込み精度が10%下がるとMLCだけ死ぬ」ということが起こります。

寿命についてまとめると「ページに対する書き込み頻度は増加しているのに、ページに書き込みできる回数は低下している」ということになります。これが3bitになると、問題はまた乗数で効いてくることになります。

データ保持性能の低下

NANDフラッシュROMは電子を保持してデータを記録することは何度も書き連ねてきましたが、この電子は失われていきます。

まず、通電しないまま放っておくと徐々に失われます。そもそもが消去と書き込みが可能なものなので、電子が抜けることがあり得ます。環境温度が高いとより早く失われるそうです。多分電子の動きが増えるからだとは思います。それと電子を保持している絶縁膜は厚さ10nm前後で、ナノメートルの世界なので量子的にいなくなるとかもあるかもしれません。物理学は分からないので各自調べてください。

あと、読み出しの際も電子が失われていきます。読み出しも消去と同様ゲートから電圧を掛けるためです。

これらの要因で不揮発性メモリのデータは揮発していきます。タイプごとの保持期間は大体以下の表の様に言われています。

SLC 2bit MLC 3bit MLC HDD
データ保持期間 10年 5年 2年 10年

見事にセルあたりbit数が増えるたびに半分になってます。「3bit MLCなSSD使ってるけど保証期間5年って書いてあるぞ」という向きもおられましょうが、勿論コントローラ側で読み出し時にマージンに対してギリギリだったりすると、別のテーブルに書き直しを行っているため顕在化しないだけです。HDDも読み出し時に同じデータ書き込んだりしてます。

これまた余談ですが、これSDカードでも同じなので、長期間データを保存する場合は避けた方が賢明です。バックアップなら強いて言えばHDD?という感じになりそうですが、HDDのデータも揮発するため、定期的なバックアップに勝る方法はないです。ちなみにおれはRAID組んでたHDDの一部トラックが全然読み込まれないままデータが揮発してたことがあります。

SSDのスペックの読み方

ここからは実際に流通してるSSDで喧伝される要素について説明します。

コントローラ

SSDの性能の話をするならコントローラが最重要です。ここがホストインターフェイス(SATAやPCI-Express)、及びNAND Flash ROMへのアクセスを提供します。

SSDコントローラの仕事は、HDDもコントローラを搭載していてやってることは同じなんですが、まずホストに対して自身をHDDだと見せかけます。ホストからのコマンドを受けて、繋がっているNAND Flash ROMをRead / Writeし、その結果をホストに戻します。

じゃあ何でHDDと違ってホストインターフェイスが重要なのかといえば、HDDとSSDでは産業のオープンさが全然違っており、HDDの場合は「XX社のプラッタと、YY社のヘッド、ZZ社のコントローラ」みたいなことはエンドユーザは基本的に知る由もないし、知る必要がありません。HDD市場のプレイヤーは実質3グループ(WD、Seagate、東芝)しかなく、どのパーツもソフトウェアも特注みたいなものです。

翻ってSSDの場合は「NAND Flash ROMはIntel-Micron、コントローラはSandforce、ファームウェアはCrucialのカスタム」みたいなことが普通に起こります。昔はよく「東芝のSSDは鉄板」「SandForceコントローラは速い」とかありましたけど、東芝のSSDコントローラは昔は自社の奴があったりしましたけど、今はIndilinx(OCZに買収された後OCZが東芝に買収された)があったり、SandForceにしても新モデル出るたびに妙な挙動するとかありました。もっと極端な例だと、同じコントローラでもメーカー側でファームウェアをカスタムした結果バグってるなんてことも。「こうしておけば安心」なんて指標はありません。

とはいえ昨今ではSSD市場も成熟してきてデータぶっ壊れるとか、極端に遅くなるとかは殆どなくなりましたが。

コントローラメーカー別所感

Intel

2017年末現在、世界で一番速いSSDコントローラを製造してる。とはいえ、自社コントローラはデータセンター向けか、それを流用したハイエンド向けでしか使ってません。コンシューマ向けのSSDはSandForceやSilicom Motionです。

ターゲットアプリケーションが完全にデータセンターなので、ランダムアクセスのワークロードに特化。ランダムアクセスのIOPSとか、ワーストのアクセスレイテンシが超優秀。シーケンシャルアクセスは遅くはないけれど、他と比べて振るわないことも。

Samsung

世界最強のSSDメーカー。コンシューマでも買えるSSDだと、IntelがOptane SSD出すまでは960 Proがぶっちぎりで最強でした。

何かとシーケンシャルアクセスの数字で競われるSSDスペック競争の完全に先を行ってます。シーケンシャルアクセスで勝って当たり前、ランダムアクセス、Read / Writeミックス、NAND Flash ROMベースのSSDでは全てにおいて最強。

そもそも自社でコントローラからNANDまで全部垂直統合な上、SamsungのNANDは世界トップシェア。勿論他のコントローラメーカーもSamsungのNAND使うことはあり得るんですが、Samsung自身が自社で作ってるNANDに合わせてコントローラ作るのと、他社(コントローラメーカーやSSDメーカー)がSamsungから出荷されたNANDにコントローラ対応させるのは全くスピードが異なる話なうえ、何よりもSamsungはNANDが屋台骨なので新しいコントローラをバンバン出してくる(売れまくるので全然ペイする)次第。

新しい仕様のNANDに合わせてコントローラを迅速に出せる上、コントローラ自体の製品サイクルも速いので、もう爆発スマートフォンみたいに酷い不具合出さなければずっと最強メーカーだと思います。Samsung買っておけば間違いない。

Broadcom

IntelやSamsungでないSSDメーカーが「ハイエンド」を謳って出してくるSSDは大体Broadcomです。

NVMeなんかの新規格には迅速に追従してて、かつそれなりに速く、それなりに高価という感じ。

自作の場合は特に選ぶ理由がないというか、高価な奴ならIntelかSamsung買っておけということになります。

JMicron

SSD市場の黎明期、安い方向に圧倒的なプライスを打ち出してバカ売れしたけれど、ガベージコレクションがクソでレスポンス返さなくなってOSが固まったり、タイムアウトして青画面出したり、ファームがクソでデータが壊れたりしたJMF602からもう8年以上経ってますが、SSDというデバイスに対する希望をぶち壊しにした挙句、SSDというデバイスの問題点を詳らかにしたインパクトはまだ薄れていません。

ただ、世の中先に失敗した方が修正も先になるのが常で、今の奴は割とまともらしいです。

ただ、ハイエンドでは一切見なくなりましたが(おれだってJMicronコントローラのハイエンドSSDなんて絶対買わない)、ミッド-ロークラスでは普通に健在です。TLCにもいち早く対応し、安価なSSDでは一定の地位を築いています。SATAとUSBのデュアルインターフェイスが名物ですね。高速な外付けSSDとしてや、Xbox Oneに繋いでゲーム入れとく程度なら十分使えると思います。

Silicon Motion

ローエンドからミドルクラスで最近採用が多いイメージです。昔から酷い話も、良い話も特に目にしません。レビュー見てもその時々の標準クラスの性能出してます。特にコントローラ気にせず、評判も悪くないSSDを買うと中に入ってるのがコレというイメージ。

ホストインターフェイス

最初はSATAとNVMeの話だけしようと思ったんですが、色々あるので全部紹介します。

Serial ATA(SATA)

ご存知SATA。元々は80年代にIDEというHDD接続インターフェースがデファクトスタンダードになり、それを標準化したのがATAです。90 – 00年代にはハイエンドを除いてストレージ接続はATAになりました。元々40pin(後に40pinのままGNDが40芯突っ込まれて80芯に)のパラレルバスだったんですが、取り回しが悪かったり高速化できないのでシリアル信号になりました。なのでSerial ATAです。

Serial ATA 1.0の頃は150MB/sだった転送速度も、世代が上がる度に倍速化していき、現行のSerial ATA 3.0(厳密にはリビジョン表記と速度は切り離されてますが、慣例として)では600MB/s。今時のSATA SSDの多くが最高転送速度540MB/sくらいになってるのは、SATAの実効転送速度の上限に達しているからです。

「転送速度が足りないのなら、また倍速化した規格を策定すればいいのでは?」というのは尤もですが、元々ATAは世の中2億台以上のPCで使われることを前提とした「安価な」インターフェースです。単にコネクタやケーブルが安価ということだけではなく、ホスト側で備えるインターフェースが簡素であることや、接続されるストレージも安価に作れることを想定しています。

現状のケーブルのままではもう高速化は困難になっており、また古い規格なのでNCQのキュー数が少なかったり(キュー数は増やせても、HDDには意味がない)と高速化するSSDに追従するのは困難になっています。元々、HDDを使う分には転送速度はSATA 2.0(300MB/s)で十分、NCQ対応も十分な状態です。

まだ世の中HDDの方が多い状態で、SSDのためにケーブルが高価になったり、高速なPHYを入れたりするのは割に合わないので「じゃあソリッドステートストレージは別の規格使えばいいじゃない」となります。コマンド等の論理層もHDDとの接続を考慮したままSATAを拡張するくらいならハイエンドSSDはNVMeに行ってくれた方がマシ、ローエンドのSSDはSATA 3.0で十分だろということで現状落ち着いてる感じです。

Serial ATA Express(SATA Express)

ということでSATA後継の規格がこちら。旧来SATAと、PCI-Expressのコンボポートになっています。PCI-Expressの世代はGen2以上で、レーンは2つ。SATAコネクタの形は基本的にはSATAを踏襲しているので、SATAとの前方互換性もある形になってます。

が、PCI-Express Gen2の2レーンというと片方向1GB/sしか出ないので、SATA 3.0に比べても倍にすらならないので、わざわざ高速なSSDを使いたい向きに受け入れられてる感じではないです。市場もSATAか、x4以上のPCI-Expressコネクタ直結か、M.2の3択で、今後生き残るかはよく分からないです。

それとコネクタ種別が混沌としすぎ

Serial Attached SCSI(SAS)

SATAでも、NVMeでもないハイエンドSSDの選択肢の一つ。元々を辿るとSCSI規格という昔普及した高速汎用パラレルインターフェイスです。HDDなどの高速デバイスはもとより、よくスキャナやCD-ROMドライブの接続に使われていました。ただ、HDDはATA、CD-ROMドライブはATAPIやUSB、スキャナもUSBに取って代わられた後は、主用途をハイエンドストレージとして発展を遂げてきました。ATA同様パラレルだと速度面で限界に達したのでシリアル化して今に至っています。なのでSerial Attached SCSIです。

SASの特徴は

  • SATAの2倍高速(現行のSAS 3.0、1.2GB/s)
  • コマンドの並列発行が可能
  • Expanderを用いた接続台数追加(1chあたり128台)
  • マルチポートのサポート

等になります。あと、「最低限の仕様を満たしていればいい」SATAと違い、信号処理とかもメーカー実装依存だそうで。投入される市場が信頼性を重視するのでHBA(Host Bus Adapter、I/Fボード)やケーブルも高くなってます。

NVM Express(NVMe)

SATAは速度向上の限界に達したところ、丁度PCでは汎用高速バスのPCI-Expressが普及してきたし、ケーブルもUSB3.0(USB3.0の物理層はPCI-Express相当です)のお陰で高速伝送できるのが安くなってきたしでじゃあPCI-Expressを使ってストレージ向けのインターフェイスにしようというのがNVMeです。

NVMe自体はPCI-Express上でストレージを取り扱う規格になるので、コネクタの形状とかは特に決まってません。ホスト側のUEFIとOSにNVMeドライバがあれば、M.2だろうがSATA ExpressだろうがU.2だろうが、PCI-Expressコネクタだろうが、いずれにせよ認識し、使えるようになっています。現在出回っているNVMe SSDのコネクタは色々あるので下表に纏めました。

PCI-Expressレーン数 PCI-Express世代 ホットプラグ対応 ボード直結 / ケーブル 備考
PCI-Express 1-16 Gen 1以上 No 直結
M.2 4 Gen 2以上 No 直結 USB 3.0のコンボポート
U.2 4 Gen 3以上 Yes ケーブル
SATA Express 2 Gen 2以上 Yes 直結 & ケーブル SATA 3.0のコンボポート

パフォーマンス面では元々不揮発性メモリを使ったストレージを想定したものになっていて、コマンド仕様もSASから一部持ってきたり、NCQのキュー数がSATAの32個から65535個に拡張されるなりしています。何よりもSATAと違ってPCI-Expressの採用によってインターフェイスのレイテンシが全然違い、結果的にランダムアクセスに対してSATA比で10倍以上速くなってます。

eMMC

eMMCは元々MMCというメモリカード向けIF規格だったんですが、それを組み込みストレージ向けに転用、拡張して高速化したものです。元々はハイエンドの携帯電話でストレージに使われるようになり、スマートフォンの普及とともに広く使われるようになってます。

組み込み、それも携帯電話向けなので、基本的にコントローラ、インターフェイス、NANDが1チップに纏められ、オンボードに実装される使われ方をします。特徴は携帯電話向けなので低消費電力、低フットプリント。特にフットプリントはM.2を使ったNVMe SSDに比べると20%以下です。Windowsでもタブレットを志向したWindows 8でサポートされ、ローエンドWindowsタブレットの中でしきりに使われることになりました。

インターフェイスの最大速度は400MB/sで、実際にRead 300MB/s以上の製品も存在します。ただ、1チップに纏める必要があるので、NANDは3bit MLC、Writeが遅い奴ばかりです。

よく「eMMCはSSDじゃない」とか言ってるのが居ますが、じゃあお前のSSDの定義は何だと言いたいですね。インターフェイスがSATAやPCI-Expressじゃないとダメなのか(じゃあInfinibandで接続するのは認めないのか?)、オンボード実装で取り外せないのがダメなのか(電気的にもフットプリント的にも不利なのに?)、3bit MLCだからダメなのか(じゃあ昨今流通してるSSDもSSDではないのか)、他にもあるかもしれませんが、阿呆の考えることをこれ以上想像しても仕方ないのでこの辺にします。

UFS

携帯電話でeMMCを使ったストレージが広く普及してきたので、一丁時勢にマッチしたストレージ規格をということで策定されたものです。Windowsは未サポートで、PCではまだ使われていません。

特徴は10cm未満の配線に最適化されたシリアルバスで、低消費電力、高速転送、省pin数を実現しているところです。転送速度はUFS 2.0で1レーンあたり600MB/s。速度が不足する場合は2レーン束ねることもできます。

また、物理層は携帯のカメラやディスプレイインターフェイスにも使われてるものと同じ(UFSの物理層仕様がMIPI M-PHYになった)なので、IPも広く出回って低コストになってます。

SamsungがGalaxyでよく売りにしてるのはこのUFSを使ったストレージですね。

USB

ご存知USB。

2.0の480Mbpsから3.0で5Gbpsに10倍以上速度が上がりました。3.0でpinが5つ増え、物理層はPCI-Express Gen 1相当のものになりましたが、3.1で10GbpsになるにあたってPCI-Express Gen 2相当になるのかと思ったら、別物になったというよく分からない奴です。その名残でケーブルだけPCI-ExpressのExtenderに使われたりもしますね。

USB SSD接続時は、USB Mass Storage Classデバイスとして動きます。ただ、SSD側では「USB-SATA変換チップの先にSATA SSDがつながっている」ものか、「USBに対応したコントローラに直接つながっている」2タイプがあります。形がポータブルHDDそっくりの奴は基本的に変換してると思っていいです。

どっちの素性が良いかは製品次第になるので、実際に速度が出ればどうでもいいっちゃあいいんですが、気になる向きは気にしてみてください。

また、USB Type-Cコネクタが出回り始めましたが、Type-Cコネクタで使えるAlt modeでは、ケーブルの一部の信号線に別のプロトコルの信号を流せるようになりました。PCI-Expressも流せるので、将来的にはNVMeなUSB SSDが出てくるかもしれません。

NAND Flash ROM

「IntelのフラッシュROM搭載!」と喧伝してるクソメーカーとかクソ代理店がありますが、全くもって無意味なので潰れたらいいと思います。

さておき、大事なのはチップのメーカーよりもMLCは何bitか、製造プロセス世代は何nm(微細化が進むほどデータ保持期間が厳しくなるので古い奴の方が良い)なのか、コントローラ-NANDチップ間のインターフェイスは何なのかですが、どのSSDメーカーも非開示なのでよく分かりません。

さておき、NANDチップにも工夫が凝らされているものがあるので幾つか紹介します。

enterprise MLC(eMLC)

これまで散々MLCの悪口を言ってきましたが、当然SSDメーカーも信頼性が低下するのは分かっているので、MLCだけど書き換え回数が多いeMLCチップというものがあります。

どうやって書き換え回数を増やしてるのかは軽く調べた範囲では、

  • 選別品のNANDを使う
  • 予備領域を多く持つ
  • ECCを強化する
  • ウェアレベリングのアルゴリズムを変更する

の合わせ技で書き換え回数を確保しているようです。ただ、どれもコストが上がるので、MLCの低価格化のメリットが相殺とは言わずとも薄れはします。まあenterpriseを冠しているので、採用製品も高くなる分には理解して買う客しか買わない類のものになります。

SLCキャッシュ

3bit MLCで最近よく使われる機構です。3bit MLCだと書き込み速度の低下がシャレにならないため、NANDチップ内にSLCで読み書きするブロックを用意しておき、直近の書き込みはSLC側に溜めておき、アイドル中にMLC側に書き換えるものになります。

書き込みの総量がSLCキャッシュに収まるうちは十分に効果を発揮しますが、キャッシュを溢れるくらいになると途端に3bit MLC相当に落ち込みます。が、SLCキャッシュ領域もGB単位なので実際はかなり効果はあります。普段使いで一回に数10GBも書き込みすることってそうそうないので。動画取り扱えばその限りではないでしょうが、そんな場合はそもそも3bit MLCのSSDを使うなという結論になります。

キャッシュRAM

最近のハイエンドだと2GBとかになってるキャッシュRAMですが、やれDDR3だ、やれ2GBだとかよりも、スペックを見るにあたっては「積んでいるか積んでいないか」の2択です。

世の中にはキャッシュレスなSSDコントローラというものがあり、DRAM1枚積むコストすらケチったSSDというものがあります。コスト最優先なのでNANDも当然3bit MLC。SSDコントローラ内にも少量のメモリは積んでいますが、書き込みにあたってバッファになるキャッシュRAMがないとなると、高度な書き込み制御は望むべくもないので、ただでさえ寿命の短い3bit MLC NANDは速攻で死ぬことになります。壊す前提のゴミとして買う以外、買う理由が一切ありません。

容量の話ですが、64MBや128MBでも、積んでいれば書き込み制御のバッファにはなります。大容量のキャッシュRAMを積んでいても、元々フラッシュストレージ自体が割と高速なので、特定サイズで局所的なストレージアクセスを延々繰り返すプログラムを自分で書いたとかでなければ、あまり気にしなくてよいです。

SSDに纏わる誤解

たまーに見る微妙な話について。メディアとかでも平然と書いてたりするので、そりゃあメディアも商売とはいえ

古いマシンのHDDをSSDに変えると速くなる

自作PCとかやらないけど、巷間に流れる「HDDをSSDにリプレースしてスピードアップ」みたいな記事を見て、何も考えずにSSDにリプレースすると、HDDからのリプレースなので容量重視して3bit MLCなSSD選んだりするわけです。まあそれでも大体の場合は速くなるんですけど、ワークロードによっては遅くなります。

大抵、古いマシンってのはメモリが不足してて、ディスクアクセス遅いなーってのも大方スワップファイルへのディスクアクセスなんですが、SSDに置き換えるとReadは改善しても、ランダムなWriteや、Read / Write混在アクセスだと、Writeがキャッシュを溢れた時点で滅茶苦茶に遅くなります。キャッシュ溢れて以降は、SSDでもレイテンシ1,000ms越えとかになります。

この場合、PCの中に手を入れてパフォーマンスを改善したければ、先にメモリを増やした方が圧倒的に効果があります。

シーケンシャルアクセス速度が速いほど高速

NVMeでRead 2TB/s越えをする3bit MLCなSSDも…とMLCの話はさておいても、シーケンシャルアクセスの速度が上がるほど、OSから見て連続したセクタへのアクセスは短時間で終了するようになるので、さて別のセクタへのアクセスとなるとランダムアクセス時の性能が徐々に重要になってきます。

RAIDだから速い

場合によっては遅くなります。RAIDで高速化って言ってる時点でRAID0(ストライピング)の話としますが、ストライピングって書き込むデータをアレイを組んだディスクの台数分にバラバラ(分割する単位はストライプサイズ)にされて突っ込まれることになります。

読み込みについてはレイテンシにそれほど差が出ないので問題ないんですが、書き込みの場合はSSD内部で管理されるブロックやページがそれぞれ異なるため、消去やガベージコレクションがSSDごとでランダムに発生することになります。RAIDアレイとしての書き込み完了は全ディスクの完了を待つことになるため、書き込みパフォーマンスの増加は難しくなります。

また、読み書き問わずランダムアクセス時は、RAID側で最低アクセス粒度がストライプサイズ分に増加している上、全てのアクセスが後に完了したものに引っ張られてしまうため、スピードは上がりにくいです。

純粋に利用時の快適性を求めてRAID組むくらいなら、最初から高速なSSDを買った方が良いです。リーズナブルに大容量が必要とか、どうしてもシーケンシャルアクセス速度が必要であれば勿論その限りではないですが。

最後に

書いてる間に何の話がしたかったのか分からなくなったのでこの辺にしておきます。SSD選びの一助になれば幸いです。