OpenSolaris自作ストレージベンチマーク Vol.01

OpenSolarisを使用したiSCSIのストレージですが、使用するにあたってチューニングをどうしようかというところでベンチマークをとってみました。
パラメータの設定によってパフォーマンスが大きく変わるのはわかっていたんですが、実際にどういうプール構成にすればいいかというところで検証をかねてデータ化してみました。今回はとりあえずRAID-Zでプールを構築しています。

基本的にZFSはチューニング不要をひとつの目的としたファイルシステムなんですが、iSCSIストレージとして使うに当たりデフォルトではパフォーマンスがでないとよく言われます。

ZFSのチューニングで有名なものだと下記のページが参考になると思います。
ZFS Evil Tuning Guide - Siwiki

具体的にどうするか

一番ありふれたものとしてzfs_nocacheflushとzil_disableパラメータの設定が上げられると思います。
今回はこの設定の違いによるベンチをとってみました。

zfs_nocacheflush
ディスクキャッシュを随時flushさせるのがデフォルトですが、これを無効にしてディスクのwrite back cacheを有効にします。電源障害が起きたときにデータの整合性がとれなくなる可能性があります。デフォルトは0。
zil_disable
ZIL(ZFS Intent Log)を無効にします。zfs_nocacheflush同様電源障害が起きたときにデータの整合性がとれなくなる可能性があります。デフォルトは0。

自分が知っている限りでは、このパラメータの切り替えには2通りの方法があります。

  • 起動時に設定を反映させる場合は、/etc/systemに以下を追記してシステム再起動
set zfs:zfs_nocacheflush=1
set zfs:zil_disable=1
  • 起動中に一時的に設定
# echo zfs_nocacheflush/W0t1 | mdb -kw
# echo zil_disable/W0t1 | mdb -kw

戻す場合はt1の部分をt0にすればOKです。

現在の設定は以下のコマンドで確認できます。

# echo zfs_nocacheflush/D | mdb -k
zfs_nocacheflush:
zfs_nocacheflush:               0

# echo zil_disable/D | mdb -k
zil_disable:
zil_disable:    0

測定環境

  • ストレージサーバ
マザー MSI X58M
CPU Coire i7 920 2.66GHz Hyper-Threading on
メモリ 6G
OS OpenSolaris 2009.06
HDD すべてSeagate SATA ST3808110AS 80G
SSD intel X25-M 80G
NIC Intel intel Gigabit CT Desktop Adapter EXPI9301CT
  • クライアントPC
マザー MSI X58M
CPU Coire i7 920 2.66GHz Hyper-Threading on
OS Windows XP SP3
NIC Intel intel Gigabit CT Desktop Adapter EXPI9301CT
  • ベンチマーク測定
    • CrystalDiskMark3.0 ベータ2
    • ベータですが、基本NCQ以外のベンチ部分は基本的にCrystalDiskMark2.2.0と変わらないです。
  • 測定条件
    • iSCSIストレージプール設定
      • RAID-Z(D3+P1) ZILデバイス無し shareiscsi=on
      • RAID-Z(D3+P1) ZILデバイス無し COMSTAR
      • RAID-Z(D2+P1+ZIL1) shareiscsi=on
      • RAID-Z(D2+P1+ZIL1) COMSTAR
      • RAID-Z(D3+P1+ZIL1) COMSTAR
      • RAID-Z(D3+P1+HDD-ZIL1) COMSTAR
    • 測定データサイズはすべて100M(後述)
  • 備考
    • ストレージとサーバはDELL PowerConnect 2724のギガビット対応スイッチで接続
    • ジャンボフレームなどのチューニングはなしでデフォルトのまま
    • Microsoft iSCSI Software Initiator Version 2.08から接続
    • Netperfによる測定ではSend Socket Size 32kの場合で947.34bits/s(オプション指定:-H サーバIP -- -s 32768)
    • 余談ですが、SSDを使用する場合には20Gの未使用領域をパテ切りで確保してから使用しています
ベンチマークのテストサイズについて

CrystalDiskMarkでのHDDのベンチマークでは、64MBなどのキャッシュを搭載しているHDDの場合にテストサイズが50MBだとキャッシュに吸収されてしまうため論外だとされています。
100Mであれば通常キャッシュに乗り切らないのですが、一般的に1000Mでのベンチマークが多いです。

今回はとりあえず100Mでとってみました。テストサイズ1000Mは別でまた計測したいと思います。

測定結果

D3+P1だとディスクは4本でRAID-Zという意味です。

無理矢理に表組にしてみました。単位はMB/sです。
グラフにもしてみました。文字がちょっと小さかったかも。

