
ZFS: L2ARCを素朴化
NASでZFSのraidz1を使ってるけど、読み取り速度最大300~350MB/sで割と遅い。 そして10ギガのLANに繋がってる。 だからSSDのキャッシュ入れてそれを飽和できれば、と。 SSD入れて、zpool add zfs cache/dev/nvme0n1p11実行して、ファイル読んだらモニタリングでキャッシュ使用量が上がってるの見たからワクワクしだしたが、スピードは1ミリも速くならなかった # pv test.dat >/dev/null 20.0GiB 0:01:06 [ 324MiB/s] [==================================>] 100% # pv test.dat >/dev/null 20.0GiB 0:01:34 [ 226MiB/s] [==================================>] 100% テスト用のファイルを10回以上読んでも全然速くならなかった。 結局、L2ARCってデフォルトでシーケンシャルなデータをキャッシュしないことがわかった。 プリフェッチされた(=シーケンシャル)データはキャッシュされない 最大プリフェッチ距離は1MB → そもそもプリフェッチされるデータの量が少ない L2ARCに書き込み速度は8MB/sに制限されている エンタープライズで使われるハードディスク10台のアレイとかだと、ディスクだけでかなりのスピードが出て、シーケンシャルなデータをキャッシュに入れる必要がないからこれは賢いこと。 だが、僕はSteamライブラリーを速くしてくれる単なるLRU的なキャッシュがほしい。 ありがたいことに、設定を弄ればそういうキャッシュにするのも可能: # プリフェッチされたデータのキャッシュをON echo 0 > /sys/module/zfs/parameters/l2arc_noprefetch # 最大プリフェッチ距離を上げる(いい値よくわからないけど適当高めに) echo 2147483648 > /sys/module/zfs/parameters/zfetch_max_distance # 書き込み速度を上げる(SSDそのもの最大1GB/sだから1GB/sにした) echo 1073741824 > /sys/module/zfs/parameters/l2arc_write_max 設定を永続化: echo "options zfs l2arc_noprefetch=0 zfetch_max_distance=2147483648 l2arc_write_max=1073741824" > /etc/modprobe.d/zfs.conf すると結果は: # pv test.dat >/dev/null 20.0GiB 0:01:04 [ 333MiB/s] [==================================>] 100% # pv test.dat >/dev/null 20.0GiB 0:00:13 [1.44GiB/s] [==================================>] 100% ナイス。 ...