2011年06月19日 23:30 [Edit]

備忘録 - HP ProLiant MicroServer + FreeBSD + ZFS

Amazonで24,800円だったので半周遅れぐらいで買ってみた。

いいね!

コバQことCobalt Qube復活した感じ。


とはいえ、ある程度工夫しないとFreeBSD + ZFSでは使いづらい。半周遅れだけあって、すでに先人の苦労の後を追検証していくだけでよかったのだけど。

追加部品

PC3-10600 DIMM 4GB x 2枚セット
8GBで6000円ちょっと?そんな価格で大丈夫か?
USBメモリ(高速タイプ)
これが起動「ディスク」。右のようにして使う。8GBがちょうどいいのだけどたまたま在庫がなかったので16GBのやつを。
3.5'' 2TB HDD x (4+1)
何かとうわさの WD20EARS を。Amazonでも6000円ちょっと。最安値なら6000円を切る。同じ2TBでも1年半前の1/3ですか。一本は予備。

5インチベイに3.5インチHDDのリムーバルケースをつけるというのはまだやってない。

によると、本来CD-ROMでIDE互換モードのここをふつうのSATA2として使うためには、BIOSハックが必要なようだ。そこまでがんばるかなあというのが一つと、同一アレイのディスクを一台だけ別の場所に置くのもどうかな、と思ったので。きちんとやるならやはりSATAカード買って付けると思う。BIOSハックしてもPort Multiplier非対応のようだし。

BIOSの設定

デフォルトから一カ所変更するのは、[Advanced] → [IDE Configuration] Write CacheをOnにすること。これをしとかないといくらNCQを有効にしても速くならない。

FreeBSD-8.2-RELEASE-amd64のインストール

FreeBSD-8.2-RELEASE-amd64-memstick.imgを使って普通にインストールすればOK。あらかじめ他のマシンでやっておけば楽かも。私はVMWareでやった(笑)。二点だけ注意

  1. 起動パーティションは8GB以下にすること - そうでないと8GBの壁にぶつかる。i386では平気だったのに。久しぶりにこれで起動できない例にぶちあたった。
  2. /boot/loader.confkern.cam.boot_delay=10000を指定 - 正面の外部USBポートだとこれも不要だったのだけど、写真のように中に指す場合はこれが必須。

ahciを有効に

カーネルを再構築している人も多く見受けられたのだけど、8.2-RELEASE現在では、GENERICのままでも/boot/loader.confahci_load="YES"を指定するだけでOK。

指定前

ad4: 1907729MB  at ata2-master UDMA100 SATA 3Gb/s
ad6: 1907729MB  at ata3-master UDMA100 SATA 3Gb/s
ad8: 1907729MB  at ata4-master UDMA100 SATA 3Gb/s
ad10: 1907729MB  at ata5-master UDMA100 SATA 3Gb/s

指定後

ada0 at ahcich0 bus 0 scbus0 target 0 lun 0
ada0:  ATA-8 SATA 2.x device
ada0: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
ada0: Command Queueing enabled
ada0: 1907729MB (3907029168 512 byte sectors: 16H 63S/T 16383C)
ada1 at ahcich1 bus 0 scbus1 target 0 lun 0
ada1:  ATA-8 SATA 2.x device
ada1: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
ada1: Command Queueing enabled
ada1: 1907729MB (3907029168 512 byte sectors: 16H 63S/T 16383C)
ada2 at ahcich2 bus 0 scbus2 target 0 lun 0
ada2:  ATA-8 SATA 2.x device
ada2: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
ada2: Command Queueing enabled
ada2: 1907729MB (3907029168 512 byte sectors: 16H 63S/T 16383C)
ada3 at ahcich3 bus 0 scbus3 target 0 lun 0
ada3:  ATA-8 SATA 2.x device
ada3: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
ada3: Command Queueing enabled
ada3: 1907729MB (3907029168 512 byte sectors: 16H 63S/T 16383C)

これでNCQも有効になり、ホットスワップも出来るようになる(HP公式ではノンホットプラグだけど)。

/boot/loader.conf まとめ

この部分さえ適切に指定しておけば、あとは動かしながらでも調整できるのでまとめ。

kern.cam.boot_delay=10000
ahci_load="YES"
zfs_load="YES"
vfs.zfs.txg.timeout="5"

ここまでが事実上必須の設定で、残りはこんな感じ。NASとしてのみ使うのであればデフォルトのままでもいいけど、ちったあZFS以外にもメモリーを残しておくということで。

# Reserve Some memory for non-zfs tasks
#   http://d.akinori.org/2010/04/15/
#   + Some Tweak
kern.maxusers=512
vm.kmem_size="4G"
vm.kmem_size_max="6G"
vfs.zfs.arc_min="512M"
vfs.zfs.arc_max="4G"

AFT対策

