ZFSのL2ARCとZILをぶっ壊してみるテスト

zfsのI/Oパフォーマンス向上のためにSSDを組み合わせる、 というのが一般的だが、SSDの壊れ方(いきなりボン)に遭遇したときに poolにアクセスできるのか、軽く試してみた。

実機では面倒なのでvm-bhyve環境で。 configファイルでのdisk設定はこう。

disk0_type="ahci-hd"
disk0_name="disk0.img"		# システムディスク = ada0
disk1_type="ahci-hd"
disk1_name="cache.img"		# L2ARC用	   = ada1
disk2_type="ahci-hd"
disk2_name="ramdisk.img"	# ZIL用		   = ada2

disk2(ZIL用)の ramdisk.img はtmpfs上のファイルへの symlink で作成したのだが書き込み全く速くならなかったのでここでは無視。 ゲストで作成した zpool=zt0 はこう。

zpool status zt0
        NAME        STATE     READ WRITE CKSUM
        zt0         ONLINE       0     0     0
          ada0p3    ONLINE       0     0     0

L2ARC

zpool add zt0 cache ada1
zpool status zt0
        NAME        STATE     READ WRITE CKSUM
        zt0         ONLINE       0     0     0
          ada0p3    ONLINE       0     0     0
        cache
          ada1      ONLINE       0     0     0

この状態でゲストに tar.gz ファイルをガリガリ書かせている途中、 ホスト側で vm poweroff する。

パターン1: L2ARCデバイスが突然なくなる

SSDがイカレて次のデバイスも用意できない場合を想定。 configファイルから disk をコメントアウト

disk0_type="ahci-hd"
disk0_name="disk0.img"		# システムディスク = ada0
#disk1_type="ahci-hd"
#disk1_name="cache.img"		# L2ARC用	   = ada1
#disk2_type="ahci-hd"
#disk2_name="ramdisk.img"	# ZIL用		   = ada2

そして起動。ちゃんと起動する。

zpool status
        NAME                   STATE     READ WRITE CKSUM
        zt0                    ONLINE       0     0     0
          ada0p3               ONLINE       0     0     0
        cache
          3837179185207539351  UNAVAIL      0     0     0  was /dev/ada1

このまま zpool remove zt0 3837179185207539351 すれば何事もなく使えるだろうが、しばらく使ったあと、新品SSDを 差した場合を想定してサイズを変えた cache.img を作ってゲスト起動。

zpool status
        NAME                   STATE     READ WRITE CKSUM
        zt0                    ONLINE       0     0     0
          ada0p3               ONLINE       0     0     0
        cache
          ada1      ONLINE       0     0     0

行けた。まあキャッシュだから大丈夫やね。

パターン2: L2ARCデバイスのデータが化ける

SSDのデータが化けた場合を想定。

同様にゲストでファイルを書かせている途中で vm poweroff。 そのあと、ディスクイメージファイルを同じサイズのままゼロクリア。 ゲスト起動。

zpool status
        NAME                   STATE     READ WRITE CKSUM
        zt0                    ONLINE       0     0     0
          ada0p3               ONLINE       0     0     0
        cache
          3837179185207539351  UNAVAIL      0     0     0  was /dev/ada1

なるほど、ada1は存在するものの今度はUNAVAILになった。 一度外してつければいいのかな?

zpool remove zt0 3837179185207539351
zpool add zt0 cache ada1

はい、行けた。

実はこのとき間違えて

zpool add zt0 ada1

とやってしまってzt0プールがストライピングになって外せなくなってしまった。 そしてゲストを作り直すはめになった。こわいこわい。

ZIL

さて、書き込みキャッシュはどうだ。読み込みより深刻なはず。

パターン1: ZILデバイスが突然なくなる

ゲストで大量ファイル書き込み中に vm poweroff。その後、 configファイルからZIL用diskをコメントアウトして再起動。ローダで止まる。

Mounting from zfs:zt0/ROOT/default failed with error 6.

Loader variables:
  vfs.root.mountfrom=zfs:zt0/ROOT/default

Manual root filesystem specification:
  <fstype>:<device> [options]
      Mount <device> using filesystem <fstype>
      and with the specified (optional) option list.

    eg. ufs:/dev/da0s1a
        zfs:tank
        cd9660:/dev/cd0 ro
          (which is equivalent to: mount -t cd9660 -o ro /dev/cd0 /)

  ?               List valid disk boot devices
  .               Yield 1 second (for background tasks)
  <empty line>    Abort manual input

miniroot>

ここからはどうしようもない(と思う)。いったん停めて FreeBSDインストールDVDからLiveDVDを起動する。

(ホスト)
vm -f install guest FreeBSD-11.x-RELEASE-amd64-dvd1.iso

[2]のシングルユーザモードで起動して、強制importしてみる。

zpool import -f -R /altroot zt0
The devices below are missing or corrupted, use '-m' to import the pool
anyway:
            ada2 [log]

cannot import 'zt0': one or more devices is currently unavailable

「-mオプションつけろ」とのことなのでつけてみる。

zpool import -fm -R /altroot zt0
(warning多数)
zpool status
        NAME                   STATE     READ WRITE CKSUM
        zt0                    DEGRADED     0     0     0
          ada0p3               ONLINE       0     0     0
        logs
          8184467690034791332  UNAVAIL      0     0     0  was /dev/ada2

とりあえず外す、

zpool remove zt0 8184467690034791332

ゲストを再起動してみる。

halt -p
vm start guest
vm console guest

正常に起動した。 強制 poweroff するときに書き込んでいたものは失われている。

パターン2: ZILデバイスのデータが化ける

同様にゲストでファイルを書かせている途中で vm poweroff。 そのあと、ZIL用ディスクイメージファイルを同じサイズのままゼロクリア。 ゲスト起動。

……ローダプロンプトで止まる。あとの手順は上記といっしょ。 インストールDVDでシングルユーザモード起動して -m つき強制importのあと zpool remove でZILデバイスを外し、ゲストを再起動すると使える。

ふむ。

まとめ

ということで、ZILを使うならLiveDVDを常備していないとおっかない。 その点vm-bhyve下で動くゲストなら vm start ... のかわりに vm install ... と起動すればいいので比較的安心かもしれない。いずれにせよ、 ZIL用ディスクが壊れるのは恐い。

実機(ベアメタル)で持つzfsにZIL持たすより、ゲストのzfsにZIL持たした方が 安心だな。

と、ここまで書いたところで、「ZILで書き込み速くなるのかい?」が 気になった。ゲストのZILをtmpfsで持たせても大して速くないことに気付いた。 たしかに、NFS先からの書き込みアクセスでしか恩恵がない。 NFSの先で書き込みが遅いのを解消する選択肢

それぞれに障害が起きるとしたら、前者はSSDが壊れる、 後者はHDDや電源を含めた全体的な故障でシステムが突然落ちる、 となるのだが、現時点ではシステム全体のトラブルが(なんとなく) 「多くて2、3年に1度かなあ」といった程度なのに対し、 SSDのほうは未経験で予想もつかない。さらにいえば、 HDDや電源ユニットの故障はある程度予兆があるし、突然落ちたとしても これまでの利用方法でzfsが壊れたという経験もない。 それを考えると、やはりまだSSD破損の経験がない時点では「SSDのZIL」は 恐くて足せない。そんな結論である。