パスワードを忘れた? アカウント作成
69352 journal

okkyの日記: ssd と mkfs.ext3 のオプション 4

日記 by okky

つーか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…。まぁまぁいい数字だと思うが…。

この議論は、okky (2487)によって ログインユーザだけとして作成されたが、今となっては 新たにコメントを付けることはできません。
  • by tslashn (37583) on 2009年03月15日 11時15分 (#1531210)
    > 実験をしようにもそのような実験ができる Linux マシンが無い。
    > 誰かかわりにやってくれないかなー

    振るべきパラメータはわかりましたが、速さを測定する方法の希望を
    指定しないと実験できません。
    • by okky (2487) on 2009年03月17日 2時18分 (#1532015) ホームページ 日記

      「大切なおらの ssd の、数少ない書き込みチャンスを、そんなことで浪費するのはいやだ」
      と皆に言われると思っていたので、ベンチマーク方法をまるっきり考えていませんでした _o_

      多分、適当な disk のベンチマークテストをぶん回せばいいのだと思います。

      あ、ちなみに。最近の mkfs.ext3 (つーか mke2fs)には -E stripe-width= というオプションがあり、そちらの方が賢そうです。古い方の stride= の説明は、stripe-width の説明を読むとものすごく意味不明に陥ります。

      …それにしても私の Thinkpad T40 の電源ケーブルはどこへ行ったんだろう。こいつでテストしようと考えていたのに、いまだに発掘できない…

      --
      fjの教祖様
      親コメント
      • by tslashn (37583) on 2009年03月18日 22時21分 (#1533382)
        iozoneでもやや効いているかのよう、
        (大体stride=32, 90; default, 74; stride=8, 80)
        だけど、説明としてはmetadataのアクセスがまとまることに意味がありそうなのに
        iozoneはファイルを一つしか作らないんだよね。
        ディレクトリーを山のように作ったり、たくさんのファイルに書いてみたり
        するベンチマークがじゃなきゃいけない気がするざんす。

        disk のベンチマークテストではなくて、ファイルシステムのベンチマークを
        したいんですよね?
        親コメント
        • by okky (2487) on 2009年03月20日 22時56分 (#1534925) ホームページ 日記

          おぉ、実験ありがとうございます。iozone でdefaultに対して20%も差が出るのか。結構な差でもあり、内部での Read/Modify/Write 構造を考えると、ssd を disk 化する所で結構頑張ってるんだなぁ、とも感じる数字ですね。

          メタデータにも効きますが、1つのファイルでも相応に効くと思います。ファイルに対するデータブロックの割り当てアライメントが ssd の block alignment に合うので。
          他にも Journal なんかも alignment が合うはず(サイズ的にはMbyte単位なので最初から合っていると思うんですが)。

          --
          fjの教祖様
          親コメント
typodupeerror

アレゲは一日にしてならず -- アレゲ研究家

読み込み中...