【Storage】ZFSOnLinux +LIO SRPを試してみた 
前回までのあらすじ


SRPによる「ぼくのかんがえたさいきょうのすとれーじ」構想を実現するべく、様々な検証をした結果、どうやらSCSTとSRPそのものは問題なさそうだという結論が出つつあった。そして、ストレージサーバにSCSTカーネルを入れようと計画していて、あることに気がつく。SCSTカーネルだとZFS on LinuxのネイティブZFSのconfigureが通らない。どうにか動かそうと1日は頑張ったが、結局心が折れ、挫折した。

( ◠‿◠ )<ザコめ (◞‸◟)

しかし、調べてみるとib_srptモジュールがlinux kernel3.3くらいから(あいまい)マージせれたらしく、それがあればLIOからSRPがしゃべれるらしい。
debianには3.2以降のカーネルは公式にはないが、(カーネル的な意味で)一歩先を行くubuntu server が12.04ではデフォルトで3.5なので、試しにUbuntu serverを入れてmodinfoをしてみると、確かにib_srptモジュールはある。そして、ZFSのパッケージもあり、3.5カーネルの上でZFSもうごいた。もしかしたら、これならZFSとSRPもいけるのでは--?

---そして、再び格闘が始まった---


前置きが長くなりましたが、だいたいこんな感じです。2ヶ月くらい前からやろうやろうと思いつつ何もしていませんでしたが、どうにか動いたのでメモとして残します。両方ともまだ実績のないいろんな意味でとんがった構成ですがどうなるか…。。

動作環境


今回試した環境です。

SRPターゲット


OS
 ubuntu server 12.04
マシン
 MB/Rampage Gene II
 CPU/Xeon X5647
 Mem/4GB@1333MHz x6=24GB,UDIMM
 HCA Infinihost III EX(4xDDR)
 HDD WDC WD400JD-55MS x1  ST3160318AS x6


 以前ブレードサーバ勉強会の時にJX-FM500Bと言うケースに入れ、iSCSIのSANとして使うはずだったマシンです。まあ結局色々あってiSCSIを繋ぐことは出来なかったんですけどね。。それからずっと部屋の隅に置いてあったので、再利用しました。

イニシエータ


OS
 Windows 7
マシン
 MB:DFI LANPARTY UT X58 T3eH8
 CPU:Xeon Corei7 920(定格)
 HCA Infinihost III LX(4xDDR)
 Mem:6 x 2GB@1333MHz


 いつものマシンです。

targetcliのインストール



 そのままだと何故かXの類とOpenGL系も入れようとして800MB超もディスクを消費するので、
apt-get install --no-install-recommends targetcli


 で必要なものだけを入れます。
 インストールが終わったら、targetcliが立ち上がるか試します。

root@SRP:~# targetcli
Welcome to the targetcli shell:

Copyright (c) 2011 by RisingTide Systems LLC.

Visit us at http://www.risingtidesystems.com.

Using iscsi fabric module.
Using loopback fabric module.
Using ib_srpt fabric module.
Using qla2xxx fabric module.
Using tcm_fc fabric module.
/> exit
root@SRP:~#


tagetcliの準備


 targetcliが立ち上がったらいったん終了し、SRPをしゃべる為の準備をします。

openSMの起動



apt-get install opensmで入るので必要に応じて入れます。windows側で起動してもいいのですが。

モジュールのロード


 モジュールは以下のものをロードします。
ib_srpt(tagetcliを起動すると読み込まれる)
mlx4_ib or ib_mthca(HCA用ドライバ)


余談


 srpを動かそうとしても、デフォルトだと/ib_srp以下でcreateしようとして以下のエラーで失敗します。
