9/07/2009

ZFSのRAIDZの書き込み速度測定

Mac OS 10.5などにも採用されているZFSのRAID性能を調査するために、OpenSolaris上で、ZFSのRAID0、 RAID1、 RAIDZの書き込み速度を測定してみました。ハードディスクと比べて低速なUSBメモリにZFSを構築していますので速度差はわかりやすいと思います。ZFSでCIFSやiSCSIのインタフェースも設定できるので、サーバ管理者の方やVMで遊んでいる人の参考になればと思います。

使用したマシンは以下のとおり。ってprtdiagが正常に出ていませんが・・・、プロセッサは標準のAMD Athlon™ プロセッサー 1640B(2.7GHz、512KB L2)。
root@opensolaris:~# uname -a
SunOS opensolaris 5.11 snv_101b i86pc i386 i86pc
root@opensolaris:~# prtdiag -v
System Configuration: HP ProLiant ML115 G5
BIOS Configuration: HP O18     05/26/2008
BMC Configuration: IPMI 2.0 (KCS: Keyboard Controller Style)

==== Processor Sockets ====================================

Version                          Location Tag
-------------------------------- --------------------------
 PROCESSOR

==== Memory Device Sockets ================================

Type        Status Set Device Locator      Bank Locator
----------- ------ --- ------------------- ----------------
Unknown     in use 1   DIMM1
Unknown     in use 1   DIMM2
Unknown     in use 1   DIMM3
Unknown     in use 1   DIMM4

==== On-Board Devices =====================================

==== Upgradeable Slots ====================================

ID  Status    Type             Description
--- --------- ---------------- ----------------------------
1   available PCI              PCI Slot
2   available PCI Express      PCIE X1
3   available PCI Express      PCIE X8
4   available PCI Express      PCIE X16
formatでのUSBメモリの初期化手順は下記のとおり。KingstonのUSBメモリ2Gが3つ接続されています。
root@opensolaris:~# format -e
AVAILABLE DISK SELECTIONS:
        0. c3t0d0 <DEFAULT cyl 19454 alt 2 hd 255 sec 63>
             /pci@0,0/pci103c,1714@5/disk@0,0
        1. c3t1d0 <DEFAULT cyl 60797 alt 2 hd 255 sec 126>
             /pci@0,0/pci103c,1714@5/disk@1,0
         2. c4t0d0 <DEFAULT cyl 60797 alt 2 hd 255 sec 126>
             /pci@0,0/pci103c,1714@5,1/disk@0,0
         3. c4t1d0 <DEFAULT cyl 60797 alt 2 hd 255 sec 126>
             /pci@0,0/pci103c,1714@5,1/disk@1,0
         4. c6t0d0 <Kingston-DataTraveler2.0-PMAP cyl 965 alt 2 hd 128 sec 32>
             /pci@0,0/pci103c,1714@2,1/hub@8/storage@2/disk@0,0
         5. c7t0d0 <Kingston-DataTraveler2.0-PMAP cyl 965 alt 2 hd 128 sec 32>
             /pci@0,0/pci103c,1714@2,1/hub@8/storage@3/disk@0,0
         6. c8t0d0 <Kingston-DataTraveler2.0-PMAP cyl 966 alt 2 hd 128 sec 32>
            /pci@0,0/pci103c,1714@2,1/hub@8/storage@4/disk@0,0
Specify disk (enter its number): 4
selecting c6t0d0
format>fdisk
SELECT ONE OF THE FOLLOWING:
 1. Create a partition
 2. Specify the active partition
 3. Delete a partition
 4. Change between Solaris and Solaris2 Partition IDs
 5. Exit (update disk configuration and exit)
 6. Cancel (exit without updating disk configuration)
で、fdiskコマンドにより2Gのメモリを100%使用してパーティションを作成します。キーボードでは、3, 1, y, 1, 100, y と順に入力。その後labelコマンドでlabel設定したら完了。この作業を3つのUSBメモリに対して行います。
[disk formatted]

No fdisk solaris partition found.
             Total disk size is 968 cylinders
             Total disk size is 968 cylinders
             Cylinder size is 4096 (512 byte) blocks

                                               Cylinders
      Partition   Status    Type          Start   End   Length    %
      =========   ======    ============  =====   ===   ======   ===
          1       Active    Solaris2          1   967     967    100

