内部処理を4KB/sectorで行うというWD Caviar Green (Advanced Format)シリーズのハードディスク、WD15EARSを調達したので性能を見てみる。昨日の記事の通り、OSはFreeBSD 8/amd64、接続インターフェースはeSATAである。
まず、単体のraw書き込み性能を見てみる。
% sudo dd if=/dev/zero of=/dev/ada0 bs=1M count=10000
10000+0 records in
10000+0 records out
10485760000 bytes transferred in 104.850489 secs (100006782 bytes/sec)
つまり100MB/s弱だ。eSATAインターフェースカードで律速していないかは、後日内蔵SATAと比較するとしよう。
それでは、一台まるごとZFSにしてbonnie++で測ってみる。
% sudo zpool create test ada0
% sudo bonnie++ -d /test -n 64:102400:128:8 -u root
Writing a byte at a time...done
[...]
Version 1.96 ------Sequential Output------ --Sequential Input- --Random-
Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP
daemon.musha.or 16G 138 99 58072 13 28952 6 420 99 82789 9 86.6 2
Latency 197ms 6496ms 8717ms 46942us 1645ms 2071ms
Version 1.96 ------Sequential Create------ --------Random Create--------
daemon.musha.org -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files:max:min /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
64:102400:128/8 139 3 82 1 17323 77 92 2 52 0 48 0
Latency 41400ms 5563ms 81225us 34264ms 6496ms 9847ms
1.96,1.96,daemon.musha.org,1,1271143734,16G,,138,99,58072,13,28952,6,420,99,82789,9,86.6,2,64,102400,128,,8,139,3,82,1,17323,77,92,2,52,0,48,0,197ms,6496ms,8717ms,46942us,1645ms,2071ms,41400ms,5563ms,81225us,34264ms,6496ms,9847ms
% sudo zpool destroy test
…うーん、シーケンシャル書き込みが58MB/sとはちょっとさびしい。
ところで、このディスクはどのように諸元情報を返しているのだろうか。
% sudo camcontrol identify ada0 | grep 'sector size'
sector size logical 512, physical 512, offset 0
古いOSの互換性のためなのか、physical sector sizeも512Bと返しているようだ。ジャンパー設定を調べたが、残念ながらこれを変えることはできない模様。
それでは、GEOMを使って4KB/sectorでアクセスするようにしてみよう。
% sudo gnop create -S 4096 ada0
% sudo zpool create test ada0.nop
% sudo bonnie++ -d /test -n 64:102400:128:8 -u root
Writing a byte at a time...done
[...]
Version 1.96 ------Sequential Output------ --Sequential Input- --Random-
Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP
daemon.musha.or 16G 129 99 68255 15 38455 8 434 99 88872 9 100.1 2
Latency 64647us 5964ms 6305ms 37390us 1907ms 1397ms
Version 1.96 ------Sequential Create------ --------Random Create--------
daemon.musha.org -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files:max:min /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
64:102400:128/8 776 19 115 1 17922 82 790 20 110 1 21075 96
Latency 7490ms 1116ms 108ms 7415ms 1015ms 22992us
1.96,1.96,daemon.musha.org,1,1271239571,16G,,129,99,68255,15,38455,8,434,99,88872,9,100.1,2,64,102400,128,,8,776,19,115,1,17922,82,790,20,110,1,21075,96,64647us,5964ms,6305ms,37390us,1907ms,1397ms,7490ms,1116ms,108ms,7415ms,1015ms,22992us
% sudo zpool destroy test
% sudo gnop destroy ada0.nop
おー。シーケンシャル書き込みだけ見ても68MB/sと15%以上もスループットが向上し、latencyも大幅に改善した。
さらに、2台でストライピングしてみるとこうなった。
Version 1.96 ------Sequential Output------ --Sequential Input- --Random-
Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP
daemon.musha.or 16G 138 98 94311 22 58070 12 431 99 123342 13 172.8 5
Latency 155ms 3874ms 4034ms 38783us 990ms 730ms
Version 1.96 ------Sequential Create------ --------Random Create--------
daemon.musha.org -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files:max:min /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
64:102400:128/8 1123 29 134 1 16901 80 1062 27 111 1 18945 88
Latency 3282ms 1121ms 53040us 4831ms 910ms 4748us
1.96,1.96,daemon.musha.org,1,1271168105,16G,,138,98,94311,22,58070,12,431,99,123342,13,172.8,5,64,102400,128,,8,1123,29,134,1,16901,80,1062,27,111,1,18945,88,155ms,3874ms,4034ms,38783us,990ms,730ms,3282ms,1121ms,53040us,4831ms,910ms,4748us
シーケンシャルで94MB/s。不満は残るがとりあえずよしとしよう。
ところで、gnop(8)の設定は保存されないので、起動するたびに設定する必要がある(つまり、起動用のシステムを構成するボリュームでは使えないと思った方がよさそう)。というわけで、こんな風なスクリプトを書いて/etc/rc.d/に置き、
#!/bin/sh
# PROVIDE: zfs_prepare
# BEFORE: zfs zvol
. /etc/rc.subr
name="zfs_prepare"
rcvar="zfs_prepare_enable"
start_cmd="zfs_prepare_start"
stop_cmd="zfs_prepare_stop"
#required_modules="geom_nop"
zfs_prepare_start()
{
[ `$SYSCTL_N security.jail.jailed` -ne 1 ] || return 0
local dev
for dev in $zfs_prepare_devs; do
gnop create -S 4096 $dev
done
}
zfs_prepare_stop()
{
[ `$SYSCTL_N security.jail.jailed` -ne 1 ] || return 0
local dev
for dev in $zfs_prepare_devs; do
gnop destroy $dev.nop
done
}
load_rc_config $name
run_rc_command "$1"
/etc/rc.confに設定する。
zfs_prepare_enable="YES"
zfs_prepare_devs="ada0 ada1 ada2"
これで無事、nopデバイスが起動時にできるので、好きに使ってプールを構成すればいい。
外付け箱にはとりあえず3台積んでストライプし、内蔵している移行元HDDからのそこへのコピーが済んだら、古い内蔵HDD群を換装してada[0-2]にそれぞれattachすれば、RAID1+0のような構成になるだろう。空いたスロットには、起動ドライブのミラーボリュームを入れるつもり。
メンテナンスに入るときに、ホットスワップもテストしてみたい。夢が広がるよ!