/ib_srpt> create 0x0000000000000000008f104039864b1
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/configshell/shell.py", line 983, in run_interactive
self._cli_loop()
File "/usr/lib/python2.7/dist-packages/configshell/shell.py", line 806, in _cli_loop
self.run_cmdline(cmdline)
File "/usr/lib/python2.7/dist-packages/configshell/shell.py", line 927, in run_cmdline
self._execute_command(path, command, pparams, kparams)
File "/usr/lib/python2.7/dist-packages/configshell/shell.py", line 902, in _execute_command
result = target.execute_command(command, pparams, kparams)
File "/usr/lib/python2.7/dist-packages/targetcli/ui_node.py", line 157, in execute_command
return UINode.execute_command(self, command, pparams, kparams)
File "/usr/lib/python2.7/dist-packages/targetcli/ui_node.py", line 85, in execute_command
pparams, kparams)
File "/usr/lib/python2.7/dist-packages/configshell/node.py", line 1405, in execute_command
result = method(*pparams, **kparams)
File "/usr/lib/python2.7/dist-packages/targetcli/ui_target.py", line 119, in ui_command_create
target = Target(self.rtsnode, wwn, mode='create')
File "/usr/lib/python2.7/dist-packages/rtslib/target.py", line 1252, in __init__
self._create_in_cfs_ine(mode)
File "/usr/lib/python2.7/dist-packages/rtslib/node.py", line 71, in _create_in_cfs_ine
os.mkdir(self.path)
OSError: [Errno 22] Invalid argument: '/sys/kernel/config/target/srpt/0x0000000000000000008f104039864b1'


 最初は、Hardware Supportを見てみるとConnectX以降しか書いていのですが、試した環境がinfinihostだったのでそれが悪いと思っていました。なので、ConnectX2が来たら本気を出そうと後回しにしていたのですが、その後某氏にConnectX2を譲っていただき同じように試してみましたが変わらずエラーでした。

 ここで再び心が折れ(豆腐メンタルすぎ)放置していたのですが、久しぶりに調べてみるとこのフォーラムに同じ情報が上がっていて、一部修正する必要があるようです。13は確認していないですが、少なくともubuntu server 12.04とInfinihost LXとConnectX2 VPIという環境では修正が必要でした。修正がいるかどうかは使用するHCAにもよる…のでしょうか?
試してみた限りでは、infinihostでも問題なく動いています。iSER等を使うときにConnectXが必要なのでしょうか?それともRTS OSの話ですかね?RTS OSも試してみたいとは思うのですが、ZFSが行けるかどうか…

ib_srpt.specの修正


/var/target/fablic/ib_srp.specファイルを修正します。
vi /var/target/fabric/ib_srpt.spec
#wwn_from_files_filter = "sed -e s/fe80/0x0000/ -e 's/\://g'"
wwn_from_files_filter = "sed -e s/fe80/0xfe80/ -e 's/\://g'"


これで、ひとまず準備は終わります。

targetcliのLUN作成


ここに書いてある通りに、backstoresでlunをつくり、そのlunをSRPのターゲットと結びつけていきます。/ib_srp以下でcreateしようとしても0xfe80...というのがタブで補完されないときは、HCAのドライバが読まれていないのでmodprobeでHCAのドライバを読んでください。(たまにはまる)


LUNとターゲットを結びつけたら、接続するイニシエータのIDを取るため、一旦targetcliをexitするかCtrl+Zでバックグラウンドにまわし、/var/log/syslogをtail -fします。どうでもいいのですがUS12.04だと/var/log/messagesはなくなっているんですね…

tailfしたら、イニシエータ側(今回はWindows7)から接続します。Windows上からだと、前回と同じくOFEDのSRPドライバを入れたあと、デバイスマネージャから記憶域コントローラ→Infiniband SRP Miniportを有効にしたり無効にしたりすることにより再接続します。

一度ドライバを無効にしたあと有効にすると、以下のようなメッセージが出るので、これをコピーします。

