okkyの日記: ssd と mkfs.ext3 のオプション 4
つーかmke2fs。
ssd は一般に書き込みが遅く読み込みが早い、と言われている。ある意味これは当たり前の話。この場合、ssd はHDDのふりをしているが、HDDには「確保する(create)」「解放する(release/free)」系のコマンドは無い。つまり、あるセクターに書く、とは常に上書きを意味する。
さて、ssd を使う場合、当然ファイルシステムを構築するわけだ。話を簡単にするために Ext3 だとしよう。何も考えないでインストールすると 4kbyte/block でIOするようにフォーマットする。つまりssdには4kbyte単位でのIOが飛んでくる(もちろん、その倍数で来ることもあろうが)。
しかし、ssdというのは本来ブロック単位で消去を行う必要がある。例えば1ブロックが32kbyteの場合、4kbyteを書くためには、まず当該 32kbyteを読み込み、4kbyte分を変更し、同時にどこかの1ブロックを消去し、32kbyteを書き込む必要がある。遅延処理である程度まとめられるにしても、本質的には遅い。
参考: http://www.kyoto-sr.co.jp/products/fugue/techinfo/fm-date.html
これは Raid5 や Raid6 が直面する問題と同じだ。Raid5や6は Stride という単位でIOを行うようにデザインされている。そして、1つのディスクに対しては SubStride という単位でIOする。例えば32kbyte SubStride,4+1構成だと、Stride サイズは 128kbyteであり、ファイルシステムがこのサイズ単位でIOしないと大幅に効率が悪くなるわけだ。
逆に Stride に align をあわせて、Stride サイズ単位で IO してやると、部分変更のとき必要だった「Stride を読み出して」の部分が丸々不要になる。データをいきなり書いて、書きながら Parity 計算、という行動に出ることができる。
ssd も同じはずだ。いきなり block 消去、block 書き込みだけでよくなる。理論上は若干早くなるはずだ。
例えばの例としてこれ:
http://www.numonyx.com/en-US/MemoryProducts/NAND/Pages/MLCLargePage.aspx
この製品の場合、block size が 256kbyteなので、256kbyte単位で書いてやれば書き込み速度はチップの提供する速度にほぼ近くなるはずだ。もし、裏でこれを8個並列に使っているなら、2Mbyte 単位でIOするべきだということになる。
.
で mkfs.ext3 あるいは mke2fs (名前が違うだけで同じプログラム)。
-E stride= というオプションがある。Raid5や6で使うもので、ようするに一発で書き込める最小単位を指定できるわけだ。これを使って stride size を 32kbyte とかに指定すると、ssd ってもっと早くなるんじゃないか? (もちろん、内蔵FlashMemoryのブロックサイズに依存するが)。
さっき喫茶店でお茶を飲んでいて、ふとそう思った。
が、実験をしようにもそのような実験ができる Linux マシンが無い。
誰かかわりにやってくれないかなー
ようするに人柱がどこかにいないか? というお話でした。
# ここにもすうでにやっている人がいるよ、という情報も希望。
多分だが…Intelなど一部の製品を除いて、並列度はそんなに高くないのではないかと。つまり 256kbyte/block はだいたい妥当なラインじゃないかなと思う。2Gbyteで 256kbyte/block なら8kblock あるということだ。128Gbyteの製品を作るにはこのチップが64個あればいい事になるので、512kblocks…。まぁまぁいい数字だと思うが…。
測定法 (スコア:1)
> 誰かかわりにやってくれないかなー
振るべきパラメータはわかりましたが、速さを測定する方法の希望を
指定しないと実験できません。
Re:測定法 (スコア:1)
「大切なおらの ssd の、数少ない書き込みチャンスを、そんなことで浪費するのはいやだ」
と皆に言われると思っていたので、ベンチマーク方法をまるっきり考えていませんでした _o_
多分、適当な disk のベンチマークテストをぶん回せばいいのだと思います。
あ、ちなみに。最近の mkfs.ext3 (つーか mke2fs)には -E stripe-width= というオプションがあり、そちらの方が賢そうです。古い方の stride= の説明は、stripe-width の説明を読むとものすごく意味不明に陥ります。
…それにしても私の Thinkpad T40 の電源ケーブルはどこへ行ったんだろう。こいつでテストしようと考えていたのに、いまだに発掘できない…
fjの教祖様
Re:測定法 (スコア:1)
(大体stride=32, 90; default, 74; stride=8, 80)
だけど、説明としてはmetadataのアクセスがまとまることに意味がありそうなのに
iozoneはファイルを一つしか作らないんだよね。
ディレクトリーを山のように作ったり、たくさんのファイルに書いてみたり
するベンチマークがじゃなきゃいけない気がするざんす。
disk のベンチマークテストではなくて、ファイルシステムのベンチマークを
したいんですよね?
Re:測定法 (スコア:1)
おぉ、実験ありがとうございます。iozone でdefaultに対して20%も差が出るのか。結構な差でもあり、内部での Read/Modify/Write 構造を考えると、ssd を disk 化する所で結構頑張ってるんだなぁ、とも感じる数字ですね。
メタデータにも効きますが、1つのファイルでも相応に効くと思います。ファイルに対するデータブロックの割り当てアライメントが ssd の block alignment に合うので。
他にも Journal なんかも alignment が合うはず(サイズ的にはMbyte単位なので最初から合っていると思うんですが)。
fjの教祖様