«前の日記(2014-08-30) 最新 次の日記(2014-09-10)» 編集

tueda's diary


2014-09-08 tueda's diary

_ iSCSI storage on FreeBSD 10.0

FreeBSD を使えば iSCSI な storage が簡単にできる.FreeBSD 10.0 になって,kernel に native は iSCSI target (iSCSI ではサーバ側を target と呼ぶ) が実装されて,益々簡単になった.

https://www.freebsd.org/doc/handbook/network-iscsi.html

に書かれている通りにやれば良い.

今回,ESXi の外部ストレージとして使う為に色々実験したのでメモしておく.

ハードウェア

だいぶ前に買ったHPのお祭りサーバ(ML110 G7)を流用した.性能面を考慮して,管理用 LAN とは分離する.NIC はオンボードも em ドライバなのだが,gmirror とか zfs とかの性能評価のために実験用に Intel EXPI9301CT を増設した.ESXi にも仮想LAN, 管理LAN 以外に NIC を2個増設して,それぞれに普段使っている LAN とは別のセグメントで IP を振った上で FreeBSD 機と直結した.

ESXi 側の設定はあちこちに日本語情報が落ちているので割愛する.FreeBSD 側は概ね以下の通りに.

/etc/rc.conf に追記

ifconfig_em1="inet 172.16.8.236 netmask 255.255.255.0 mtu 9000"
ifconfig_em2="inet 172.17.8.236 netmask 255.255.255.0 mtu 9000"
ctld_enable="YES"

FreeBSD 側はジャンボフレームを設定しているので ESXi 側も MTU を 9000 にすること.ESXi には vSwitch と iSCSIアダプタの両方に MTU を設定するところがあるので注意する,くらいだろうか.

ブロックデバイスの準備

FreeBSD ではキャラクタデバイス扱いだが,ともかく HDD 相当のデバイスであればなんでも良い.が,ESXi 本体の外側にわざわざストレージを作る理由は冗長化したいからだ.FreeBSDの場合は選択肢はgmirrorかzfsかであろう(が,これも日本語情報はいくらでもあるので作り方は割愛).それぞれの場合にデバイスは以下の様なファイルで表現されるはず.

gmirrorの場合

/dev/mirror/gm0p3

zfs の場合

/dev/zvol/pool0/iscsi/zdisk1

どちらでも良いのだが,zfs がお勧め.理由は後で書く.

/etc/ctl.conf を作成

portal-group pg0 {
        discovery-auth-group no-authentication
        listen 172.16.8.236
}

target iqn.2003-02.jp.co.ueo:target0 {
        auth-group no-authentication
        portal-group pg0

        lun 0 {
                path /dev/mirror/gm0p3
                size 2730G
        }
}

portal-group pg1 {
        discovery-auth-group no-authentication
        listen 172.17.8.236
}

target iqn.2003-02.jp.co.ueo:target1 {
        auth-group no-authentication
        portal-group pg1

        lun 1 {
                path /dev/zvol/pool0/iscsi/zdisk1
                size 2791728742400
        }
}

NIC を直結するので認証とか不要.複数のデバイスを別NICでストレージとして提供する場合は,portal-group の listen で NIC の IP を明示する.targetの名前はなんでも良さそうだが,handbook によると

2003-02 : ドメインを取得した年月
jp.co.ueo : ドメインをひっくり返した表記

としておけとのこと.path は前節のデバイスファイルをフルパスで書いておけば良い.size は pg1 の方は 2.6T とかして見たが通らなかったのでバイトで書いた.

これで ESXi 側からは iSCSI の先のブロックデバイスとして見えるので,google先生に

ESXi iSCSI 設定

とか聞けば設定方法を教えてくれる.その通りやれば ESXi の datastore として普通に使える.

実は最初は pg0 だけを設定したのだが,このパフォーマンスが上がらないので,色々実験をするために pg1 を別途設定した.その辺の経緯は以下に.

性能

当初は ESXi 5.1 + gmirror で作ったストレージでやっていた.ゲストOSはCentOSである.調子の良いときは40MB/sくらいで書き込みができるのだが,時々止まる.書き込みも止まるし,コマンドラインの操作自体が止まってしまう.そんなときは 20MB/s くらいまで,実効速度が落ちる.

ESXi 側のログをみると,Latency がえらい上がって(600msecくらい),時々 iSCSI の再接続をやっている.が,これがどちらに原因があるのか判らないので色々試して見た.

  • NIC の交換(両側の NIC を別系統にしてケーブルも交換)
  • FreeBSD 側に新たに HDD を足して gmirror なデバイスを作成, pg1 として別途 ESXi 側に公開
  • ESXi を 5.5 にアップデート

というのを順次行い,ゲストOS上で2GB程のファイルを書き込むテストを行った.しかし現象は変わらない.というか ESXi を 5.5 に上げると,iSCSI の再接続の頻度が上がって,むしろ状況は悪くなった.2GB のファイルを書き込もうとすると,概ね 20MB/s しか出なくなった.再接続のオーバヘッドのせいだと思うが,何故再接続が発生するかが判らない.NIC を交換したりしているので,物理的な問題では無いはず.ESXi のバージョンも上げてみたので,ESXi 側の実装がショボいとかでもなさげ.

となると,FreeBSD 側の性能が追いつかず,Latency が上がり過ぎると「切れた」と判断して再接続に行く? ESXi 5.5 で,その閾値が変わった? あたりを疑った.

ということで,もしかしたら gmirror でなければ速いかもしれない,と思って同じ HDD で pg1 側を zfs で作り直す事にした(これも作り方は割愛).

結果.ESXi 側のパフォーマンスモニタで見ていると,Latency は 600 msec とかまで上がるが,Event ログでは iSCSI の再接続までは発生していない模様.書き込み速度も 40MB/s はコンスタントに出る.

ここで,ネットワークの性能で頭打ちになっているのでは無い事を確認するために,zfs を方肺にしてテストをしてみる(iostat で片側にしか書き込まれて居ない事を確認).50MB/sでる!.ということでストレージの性能があがればネットワーク的にはまだ余裕があるということ(チーミングとかで帯域増やす意味はないということ).

まとめるとこんな感じ.

ストレージ書き込み性能エラー
gmirror20MB/siSCSI再接続エラー多発
zfs mirror40MB/sLatency悪化警告多発
zfs 方肺50MB/sLatency悪化(頻度は↑より低い)

(書き込み性能数値は3回くらい同じテストをやって一番低い値を10MBにまるめ)

いずれのエラーも警告も,ゲストOSの停止には至らないので実用上我慢できないことはないが,gmirror + ESXi5.5 だと再接続エラーが多発し,その都度コマンドラインの操作まで不能になる(数秒程度?).

書き込み性能についてはFreeBSD 側でもう少し性能が出るように調整できるかもしれないけれど,少なくとも ESXi に iSCSI なストレージを提供するのであれば,zfs mirror の方が gmirror より有利なようだ.

個人的には gmirror の方がずっと使っていて慣れているのだけれど,いよいよ乗換時期か?…べ,別に,FreeBSD 7 の頃にいちど zfs で raid5 を組んで HDD 故障から復旧できずにストレージ全体を飛ばしたのがトラウマ,というわけじゃ無いんだからねΣ(///□///)


総訪問者数: 本日の訪問者数: 昨日の訪問者数: