OpenSolaris でエンタープライズにボロ負けしない自宅ストレージを
こんにちは、いちいです。
さて、みなさまのご自宅にはすでに OpenSolaris が動いた自宅サーバがあるかと思います。最近は地デジの番組を録画するとか、デジカメで撮った写真を貯めたりとか、自宅ストレージの需要も増えてきました。単体 HDD の容量も増え、また HDD ベイがいくつか付いた外付けケースのような、いわゆる自宅 NAS 製品も増えてきました。
しかし、これらは容量/構成の拡張性や耐障害性、またなんといっても性能 (ディスクアクセスの速度) に不満も多いかもしれません。そんなとき OpenSolaris の ZFS を使えば、こんなに安価にそれなりの性能がでるんだ、ということを紹介したいと思います。
ちょっとマニアックな方なら自宅で HBA/FC なんて当たり前、ちょっとすれば InfiniBand が普通の時代です。当然テープドライブの 1 つくらい用意しておかなきゃいけません。そんなとき、「どんな target mode だって用意してあるよ」な OpenSolaris は大活躍です。
おうちのサーバ
まずは私の自宅にあるサーバを紹介します。先日いままで使っていたマシンのファンが壊れて、最近のパーツでほぼ 1 から新調してみました。
分類 | 名前 | 単価 | 数量 | 金額 |
CPU | Intel Core i5 650 BOX | ¥18,480 | 1 | ¥18,480 |
M/B | Intel DH57DD | ¥12,480 | 1 | ¥12,480 |
メモリ | A-DATA AD3U1333B2G9-DRH | ¥11,670 | 2 | ¥23,340 |
HDD | HITACHI Travelstar 5K500.B HTS545032B9A300 (320GB 9.5mm) | ¥4,580 | 5 | ¥22,900 |
電源 | オウルテック SS-650KM | ¥22,500 | 1 | ¥22,500 |
ケース | Abee AS Enclosure 50D | ¥28,690 | 1 | ¥28,690 |
最近のマザーボードは SATA ポートが 6 つあるので、前からあった 3.5 インチのディスクを起動ディスクとし、ストレージ用に 2.5 インチ HDD を 5 台積むことにしました。自宅なのでスペースと騒音は結構大きな問題であり、奥行きの小さいケースと電源もちょっといいやつを選んでいます。また、インテルのマザーボードは e1000g の NIC が付いているものです。
これで、合計 128,390 円。ってけっこう高いですね。ケースとかもうちょい節約できると思います...。
5 台の HDD をどうする?
まずはいつも通り OpenSolaris snv_134 をインストールし、 5 台のディスクを ZFS で RAID5 相当の raidz1 グループにします。
1 |
ichii386@oscar% pfexec zpool create tank raidz c5t0d0 c5t1d0 c5t2d0 c5t3d0 c5t4d0 |
320GB x 5 = 1.6TB のディスクが、パリティ 1 つとストライプ 4 みたいなかんじの構成で、1.4TB のストレージプールになりました。これでディスクが 1 つくらい壊れても大丈夫です。
1 2 3 |
ichii386@oscar% zpool list tank NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT tank 1.45T 11.3G 1.44T 0% 1.00x ONLINE - |
ZFS の詳細は省略しますが、たとえばパリティディスクを 2 つに増やすとか、Copy-On-Write なスナップショットを定期的に取るとか、ファイルシステム層で gz 圧縮をするとか、ブロック単位で重複排除とか、なんでもやり放題です。さすが OpenSolaris ですね!
性能はどんなもん?
まじめに性能評価するなら、そもそも何に使うの? って話になるんですけど、そういうのは気にしないことにして、 bonnie++ で簡単なベンチマークをしてみました。
比較対象は以下のとおり。
-
自作
- Core i5 650 3.2GHz, 8GBメモリ, 320GB SATA x5, 12万円
-
SPARC
- Sun SPARC Enterprise T5220, UltraSPARC-T2 1.4GHz 8コア64スレッド, 32GBメモリ, 146GB SAS x2, 400万円くらい?
- エンタープライズ感プンプンのすごいサーバ
- 起動ディスクとは別のディスクスライスをそのままプールにしました。
-
SPARC/SSD
- SPARC に 24GB の SSD x4 を載せたもの, +定価150万円くらい?
- 超高級なエンタープライズ感満載な SSD です。
- 諸都合あって 4 ストライプした 96GB のプールにしました。
-
X4540
- Sun Fire X4540, Quad-Core AMD Opteron 2384 x2, 32GBメモリ, 1TB SATA x48, 定価1,000万円くらい?
- いわゆるストレージサーバ製品です。
- 11 本のディスクを raidz2 グループにしたものを、さらに 4 つストライプして 40TB のプールにしてあります
1 スレッドで動く bonnie++ で SPARC が不利なのは当たり前なですが、SPARC を 100% としたグラフにしました。全部載せてるときりがないので、 put/get を char/block 単位でやったもの, random の lseek とその %CPU だけ載せました(詳しくは bonnie のサイトを見てください)。 sync/nosync は、bonnie++ の -b オプションの有無です。
ほら、世代が違うとはいえ、価格差 20 倍以上でけっこう健闘してるでしょ。
高級な SSD の random seek 性能はやっぱ圧倒的です。そして 10 x 4 ストライプの block read もすごい。自作の random seek が遅いのはやっぱりコンシューマ向け製品というかんじですが、全然ダメってことはないように思います。
ストレージへのアクセス手段
さて、そこそこの性能が出るストレージは用意できたとして、これにどうやってアクセスしましょうか。あくまでこのサーバはサーバであって、日常生活をするクライアントマシンとは分離してあげたいです。
OpenSolaris では COMSTAR という仕組みがあって、たとえばサーバ内のストレージ (ブロックデバイス) を FC や IB ターゲットとして外に見せる機能があります。といってもまたカードとかケーブルとか専用スイッチとか買うのも大変なので、ここはお気楽に iSCSI です。
いや、もちろん NFS や CIFS サーバにもなりますけどね。例えばインストール先ディスクとか、ネットワーク上で共有されるディスクに置けないものもあって、ローカルディスクにみえたほうが都合がいいことも多いです。
ターゲット側のやりかたは簡単で、こんなかんじ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
ichii386@oscar% pfexec pkg install network/iscsi/initiator network/iscsi/target ... ichii386@oscar% pfexec zfs create -V 500G tank/export/iscsi ichii386@oscar% pfexec stmfadm create-lu /dev/zvol/rdsk/tank/export/iscsi Logical unit created: 600144F00800277844CC4BFE27F60001 ichii386@oscar% pfexec stmfadm add-view 600144F00800277844CC4BFE27F60001 ichii386@oscar% pfexec stmfadm list-lu -v LU Name: 600144F00800277844CC4BFE27F60001 Operational Status: Offline Provider Name : sbd Alias : /dev/zvol/rdsk/tank/export/iscsi View Entry Count : 1 Data File : /dev/zvol/rdsk/tank/export/iscsi Meta File : not set Size : 536870912000 Block Size : 512 Management URL : not set Vendor ID : SUN Product ID : COMSTAR Serial Num : not set Write Protect : Disabled Writeback Cache : Enabled Access State : Active |
あとは Windows でも MacOS でもなんでもいいからイニシエータ側の設定をしてあげれば、500GB のローカルディスクが増えたように見えます。 iSCSI 対応の NAS 箱って安くても 10 万円くらいしますから、なんとお手軽なんでしょう!
iSCSI でいろいろな構成を
ZFS では物理ディスクの RAID レベルを、ストレージプール作成時にいろいろ選べます。これを iSCSI で外出しし、さらにイニシエータ側も OpenSolaris にすれば、さらに様々な構成ができます。
たとえば 3 台のターゲットから 3 本のディスクをもらって、それをミラーやストライプ、RAID5 構成にすることができます。ターゲット側のディスクが壊れても大丈夫なのは当然として、イニシエータ側にとってもターゲットマシンが 1 つくらい死んでも大丈夫、ということです。
また、外出しするディスクの容量はターゲット側で決められるので、容量の違う物理ディスクが転がっているのを有効利用できるかも知れません。さらにターゲット側で ZFS の圧縮機能を使えば、イニシエータ側の負荷を増やさずに圧縮ができます。
ただし、 ZFS 層が 2 重に入ってその分のオーバヘッドもあり、パフォーマンス的にはなかなかむずかしいところです。自宅サーバではないですが、いくつかのパターンを比較してみました。イニシエータはすべて SPARC で、さっき同様ローカルの SAS ディスクを 100% としています。
-
SPARC
- さっきのローカル SAS ディスク
-
single
- X4500 (さっきの X4540 より少ししょぼいサーバ) で、 11 本のディスクを raidz2 グループにしたものを、さらに 4 つストライプして 30TB のプールがある
- プールから 10TB のボリュームを切りだして iSCSI で外出ししたもの。
-
single/lzjb
- single にさらに圧縮機能を on にしたもの
-
stripe3
- single と同じものを 3 台用意して、イニシエータでストライプ
-
manyrdsk
- stripe3 でつかったサーバから、44 本のディスクスライスをそのまま iSCSI で外出し (ターゲットでは ZFS 層は使わない)
- イニシエータでは 44 x 3 = 132 本のディスクを、 11 本の raidz2 グループにしてさらに 12 ストライプしたもの
まず bonnie++ の書き込み内容が圧縮効きすぎで、調査としては意味なさそうでした。100% でほとんど変わらないあたりは、イニシエータ側がボトルネックになっているようです。 random seek のところで manyrdsk が思ったより性能がよく、ZFS 層が 2 重になってないことが効いているようでした。そのぶんイニシエータの CPU を食いまくりですけど...。
うーん、なんかもう意味不明。
そんなところで
なんだかまとまりのない内容で申し訳ないですが、自宅でストレージやるならやっぱ OpenSolaris だよね、ってことでした。
OpenSolaris と ZFS なら、 RAID カードがなくても繋いだぶんのディスクで RAID 構成を自由に作れるし、エンタープライズ向けのストレージ製品についた機能も無料で利用することができます。ふつうのネットワークさえあれば iSCSI も使え、構成の自由度はほんと無限大です。
CPU ばっかり性能良くなって I/O がなかなか良くならない自宅サーバだけど、ZFS に CPU 使えばエンタープライズにボロ負けしないんだぜ! みんな使ってみよう!
あ、あと最後になりましたが、 @gree_tech ふぉろーしてね!