■元麻布春男の週刊PCホットライン■
前回は、ユーザーが考える消去と、SSDにとっての消去(ERASE)の違いについて紹介した。基本的にユーザーがOSのファイルシステムを通じてSSD(を含むATAデバイス)に対してERASEを命じることはできない。そんな命令はATAのコマンドに存在しない。ERASEは必要に応じて、SSDのコントローラが自律的に行なうことであって、それを制御するのはファームウェアの設定だ。いつERASEするか、どのセクタをERASEするか、ユーザーやOSが指示することはできない。
そもそも、SSDにおけるブロックやセクタ(OSからのアクセス単位であるクラスタの存在する場所)は、仮想化されたものである。SSDのコントローラは、OSからLBAで指定されたブロックを、SSD内部の物理ブロック(ページ)に割り当てる表を管理している。OSに直接SSD内の物理ブロックをアクセスさせないのは、ウェアレベリングの都合があるからだ。
SSDの内部構成 |
既存のOSは、SSD内の特定のブロックを何回書き換えたか、といった情報を管理していない。そもそも、ストレージの主流であるHDDは、書き換え回数の制限がないから、書き込みが特定の領域に集中しても構わない。しかし、何度も触れたようにNANDフラッシュには書き換え可能回数に上限がある。HDDと同じように特定の領域を書き換え続けられては、アッという間に寿命が尽きてしまう。かといって、専用のファイルシステムをOS側で用意すると、PC用に使いにくい。
そこでSSDのコントローラは、OSからのアクセスで使われるLBAと、内部の物理アドレスを分離することで、特定の物理ブロックに書き込みが集中しないように制御している。これがウェア(wear:摩耗あるいは疲弊)レベリング(平準化)と呼ばれる機能であり、こうした工夫があるから、SSDをHDDと同じ感覚で(専用のデバイスドライバ等を用意することなく)利用できるわけだ。
ウェアレベリングのアルゴリズムにはさまざまな種類があるが、基本はスペアのブロックを用意しておき、書き込み時にスペアブロックの中から書き込み回数の少ないブロックを用いるといった形で、特定のブロックに書き込みが集中するのを避ける。もちろん、これだけでは書き込み回数の平準化を完璧に行なうことはできないし、スペアを全体の何%用意するか、ウェアレベリングをどういった単位で行なうか(数ブロックごとに管理するか、ディスク全体でレベリングするか)など、SSDあるいはコントローラによってそのアルゴリズムは異なる。SSDメーカー、あるいはコントローラメーカーのノウハウが詰まった部分であり、秘中の秘というところであろう。
ただSSDで共通しているのは、OSがLBAで参照して書き込んだデータは、毎回同じ物理ブロックに記録されるわけではない、ということだ。どこに書き込むかはSSDのコントローラがファームウェアに従って決定する。SSDが保証するのは、書き込み時に指定したLBAをもう1度読み出せば、必ず書き込んだのと全く同一のデータが読み出される、ということ。SSDのコントローラは、LBAと物理ブロックの対照表を維持し、これを保証しているわけだ。
ここで、スペアブロックという使える場所があるのなら、Write Amplificationはあまり問題にならないのではないか、と思う人もいるかもしれない。丸ごと消去可能、あるいは消去済みのスペアブロックに書き込む分には、書き込みサイズにかかわらずWrite Amplificationは常に1になるからだ。しかし、この書き方をしていれば、瞬く間にスペアブロックを使い切り、ウェアレベリングができなくなってしまう。
スペアブロックを作り出すには、一部しか利用していないブロックから未使用部分を集めるガベージコレクションが必要になる。ここで言う未使用部分は、過去にデータが書かれており、別のブロックにそのデータが移動した跡地だ。もちろん、ガベージコレクションを行なう際にも、PROGRAMはページ単位、ERASEはブロック単位であり、Write Amplificationを考える必要がある。非常に時間のかかる作業であり、ガベージコレクションの間、SSDの性能は相当に低下するものと思われる。また、このガベージコレクションという作業自体によっても、NANDフラッシュメモリの書き換え可能回数は減っていく。
SSDのコントローラとファームウェアは、Write Amplificationが小さくなるような書き込みとウェアレベリングの両立をはかりながら、時にガベージコレクションを行なう。そのアルゴリズムは複雑で、利用するアプリケーションにも依存する。多くの場合、エンタープライズ用のSSDにはSLC NANDチップが使われ、メインストリーム向けSSDにはMLC NANDチップが使われているが、両者にはチップレベルの違いだけでなく、搭載するアルゴリズム面でも違ってくる可能性がある。
●SSDはユーザーにとって不透明さて前回、ストレージが「使われていない」ということをユーザーの側から見た。ユーザーにとってストレージが使われていないとは、有効なファイルやその他のデータでストレージが占有されていない、ということであり、それはファイルを消去することで増やすことが可能である。が、その消去は、SSD内部の消去(ERASE)とは無関係である。
SSDにとって使われていないとは、かつてデータが書かれていたページ、あるいはスペアブロックのように、LBAによって参照されていない領域を指す。LBAで参照できない以上、そこにOSあるいはユーザーが直接アクセスすることはできない。逆に、LBAで参照できないからこそ、SSDのコントローラは自分の判断でそこをERASEしたり、スペアブロックとして利用できる。もしLBAで参照可能な領域でそんなことをすれば、勝手にデータが書き換えられる壊れたストレージになってしまう。
ユーザーがOS上からファイルを消してもスペアブロックは増えないし、デフラグしたからといって、それがガベージコレクションをしたことにはならない。デフラグにより発生した書き込みでスペアブロックが消費され、ガベージコレクションが発生することはあるかもしれないが、それはSSDの内部的な最適化とはほど遠い。
SSDというデバイスの評価を難しくするのは、その性能や寿命を決定する最も重要な要因がファームウェアが内包するアルゴリズムであることだ。アルゴリズムをユーザーが目で見て判断することはできない。一般的なデバイスであれば、中身が見えなくても、ユーザーアプリケーションによるベンチマークテストが、製品の優劣に関する判断基準となり得る。これに価格を組み合わせたコストパフォーマンスを考慮すれば、たいていの判断が可能だ。
しかし、アルゴリズムにより製品寿命も大きく左右されるSSDの場合、100の性能で3年の寿命を持つSSDと、80しか性能がない代わりに6年の寿命を持つSSDのどちらが良い製品なのだろう。現時点において、異なる製品間で製品寿命を比較できるベンチマークテストは存在しない。ユーザーアプリケーションで高いスコアを示したSSDが必ずしもベストな製品とは限らないという点で、SSDはユニークな製品である。どんなに高性能でも、1年で使えなくなるストレージに高い評価はできない。
●SSDはもっとエキサイティングになるFusion-ioの「ioDrive Duo」 |
このNANDフラッシュメモリを用いたSSDという製品が本格的に普及し始めたのは、この2~3年のことだ。メモリカードやUSBメモリという形でNANDフラッシュメモリはずっと前から身近な存在だったが、これらはPCのファイルシステムとしての利用を想定した製品ではない。そのウェアレベリングや書き込みのアルゴリズムは、デジタルカメラやデジタル音楽プレーヤー等に向けたものであって、PCのプライマリストレージに向けたものではない。
言い換えれば、SSDのアルゴリズムはまだまだ改良の余地があるのではないか、というこだ。SandForce、Fusion-ioなど、NANDフラッシュメモリを用いたストレージに関連した新興企業が続々と登場しているのも、まだこの分野に成長の余地がある証だろう。そういう意味で、SSDは今もっともエキサイティングな製品であり、起業のチャンスが残された分野だ。日本企業、あるいは日本人技術者にもチャンスがあるのではないかと思っている。