OpenSolarisでintel SSDを使う場合に未使用領域を作る理由

Trimが無いorデバイスに対応していない場合についての考察なんですが、以前から考えていた部分について書いてみたいと思います。OpenSolarisに限った話ではないんですが、とりあえず今はSSDを使う環境がWindows7以外ではOpenSolarisが多いのでそっちの方向で書きたいと思います。
今日のTwitterのTLで@kohjuさんがiSCSISSDをZILに使うかL2ARCに使うかについて述べられていたんですが、その流れで自分もあれこれSSDについてツイートしたり教えてもらったりしたので、新たに調べてことも含めてまとめたいと思います。まあ自分のはほとんど質問込みのツイートなんですが(;・∀・)
どこまで正しいのか分からない部分があるので、情報をお持ちの方はツッコミをいただけると助かります。自作ネタですね。



[2010-11-10追記]
intel SSDで予備領域を確保する手順についてのエントリを追加しました



[2011-07-03追記]
intel SSDにおけるHPAの効果とZFS のZIL(slog) on intel SSD についてのエントリを追加しました


L2ARCとZILについて

ZFSについては以下を参照してください。

ZFSには非同期にディスクに書き込みをするためにZILという機構があります。またreadキャッシュとしてARC/L2ARCというものが存在します。
以下ご存じない方に向けて簡単に書いておきます。

ARC
物理メモリでreadキャッシュとして使われます。write時にも使われます。
L2ARC
ZFSからのreadが発生した場合、まず物理メモリにキャッシュされ(ARC)あふれたものはあればL2ARCデバイスにキャッシュすることができます。L2ARCにSSDを設定することでread性能を上げることが可能になります。
ZIL
ZFSはwriteをトランザクションとして扱います。このトランザクションのログがZIL(ZFS Intent Log)。同期書き込みの場合にはwrite性能が落ちる。ZILはデフォルトでプール内に形成されるが別のデバイスを指定することができます。このデバイスSSDを用いることでwrite性能を向上させることが可能になります。ZILが使われるのは同期書き込みの要求時のみです。非同期書き込み時には使われません。

iSCSIの場合

SSDiSCSIで使うことについては上記のまとめの@kohjuさんのツイートが参考になります。実際にサービスで使われている部分からの考察です。

自分が前からやっていることは、intel SSD(X25-E/M/V)を使う場合に未使用領域を作成するということです。これはZILでもL2ARCでもやっています。具体的には容量の20%ぐらいを未使用領域でパーテションをきってます。これについては以下。

OpensolarisSSDを使う場合

intel SSDの特性

intelSSDはランダムのI/Oの性能が他のSSDより圧倒的に勝ってます。特にwrite時は他のものの倍以上の性能が出る場合もあります。まあFusion-ioのような高価なものやSATA3.0 6Gbpsに対応したものは別として。。。なのでintel SSDを用いているわけですが、パフォーマンスの劣化も他製品に比べて大きかったりします。これは以前からいわれている部分でそのためWindows環境ではtrimコマンドに対応しています。intelSSDはこのTrimコマンドによるパフォーマンスの回復が大きいです。
一方東芝やIndilinxのコントローラの製品はそもそものパフォーマンスはintelより劣るものの、何もしなくても劣化がゆるやかです。このあたりは最近でた以下の記事が参考になります。

未使用領域を作っておく理由

SSDでは予め使用不可能な予備領域が用意されていますが、未使用領域をとっておくことでSSDのコントローラが未使用と判断する領域が増えるとされています。この未使用領域というのはSSDのコントローラからみた未使用領域のことでOSが一度でもファイルシステムの作成/書き込み消去を行って開放されたブロックは該当しません。これはOSが未使用としている部分でもSSDのコントローラ側としてはそのデータがいらないものかどうかわからないということです。OS側からSSDのコントローラ側に「未使用ですよ、消していいですよ」と通知してあげないとコントローラは完全に削除していいものかどうか知る由がありません。この通知をおこなうのがTrimコマンドです。
OpenSolarisではTrimコマンドは現在のところ対応していません。なのでintel SSDを使っていると当然劣化していきTrimが無いので回復させることができません。なので未使用領域をとって長寿化とI/Oパフォーマンスの劣化対策としています。

このintel SSDの劣化対策についてはinetlの天野氏も言及しています。また昨年のIDFや今年のIDFでもこの件については言及されていました。

簡単にいうと、

  • 書き込みが早い未使用の領域は使うごとに減っていく
  • ガベージコレクションやスタティックウェアレベリング頻繁に起こるとデータの書き込み時以外にも書き込みが発生し寿命が縮む
  • 書き込み時の未使用領域確保確保のためのコピーや消去の処理を挟まなくて済むので余分なオーバーヘッドが無い分write性能の劣化を防ぐことができる

といった感じです。

MLCタイプのX25-Mでは予め用意されている予備領域は7%、SLCタイプでは27%とされています。なので自分はMLCタイプのSSDを使う場合は最低20%の空き領域を作っています。X25-M 80Gだと16Gを未使用とするということです。7%とあわせるとトータルで27%以上の領域になります。正確に27%に合わせてるわけではなく、わかりやすいので1/5としているだけです。

ZILに用いる場合はこの割合をもっと大きく取っていいと思います。というのもZILは最大で物理メモリの半分が有効サイズとなるので、これ以上領域が大きくても意味が無いからです。なので物理メモリが32Gとかなら16Gあれば足りる計算になります。

尚、未使用領域を取ってあるからと言っても内部的には全体の劣化が進んでいます。未使用領域の部分を使ってガベージコレクションやウェアレベリングを行っているからです。なので、未使用領域を次にまっさらな状態で使えるということにはならないので注意が必要です。

結果は?

で、実際に効果が出てるのかといわれると・・・わかりません(;・∀・)まだ数ヶ月しか使っておらず、そんなにI/Oが限界まで発生してるわけでもないので・・・。
ZILの書き込み/削除の仕組みもTwitterで色々教えていただいたものの詳細を把握してないので、こういったデスクトップ環境向けの考え方が当てはまるのかどうか。ただ、ZFSSSD使うのに未使用領域、未使用領域と言い続けていたのはこういうことを考えていたからでしたということで。今日のTwitterで色々教えて頂いたということもあったのでいい機会だと思いまとめてみました。

何か情報お持ちの方や間違いのご指摘などはTwitterやコメントで教えていただけると助かります。


以下参考

余談

うちのストレージではX25-MとX25-VがZILで稼働しています。これはイニシャルコスト的な要因です。容量というより性能と耐久性が重要なのでintel SSDで選ぶなら最適なのはSLCタイプのX25-E(32G)だと思います。容量自体が必要なL2ARCはX25-M(80G/160G)がいいと思います。
iSCSIベンチマーク的にはZILに用いるデバイスX25-EX25-MもX25-Vもあまり変わらないんですが、NCQ(Queue Depth)ことを考えるならばX25-Eが最適だと思います。ベンチマーク的にもはっきりE>M>Vの傾向がでます。

またデフラグについてですが、空き領域のデフラグができるツール(Defragglerなど)ではSSDも効果があるとされています。