1SSD+5HDD
パーツが揃ったので、早速ML115に組み込んで動かしてみました。
atacontrol list で見るとこんな感じ。
Master: acd0 <TSSTcorp CD-ROM TS-H192C/B504> ATA/ATAPI revision 0 Master: ad4 <INTEL SSDSA2M040G2GC/2CV102HD> SATA revision 2.x Master: ad6 <WDC WD20EARS-00MVWB0/50.0AB50> SATA revision 2.x Master: ad8 <WDC WD20EARS-00MVWB0/51.0AB51> SATA revision 2.x Master: ad10 <WDC WD20EARS-00MVWB0/51.0AB51> SATA revision 2.x Master: ad16 <WDC WD20EARS-00MVWB0/51.0AB51> SATA revision 2.x Master: ad18 <WDC WD20EARS-00MVWB0/51.0AB51> SATA revision 2.x
gpart show で見るとこんな感じ。WD20EARSからはブートさせないので、パーティションタイプはMBRではなく、AFTに合わせるのに都合のいいGPTにしています。
いわゆるAFTを採用しているHDDは、従来の8倍にあたる4096byte単位でアクセスしないと本来の性能が出せないようです。従来通りの512byte単位でのアクセス要求が来た場合は、実際には4096byte単位で行うアクセスを、コントローラが疑似的に512byte単位に見せかける処理を行っているのですね。これが性能が出せない原因になっています。
ファイルシステムのinodeあたりの大きさは、最近の大容量HDDを使う場合は4096byteもしくはその倍数を使うことが多いので、ファイルシステムとしては4096byte単位で使われているように見えます。なのですが、パーティションの切れ目が4096byteの切れ目と合っていないと、常に「疑似的に合わせる処理」が動いてしまいます。
一般的に、HDDの先頭部分には、ファイルシステムとしては使えない予約領域があり、MBRスキームの場合はこれが63ブロック、GPTの場合は34ブロックであることが多いです。ここでいう「ブロック」は「セクタ」と同義で、1個のサイズが512byteであるため、512byte単位のアクセスなら気にしなくていいのですが、4096byte単位の場合は、パーティションを4096byteの切れ目、つまり8の倍数のブロックから始まるように切らないと、性能が出ないことになります。
このため、最初の数ブロックは未使用領域としてスキップして、MBRの場合は64、GPTの場合は40からパーティションを切り始めれば良さそうです。今回はGPTなので、スタートブロックとして40を指定し、実際にそのようになっています。
今回はGPTにしたので、以下はやや蛇足気味ですが、MBRの場合は、パーティション設定ツール(gpartやfdisk)が、パーティションの切れ目(スタートブロック)を、自動的に63の倍数に合わせてしまうようで、64を指定しても126(64より大きい最小の63の倍数)になってしまいます。これはおそらく、HDDの物理的な構成(63sectors/track)に影響を受けているのだと思われます。ですので、MBRの場合は最初のパーティションのスタートブロックを504(63と8の最小公倍数)にする形が良さそうです。
=> 34 3907029101 ad6 GPT (1.8T) 34 6 - free - (3.0K) 40 3907028992 1 freebsd-zfs (1.8T) 3907029032 103 - free - (52K) => 34 3907029101 ad8 GPT (1.8T) 34 6 - free - (3.0K) 40 3907028992 1 freebsd-zfs (1.8T) 3907029032 103 - free - (52K) => 34 3907029101 ad10 GPT (1.8T) 34 6 - free - (3.0K) 40 3907028992 1 freebsd-zfs (1.8T) 3907029032 103 - free - (52K) => 34 3907029101 ad16 GPT (1.8T) 34 6 - free - (3.0K) 40 3907028992 1 freebsd-zfs (1.8T) 3907029032 103 - free - (52K) => 34 3907029101 ad18 GPT (1.8T) 34 6 - free - (3.0K) 40 3907028992 1 freebsd-zfs (1.8T) 3907029032 103 - free - (52K)
この5台でRAID-Zを組みます。せっかくSSDがあるので、その一部を ZIL(logs) の領域として使うようにしました。
zpool status で見るとこんな感じ。
pool: tank state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 raidz1 ONLINE 0 0 0 ad6p1 ONLINE 0 0 0 ad8p1 ONLINE 0 0 0 ad10p1 ONLINE 0 0 0 ad16p1 ONLINE 0 0 0 ad18p1 ONLINE 0 0 0 logs ONLINE 0 0 0 ad4s2 ONLINE 0 0 0 errors: No known data errors
SSDなad4を、2スライス+意図的な未使用領域に分けて、ad4s1はFreeBSDのシステム領域、ad4s2はZILのログ領域にしています。未使用領域を残しているのは、Trimが使えるようになるまで(正確にはFreeBSDのAHCIドライバがMCP55をサポートするまで)の対策のためです。
=> 63 78165297 ad4 MBR (37G) 63 58719969 1 freebsd [active] (28G) 58720032 8388576 2 freebsd [active] (4.0G) 67108608 11056752 - free - (5.3G) => 0 58719969 ad4s1 BSD (28G) 0 1048576 2 freebsd-swap (512M) 1048576 4194304 1 freebsd-ufs (2.0G) 5242880 16777216 4 freebsd-ufs (8.0G) 22020096 8388608 5 freebsd-ufs (4.0G) 30408704 2097152 6 freebsd-ufs (1.0G) 32505856 26214113 7 freebsd-ufs (12G)
WD20EARS は 2TB(≒1.8TiB) なので、この RAID-Z 全体としては 8TB(≒7.2TiB) ということになります。この zpool を、zfs でファイルシステムとして切り分けます。
REGZAから認識できるLANストレージは8つまでで、1つにつき4TiBとのことですので、まずここに4TiB。次にMySQLのDB領域に1TiB。私のHOME配下の作業領域に2TiBという感じで割り当てました。あと0.2TiBぐらい余っていますが、そもそもzfs/zpoolはそのあたりを上手に制御していて、はじめからきっちり分けておく必要はない(あとからの増減も簡単)ので、このへんはわりと適当です。
[…] 価格の話のついでに、自宅の 8TB RAID-Z サーバのパーツ購入時の価格をメモ的に。1,000円未満四捨五入で。(てきとう) […]