May 10 22:29:03 SRP kernel: [ 3960.483703] Received SRP_LOGIN_REQ with i_port_id 0x19bbffff00d8c4:0x5ad00000bf4d4, t_port_id 0x19bbffff00d8c4:0x19bbffff00d8c4 and it_iu_len 2116 on port 1 (guid=0xfe80000000000000:0x8f104039864b1)
May 10 22:29:03 SRP kernel: [ 3960.484690] Session : kernel thread ib_srpt_compl (PID 2112) started
May 10 22:29:03 SRP kernel: [ 3960.484840] Rejected login because no ACL has been configured yet for initiator 0x0019bbffff00d8c40005ad00000bf4d4. ←このIDが必要
May 10 22:29:03 SRP kernel: [ 3960.484848] Session 0x0019bbffff00d8c40005ad00000bf4d4: kernel thread ib_srpt_compl (PID 2112) stopped


SCSTもそうでしたが、SRPの動きとしてクライアント側であれこれ認証するのではなく、ターゲット側で一括で認証するようです。

このIDをとったら、targetcliに戻り、aclを変更します。

/ib_srpt/0xfe...8f104039864b1> cd /
/> cd /ib_srpt/0xfe800000000000000008f104039864b1/
/ib_srpt/0xfe...8f104039864b1> acls/ create 0x0019bbffff00d8c40005ad00000bf4d4
Successfully created Node ACL for 0x0019bbffff00d8c40005ad00000bf4d4
Created mapped LUN 0.
Entering new node /ib_srpt/0xfe800000000000000008f104039864b1/acls/0x0019bbffff00d8c40005ad00000bf4d4
/ib_srpt/0xfe...5ad00000bf4d4>


これで、イニシエータ側からもう一度接続をかけると、Infiniband SRP Miniportの!マークが無くなり、ディスクの管理から今追加したディスクがみえるはず…です。

SRP素の性能ベンチマーク


 まずは、mount -t tmpfs -o size=10GとしてRAM上に作ったFileIOなLUNに対してみんな大好きCDMとHDTuneを回した結果です。HCAは両者ともInfinihost III (4xDDR)です。connectX2をもう一枚手に入れないとなかなかいい数字はでなさそうです。まあ、それでもiSCSIでは中々出せない数値です。




 ちなみに、SCSTの時の結果です。



 SCSTの方が概ね1Gbps程度多く速度が出ているようにみえます…。ほぼ同じ構成のはずなのですがなぜ…。まあ、どっちにしてもiSCSIではでない速度なのでよしとします。

 SRPが通ったら、SCSTカーネルではうまく入らなかったZFSを入れてみます。

ZFS over Infinibandを試してみる


 US12.04はレポジトリを追加することによってapt-get installで自動的にインストールされます。まあこれは今に始まったものではないですが…。

 ここにあるように、まずppaのキーを追加します。
root@SRP:~# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1196BA81F6B0FC61

Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring /tmp/tmp.pb0RR67Pg5 --trustdb-name /etc/apt/trustdb.gpg --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver keyserver.ubuntu.com --recv-keys 1196BA81F6B0FC61
gpg: requesting key F6B0FC61 from hkp server keyserver.ubuntu.com
gpg: key F6B0FC61: public key "Launchpad PPA for Native ZFS for Linux" imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)


 次に、sources.listに以下を追加します。
root@SRP:~# vi /etc/apt/sources.list

deb http://ppa.launchpad.net/zfs-native/stable/ubuntu precise main
deb-src http://ppa.launchpad.net/zfs-native/stable/ubuntu precise main


 そしたら、apt-get updateのあと、apt-get install ubuntu-zfsでzfsが入ります。まあなんて簡単。


 そして、いつもどおりにpoolを作り、その上にFileIOなLUNを作ります。上のtmpfsの実験をしたあとに再起動をしているのですが、saveconfigをし忘れてtargetcliの設定が真っさらになりましたw

 ZFSについては何度も扱っているうえにいくらでもほかに優秀なまとめがあり、targetcliについても本家の通りの作業なのであまり詳しく書きませんが、作業内容のメモを残しておきます。まずはストライプでのZFSの動きを見ます。