Write Cache有効の効果ほどではなかったけど、一応は。

  1. /etc/rc.d/gnop_aftを以下のとおり作成。
    #!/bin/sh
    #
    # Original: http://d.akinori.org/2010/04/15/
    # renamed zfs_prepare to gnop_aft
    
    # PROVIDE: gnop_aft
    # BEFORE: zfs zvol
    
    . /etc/rc.subr
    
    name="gnop_aft"
    rcvar="gnop_aft_enable"
    start_cmd="gnop_aft_start"
    stop_cmd="gnop_aft_stop"
    #required_modules="geom_nop"
    
    aft_sector_size=4096
    
    gnop_aft_start()
    {
        [ `$SYSCTL_N security.jail.jailed` -ne 1 ] || return 0
        local dev
        for dev in $gnop_aft_devs; do
    	gnop create -S $aft_sector_size $dev
        done
    }
    
    gnop_aft_stop()
    {
        [ `$SYSCTL_N security.jail.jailed` -ne 1 ] || return 0
        local dev
        for dev in $gnop_aft_devs; do
    	gnop destroy $dev.nop
        done
    }
    
    load_rc_config $name
    run_rc_command "$1"
    
    mushaさんのオリジナルでは(portupgradeお世話になってます)、zfs_prepareという名前でしたがgnop自体はzfsとは無関係なのでrefactor。
  2. chmod +x /etc/rc.d/gnop_aft を忘れずに
  3. /etc/rc.confに以下を追加
    # ATF workaround via GEOM NOP -- see /etc/rc.d/gnop_aft
    gnop_aft_enable="YES"
    gnop_aft_devs="ada0 ada1 ada2 ada3"
    
  4. 念のために再起動して/dev/adaN.nopが生えていることを確認
  5. zpool createでada*.nopを指定

で、ada*ですが、パーティションは一切切らずに使っている。そこからブートするのであればとにかく、起動はUSBメモリーでやってるし、これならば交換ディスクは新品であれば刺すだけで使える。

ちなみに今まで別のどこかで使ったりしてパーティション済みのディスクは、

gpart destroy -F adan

すればOK。

zpoolを作成する

あとはzpoolを作成していろいろやってみればいいのだけど、実際どれにするか迷うところ。

結論から言うと、HP ProLiant MicroServer でディスク4本の場合はRAID10かRAID-Zがおすすめ。というよりRAID-Z2はちょっと荷が重い感じ。やはり2GHz以上のCPUと6本以上のHDDが欲しい。

とはいえ、私はこの非力な Athlon II Neo N36L というCPUが気に入った。AMDだけあって64bitにきちんと対応しているし(atomって対応しているのとそうでないのがあってわけがわからないよ)、未使用時にはただでさえ省電力なところにもってきて、powerd使うと

# sysctl dev.cpu.0.freq
dev.cpu.0.freq: 100

と100MHzまでクロックが落ちる。家庭で使うNASというのは普段実は何もしてないのだから、これは実に好都合。そうそう。FreeBSDでまだpowerd使ってない人は、

powerd_enable="YES"
powerd_flags="-a adp -n adp"

とした上でsh /etc/rc.d/powerd startしておくこと。今やノートパソコンだけではなくサーバーでもきちんと動きます。ポスト震災の新常識。

Simple Stripe (RAID0)
1073741824 bytes transferred in 3.175971 secs (338083003 bytes/sec)
Stripe of Mirrors (RAID10)
1073741824 bytes transferred in 4.497144 secs (238760829 bytes/sec)
raidz1 (better RAID5)
1073741824 bytes transferred in 5.718750 secs (187758133 bytes/sec)
raidz2 (better RAID6)
1073741824 bytes transferred in 7.782485 secs (137969019 bytes/sec)

見ての通り、raidz2を含めいずれも1Gbps = 125MBpsを超えているのだけど、RAID-Z2だと書き込み中のload average が4ぐらいになり、resilverに要する時間はRAID-Zの倍ぐらいに。有効容量も、RAID-Zでは75%なのに対しRAID-Z2では50%。RAID-Z2であればもっとパワフルなCPUとディスク数が欲しいところ。

で、実際にraidzで組んだzpoolに4GBほどのディスクイメージをiMacからAFPで読み書きした際のグラフが、こちら。

GbEが真っ黒。特に読み出し。

なお、/etc/sysctl.confvfs.zfs.txg.write_limit_override=1073741824を指定しておくと、書き込みがなめらかに。指定しない場合はこんな感じ。

見てのとおり実際にかかった時間はほとんど変わらないのでこれはオプショナルですが。

ZFSかわいいよZFS

1年半前はしかたなくLinux(Ubuntu)のmdでRAIDを組んだけど、出来ればZFSにしたかった。raidzならRAID Holeの心配もないし、リビルド時も全ディスクではなく使われた分しかしないのでその分速いし。

以下は実際に1Tほど使用された状態でscrubしてみた結果。

  pool: tank
 state: ONLINE
 scrub: scrub completed after 1h29m with 0 errors on Sun Jun 19 21:04:04 2011
config:

	NAME          STATE     READ WRITE CKSUM
	tank          ONLINE       0     0     0
	  raidz1      ONLINE       0     0     0
	    ada0.nop  ONLINE       0     0     0
	    ada1.nop  ONLINE       0     0     0
	    ada2.nop  ONLINE       0     0     0
	    ada3.nop  ONLINE       0     0     0

だいたい10GB/分というのが目安か。SATA-1なロートルサーバーでは8時間以上かかったのでずいぶん速くなったものです。

その間も恐ろしいくらい静かなうえ、scrub中も速度がほとんど落ちずに読み書きできるのにはびっくり。もちろんその分scrub完了時間は延びてしまいはするけど。

もう一台欲しくなってきました。そこに積めるべきデーターも大してないくせに…本を自炊してここに押し込みたくなる誘惑が…100MB/冊として6万冊…

Dan the Man with Too Much Storage to Fill


この記事へのトラックバックURL