format> label
[0] SMI Label
[1] EFI Label
Specify Label type[0]: 0
Ready to label disk, continue? y

format>quit
では、はじめにUSBメモリ1本で書き込み速度測定。この値と比べていきます。
root@opensolaris:/# zpool create -f usbflush c6t0d0
root@opensolaris:/# zpool list
NAME       SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
rpool      149G  6.39G   143G     4%  ONLINE  -
usbflush  1.88G  73.5K  1.87G     0%  ONLINE  -
root@opensolaris:/# time mkfile 1g /usbflush/1g
real    3m50.635s
user    0m0.003s
sys    0m0.353s
RAID0のUSBメモリ2本で書き込み速度測定。おっ!
root@opensolaris:/# zpool create -f usbflush c6t0d0 c7t0d0
root@opensolaris:/# zpool list
NAME       SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
rpool      149G  6.39G   143G     4%  ONLINE  -
usbflush  3.75G    75K  3.75G     0%  ONLINE  -
root@opensolaris:/# time mkfile 1g /usbflush/1g
real    1m47.244s
user    0m0.003s
sys    0m0.355s
RAID0のUSBメモリ3本で書き込み速度測定。おおっ!
#zpool create -f usbflush c6t0d0 c7t0d0 c8t0d0
# zpool list
NAME       SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
rpool      149G  6.38G   143G     4%  ONLINE  -
usbflush  5.62G    84K  5.62G     0%  ONLINE  -
root@opensolaris:/usbflush# time mkfile 1g ./1g
real    1m5.408s
user    0m0.004s
sys    0m0.368s
RAID1のUSBメモリ2本で書き込み速度測定。う~ん。こうなるよね。
root@opensolaris:/# zpool create -f usbflush mirror c6t0d0 c7t0d0
root@opensolaris:/# zpool list
NAME       SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
rpool      149G  6.39G   143G     4%  ONLINE  -
usbflush  1.88G  73.5K  1.87G     0%  ONLINE  -
root@opensolaris:/# time mkfile 1g /usbflush/1g
real    3m53.042s
user    0m0.003s
sys    0m0.352s
RAIDZのUSBメモリ3本で書き込み速度測定。おおお!
root@opensolaris:/# zpool create -f usbflush raidz c6t0d0 c7t0d0 c8t0d0
root@opensolaris:/# zpool list
NAME       SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
rpool      149G  6.39G   143G     4%  ONLINE  -
usbflush  5.62G   141K  5.62G     0%  ONLINE  -
root@opensolaris:/# time mkfile 1g /usbflush/1g
real    2m48.438s
user    0m0.004s
sys    0m0.366s
というわけで、結果としてはRAID0のUSBメモリ3本が一番速い。とは言えRAID0はメモリに障害が起きた場合に復旧できないので、RAID1かRAIDZを使うと思うんだけど、でRAID1よりもRAIDZの方が速かった。(予想できる内容だったけど、一応検証しないとね・・・)

簡単に説明すると、

RAID0は1つのデータを複数のストレージにまたがって読み書きするため、1ストレージあたりの読み書きする量が少なくなり、読み書きする時間が減る。2ストレージ使った時は1ストレージの約1/2の時間。3ストレージ使った場合は1ストレージ約1/3の時間。

RAID1は1つのデータを2つのストレージにそれぞれ同じ内容を書き込むため、1ストレージの時と読み書きする時間が変わらない。

RAIDZは3ストレージの場合、1つのデータを2ストレージと、データ復旧用のパリティとして1ストレージに書き込むため、RAID0のように1ストレージに書き込む量が少なくなるため速くなる。約2/3の時間かな。

ZFSは、今の環境に不満があれば環境を拡張できるのがいい。あと、RAIDZで組まれた複数のストレージプールを、RAID0で組み合わせることもできるので、もっと効率の良いストレージプールを作ることもできる。素晴らしい!

是非!!

下記のサイトを参考にさせて頂きました。
Solaris ZFS 管理ガイド
USBメモリで ZFS ! : やっぱり Sun がスキ!

OpenSolarisの本
OpenSolarisスタートアップバイブル

この本読んでみたい
Solaris ZFS Essentials (Solaris Series)