root@SRP:~# fdisk -l|grep Disk
Disk /dev/sda: 160.0 GB, 160041885696 bytes
Disk identifier: 0x4030e8a7
Disk /dev/sdb: 160.0 GB, 160041885696 bytes
Disk identifier: 0x4030e8ab
Disk /dev/sdc: 160.0 GB, 160041885696 bytes
Disk identifier: 0x4030e897
Disk /dev/sdd: 160.0 GB, 160041885696 bytes
Disk identifier: 0x4030e893
Disk /dev/sde: 160.0 GB, 160041885696 bytes
Disk identifier: 0xb7b441a9
Disk /dev/sdf: 160.0 GB, 160041885696 bytes
Disk identifier: 0x00000000
Disk /dev/sdg: 40.0 GB, 40020664320 bytes
Disk identifier: 0x000bca5f
root@SRP: ~ # zpool create ib /dev/sd{a,b,v,d,e,f}
^cannot resolve path '/dev/sdv'
root@SRP: ~ # zpool create ib /dev/sd{a,b,c,d,e,f}
root@SRP: ~ # zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
ib 894G 127K 894G 0% 1.00x ONLINE -
root@SRP:~# targetcli
Welcome to the targetcli shell:

Copyright (c) 2011 by RisingTide Systems LLC.

Visit us at http://www.risingtidesystems.com.

Loaded iscsi_target_mod kernel module.
Created '/sys/kernel/config/target/iscsi'.
Done loading iscsi fabric module.
Loaded tcm_loop kernel module.
Created '/sys/kernel/config/target/loopback'.
Done loading loopback fabric module.
Loaded ib_srpt kernel module.
Created '/sys/kernel/config/target/srpt'.
Done loading ib_srpt fabric module.
Loaded tcm_qla2xxx kernel module.
Created '/sys/kernel/config/target/qla2xxx'.
Done loading qla2xxx fabric module.
Loaded tcm_fc kernel module.
Created '/sys/kernel/config/target/fc'.
Done loading tcm_fc fabric module.
/> ls /
o- / ................................................................................................... [...]
o- backstores ........................................................................................ [...]
| o- fileio ............................................................................. [0 Storage Object]
| o- iblock ............................................................................. [0 Storage Object]
| o- pscsi .............................................................................. [0 Storage Object]
| o- rd_dr .............................................................................. [0 Storage Object]
| o- rd_mcp ............................................................................. [0 Storage Object]
o- ib_srpt ...................................................................................... [0 Target]
o- iscsi ........................................................................................ [0 Target]
o- loopback ..................................................................................... [0 Target]
o- qla2xxx ...................................................................................... [0 Target]
o- tcm_fc ....................................................................................... [0 Target]

