NFSサーバとしてのzfs

これまで気付かなかった、遅い ということを。

FreeBSDでzfsパーティションの/homeを持ち、NetBSDデスクトップマシンから 使っていた。最近NetBSD機の主記憶を32GBから64GBにしたところ、 NFS先のホームディレクトリへの書き込みがもの凄く遅くなった。 たった100MBに1分近くかかる。なんじゃこりゃ!?

最初はNetBSDのNFSクライアントとしての問題だと思って 2週間近くそっちばかり試行錯誤していたが、分かってみれば FreeBSDのZFSの挙動の問題で、「NFSからの書き込みはいちいちsyncするから」、 というのが原因だった。NFSだけ切るというわけには行かないので、

のいずれかになる。比べてみた結果がこれ。

sync=standard4.8MB/s
sync=disabled45.5MB/s
ZIL on SSD31.5MB/s

これは dd if=/dev/zero bs=1m count=100 で、100MBのゼロファイルを書き込んだときのもの。

sync=disabled にすると恐い、という記述を見掛ける。確かにそうなのだが、 SSDを追加するということは、故障の可能性のある部品を増やすことになり、 システム全体としての故障率が上がる。また、ZIL用パーティション作って 強制的にシステムを停止して、ZILが全部壊れたことをシミュレートして 起動してみたが、もはや、zpoolのimportすらできない(→ L2ARC と ZIL をぶっ壊してみるテスト)。 つまり、ZIL用SSDがふっ飛んだらまずそのzpoolは全滅になる。 かたや、sync=disabledの場合はsyncもれのファイルだけが壊れるので、 全てを失うことはない。 (以下2024/7/24追記)まあまあ速くはなるが障害点が増えるので手放しで喜べるわけではない。

(2024/7/24)この時から十数台のサーバほぼすべてのpoolで sync=disabled, atime=off 設定で使用している。壊れて困ったことはないが、HDDプールの場合 使い込んでくると zio->i でじーっと待ち状態になってしまって システムのパフォーマンスが著しく落ちるのが出てきてそろそろ cache を入れたほうがいいんだろうかと迷っているところ。