read write
シーケンシャルランダム512kランダム4kランダム4k QD32シーケンシャルランダム512kランダム4kランダム4k QD32
shareiscsi (D3+P1)zil_disable=0 zfs_nocacheflush=0114.6110.617.65114.63.166.660.430.69
zil_disable=0 zfs_nocacheflush=1114.7109.915.93111.837.1570.279.1522.07
zil_disable=1 zfs_nocacheflush=0114.7110.817.52114.6115.4112.115.75116.9
zil_disable=1 zfs_nocacheflush=1114.6110.217.67114.7115.5112.115.93116.9
COMSTAR (D3+P1)zil_disable=0 zfs_nocacheflush=0113.6110.719.99115.64.494.890.431.95
zil_disable=0 zfs_nocacheflush=1113.6110.518.36115.548.6853.7610.428.45
zil_disable=1 zfs_nocacheflush=0113.7110.720.2115.6114.4108.620.3117.3
zil_disable=1 zfs_nocacheflush=1113.7110.720.2115.6114.4108.620.3117.3
shareiscsi (D2+P1+ZIL1)zil_disable=0 zfs_nocacheflush=0114.7110.618.53114.512.687.29.1637.68
zil_disable=0 zfs_nocacheflush=1114.7110.717.34114.798.8384.0810.8639.29
zil_disable=1 zfs_nocacheflush=0114.6110.918.46114.6115.5112.215.29116.9
zil_disable=1 zfs_nocacheflush=1114.6110.917.9114.7115.4112.114.84116.9
COMSTAR (D2+P1+ZIL1)zil_disable=0 zfs_nocacheflush=0113.7110.419.67115.617.7513.3810.0738.65
zil_disable=0 zfs_nocacheflush=1113.7110.719.23115.6100.784.0912.637.55
zil_disable=1 zfs_nocacheflush=0113.7110.219.72115.6114.4108.720.28117.3
zil_disable=1 zfs_nocacheflush=1113.611120.05115.6114.3108.620.25117.3
COMSTAR (D3+P1+ZIL1)zil_disable=0 zfs_nocacheflush=0113.7110.719.25115.616.8112.8910.1837.52
zil_disable=0 zfs_nocacheflush=1113.7110.719.12115.6102.883.512.5537.91
zil_disable=1 zfs_nocacheflush=0113.7110.319.62115.6114.4108.620.26117.3
zil_disable=1 zfs_nocacheflush=1113.6110.920.22115.6114.4108.620.49117.3
COMSTAR (D3+P1+ZIL1-HDD)zil_disable=0 zfs_nocacheflush=0113.7110.820.03115.66.815.920.481.98
zil_disable=0 zfs_nocacheflush=1113.7110.819.04115.679.186.2910.4514.74
zil_disable=1 zfs_nocacheflush=0113.7110.719.92115.6114.5108.720.22117.3
zil_disable=1 zfs_nocacheflush=1113.6110.519.67115.6114.4108.720.26117.2







考察とか推測とか

本来画像や表に番号を振りながら具体的に比較して検証していくべきですが、そこまでやっている時間がない。自分のなかではデータとりながらある程度まとまっているのでここでは細かなことは割愛して、結果だけ書き連ねます。興味のある方は図と表を比較していろいろ考察してみてください。

ただしデータはあくまで自分の環境においてのものなので参考程度にとどめてもらえればと思います。他の業務をやりながら合間合間でデータ収集していたので、ミスってる可能性がないこともない。
何かおかしいことに気づいた方はコメントで指摘してください。

  • すべてネットワーク速度がボトルネックになっている。帯域を増やせばもっとパフォーマンスが出せそうな気がする
  • プールの構成やチューニングをしてもReadに関してはほぼ変化なし。
  • Writeに関してもある程度ネットワークがボトルネックになっている気がする
  • shareiscsiとCOMSTARではCOMSTARがいいらしいが、大きな差がなかった。寧ろ一部負けている部分があった。CPUの使い方の違いによるパフォーマンスはCPUのオーバーヘッド部分なのだろうか
  • ZILを別のデバイスとしてHDDを使用すると確かに若干のパフォーマンスアップがある。でも微々たるもの。
  • デフォルトの状態(zil_disable=0 zfs_nocacheflush=0 ZIL有効 ディスクキャッシュ無効)ではやはり書き込み部分で厳しいが、intel SSDをZILに用いることで劇的なパフォーマンス改善が見られる


サーバ用途(webサーバやメールサーバ)で使う場合、シーケンシャルな書き込みはほとんど発生しないのでランダムアクセスのパフォーマンスを見れば仮想サーバの共有ストレージとして十分使えると思う。
特にBBU有りのキャシュ搭載RAIDカードを使ってるとかでない限り、普通のHDDの環境のサーバであれば仮想環境に統合するため共有ストレージには自作iSCSIで十分だと思う。HDD単体のランダム4kアクセスはせいぜい1〜2MB/s程度だし、サーバ統合にはOpenSolarisの自作iSCSIストレージはあり。
実運用環境では正直やってみないとわからないので、実戦投入して負荷をかけながら色々検証してみるしかない。


個人ユースで考えれば、ZILを無効にしてもいいし、ZIL有りでもディスクキャッシュだけ有効にしておけばSSDなくても十分実用的だと思う。
ベンチマークからみれば市販のNAS製品よりかはアクセスが快適なはず。


手元では実運用環境で使うRAID-Z2のデータとかもいくつかあるけど、比較できるほどのデータはとっていない。時間があれば1000Mでテストやvolblocksizeを変えながらのデータ検証とかも含めてベンチマークをとりたいと思う。