Engineering

OpenSolaris でエンタープライズにボロ負けしない自宅ストレージを

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 グループにします。

ichii386@oscar% pfexec zpool create tank raidz c5t0d0 c5t1d0 c5t2d0 c5t3d0 c5t4d0

320GB x 5 = 1.6TB のディスクが、パリティ 1 つとストライプ 4 みたいなかんじの構成で、1.4TB のストレージプールになりました。これでディスクが 1 つくらい壊れても大丈夫です。

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 サーバにもなりますけどね。例えばインストール先ディスクとか、ネットワーク上で共有されるディスクに置けないものもあって、ローカルディスクにみえたほうが都合がいいことも多いです。

ターゲット側のやりかたは簡単で、こんなかんじ。

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 ストライプしたもの

iscsi

まず bonnie++ の書き込み内容が圧縮効きすぎで、調査としては意味なさそうでした。100% でほとんど変わらないあたりは、イニシエータ側がボトルネックになっているようです。 random seek のところで manyrdsk が思ったより性能がよく、ZFS 層が 2 重になってないことが効いているようでした。そのぶんイニシエータの CPU を食いまくりですけど…。

うーん、なんかもう意味不明。

そんなところで

なんだかまとまりのない内容で申し訳ないですが、自宅でストレージやるならやっぱ OpenSolaris だよね、ってことでした。

OpenSolaris と ZFS なら、 RAID カードがなくても繋いだぶんのディスクで RAID 構成を自由に作れるし、エンタープライズ向けのストレージ製品についた機能も無料で利用することができます。ふつうのネットワークさえあれば iSCSI も使え、構成の自由度はほんと無限大です。

CPU ばっかり性能良くなって I/O がなかなか良くならない自宅サーバだけど、ZFS に CPU 使えばエンタープライズにボロ負けしないんだぜ! みんな使ってみよう!

あ、あと最後になりましたが、 @gree_tech ふぉろーしてね!