/> backstores/fileio create zfs_srp /ib/zfs_srp size=10G
Generating a wwn serial.
Not using buffered mode.
Created fileio zfs_srp.
Entering new node /backstores/fileio/zfs_srp
/backstores/fileio/zfs_srp> cd /ib_srpt
/ib_srpt> create 0xfe800000000000000019bbffff00d8c
0xfe800000000000000019bbffff00d8c5 0xfe800000000000000019bbffff00d8c6
.................wwn
/ib_srpt> create 0xfe800000000000000019bbffff00d8c5
Created target 0xfe800000000000000019bbffff00d8c5.
Entering new node /ib_srpt/0xfe800000000000000019bbffff00d8c5
/ib_srpt/0xfe...ff00d8c5/luns> create /backstores/fileio/zfs_srp
Selected LUN 0.
Successfully created LUN 0.
Entering new node /ib_srpt/0xfe800000000000000019bbffff00d8c5/luns/lun0
/ib_srpt/0xfe...8c5/luns/lun0>
/ib_srpt/0xfe...8c5/luns/lun0> cd ../../
/ib_srpt/0xfe...9bbffff00d8c5> acls/ create 0x0019bbffff00d8c4001a4bffff0c012c
Successfully created Node ACL for 0x0019bbffff00d8c4001a4bffff0c012c
Created mapped LUN 0.
Entering new node /ib_srpt/0xfe800000000000000019bbffff00d8c5/acls/0x0019bbffff00d8c4001a4bffff0c012c
/ib_srpt/0xfe...a4bffff0c012c> cd /
/> saveconfig
WARNING: Saving SRP current configuration to disk will overwrite your boot settings.
The current target configuration will become the default boot config.
Are you sure? Type 'yes': yes
Making backup of fc/ConfigFS with timestamp: 2013-05-11_23:48:52.464843
Successfully updated default config /etc/target/fc_start.sh
Making backup of qla2xxx/ConfigFS with timestamp: 2013-05-11_23:48:52.464843
Successfully updated default config /etc/target/qla2xxx_start.sh
Making backup of srpt/ConfigFS with timestamp: 2013-05-11_23:48:52.464843
Successfully updated default config /etc/target/srpt_start.sh
Making backup of loopback/ConfigFS with timestamp: 2013-05-11_23:48:52.464843
Successfully updated default config /etc/target/loopback_start.sh
Making backup of LIO-Target/ConfigFS with timestamp: 2013-05-11_23:48:52.464843
Generated LIO-Target config: /etc/target/backup/lio_backup-2013-05-11_23:48:52.464843.sh
Making backup of Target_Core_Mod/ConfigFS with timestamp: 2013-05-11_23:48:52.464843
Generated Target_Core_Mod config: /etc/target/backup/tcm_backup-2013-05-11_23:48:52.464843.sh
Successfully updated default config /etc/target/lio_start.sh
Successfully updated default config /etc/target/tcm_start.sh
/> exit


 その結果です。(ZFS=ディスク6枚のストライプ )



 読み込みはまあいいとして、ディスクへの書き込みがだいぶぶれますね。もっとも、ZFSそのものが複雑な書き込みをしているので仕方ないのかもしれませんが。

 次に、raidzの性能を見ます。

 
root@SRP:~# zpool destroy ib
root@SRP:~# zpool create ib raidz /dev/sd{a,b,c,d,e,f}
root@SRP:~# zpool status
pool: ib
state: ONLINE
scan: none requested
config:

NAME STATE READ WRITE CKSUM
ib ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
sda ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0

errors: No known data errors
root@SRP:~#


 その結果です。



 読み込みはキャッシュが効いている為一定ですが、書き込みはかなりぶれています。まあ、これはSRPというよりはZFSの動きですが。。
 このブレをどうにかなくせないかと、create buffered=trueでLUNを作ってみたり、emurate_write_cache=1にしてみたり、zpool add log でSSDをキャッシュとして追加したり、zfs set sync=disabledという禁忌を犯してみたり…など、いろいろしてみたのですが、大きく改善することはありませんでした。というか、ZFSonLinuxではlogデバイスがあまり使われていないようにみえます。sync=alwaysにするとものすごい勢いでlogデバイスにアクセスしますが、standardにしている限りはあまり大きなアクセスはlogデバイスに対してはありませんでした。LIO側のFileIO時のO_SYNCが無視され非同期書き込みになっている…?

 この落ち込みの問題は、iotopやatopをしてみると確かにRAIDZのメンバーディスクには常に負荷がかかっていたので、RAIDコントローラで側で大容量メモリを積んだら多少は隠蔽できるのでしょうか。まあ、用途としては書き込みよりも読み込みの方が多いので、何とかなりそうな気もしますが。後日、実稼働予定マシンで同じ構成をとり、もう少し様子を見てみようと思います。

コーチ 長財布 
ジェーンは彼女が彼女の日の時間の本を与えられたただのあなたの飛行機内デュマ エルメスから来る機会の出会いを経験しました。ジェーンは事実に向かって原因不満エルメス エブリン エルメス協力ケリー袋は非常にない彼女に合わせて狭すぎるあなたの頭。
<a href="http://www.kennelnattrajens.se/Ny_mapp/Coach-Handbags-Outlet-c-101_133.html" >コーチ 長財布</a>

コメントを書く
必要事項とコメントを入力して下さい。









タグの挿入