2013年7月18日木曜日

FreeBSD/amd64 9系でzfs(+nfs) を使いメモリ不足に陥る

FreeBSD 9.0-RELEASE(amd64)にzfsでファイルシステムを構築し、職場のPCのサーバとして使っていたのですが、先日サーバがメモリ不足の症状でダウンしまして、なんだこりゃ?と。USBキーボードの抜き差しすら対応出来なくなるという。おそろしや…

どうも目一杯vfs.zfs.arc_maxまでカーネルメモリを使い込んだようで、他のサービスにおけるメモリ使用とぶつかってしまっていたようです。さらに、職場のサーバはLinux機をクライアントに持っていて、ユーザの /home/ 領域をnfsでサービスしています。9.0-RELEASEのzfsにはnfsを利用するとメモリリークが起きる、というバグがあり、9.1-RELEASEでは修正されています。(事実誤認してたかも知れないので削除。)というわけで、
・OSをFreeBSD 9.1-RELEASEへ更新 (freebsd-updateでさっと更新。楽でした。)
・zfsのメモリ利用量を見直す
という対応を取りました。

昨今のLinux機のデスクトップ環境(特にブラウザ類)はホームディレクトリへのアクセスが頻繁に起こりますので、zfsのarc利用頻度が高く、nfsもメモリを使います。あとWeeklyのcronが走った後もarcにメモリが大量に使われた形跡がありました。locatedbの作成かなにかでしょうか。

FreeBSD 9.1-RELEASE (amd64) ではメモリのチューニングがよく行われていて、8GBのメモリを搭載したPCでは目一杯メモリをzfs、特にarcで使うような設定が施されているように見えます。例えばこんな感じ。(sysctl -a で確認)

        kern.maxusers:                          384
        vm.kmem_size:                           8216244224
        vfs.zfs.arc_min:                        892812800
        vfs.zfs.arc_max:                        7142502400

ARC以外1GBもあれば足りるでしょ、みたいな実にギリギリを攻めるパラメータ。
しかしそれでは怖い。かなり。というわけで、/boot/loader.conf に

vfs.zfs.arc_max="5120M"

の記述を追加し、少しメモリに余裕が出来るようにしてみました。本体8GBですからファイルシステム以外の部分に3GB、と考えれば大丈夫、のはず。Xも使ってないし。


        kern.maxusers:                          384
        vm.kmem_size:                           8216244224
        vfs.zfs.arc_min:                        671088640
        vfs.zfs.arc_max:                        5368709120

数日稼働させて、zfs-stats -M の実行結果はこんな数値。
(zfs-stats は ports にあります。)

System Memory:

        0.26%   20.27   MiB Active,     1.52%   118.75  MiB Inact
        71.22%  5.45    GiB Wired,      0.00%   0 Cache
        27.00%  2.07    GiB Free,       0.01%   736.00  KiB Gap

        Real Installed:                         8.00    GiB
        Real Available:                 98.93%  7.91    GiB
        Real Managed:                   96.68%  7.65    GiB

        Logical Total:                          8.00    GiB
        Logical Used:                   72.73%  5.82    GiB
        Logical Free:                   27.27%  2.18    GiB

Kernel Memory:                                  3.49    GiB
        Data:                           99.41%  3.47    GiB
        Text:                           0.59%   21.19   MiB

Kernel Memory Map:                              7.57    GiB
        Size:                           40.64%  3.08    GiB
        Free:                           59.36%  4.49    GiB

ARC関係の数値だと

ARC Summary: (HEALTHY)
ARC Misc:
ARC Size:                               76.20%  3.81    GiB

となっているので、Logical Used が 5.82GiBに対して ARC Sizeが 3.81GiB ということは、ARC以外で約2GB使っている、ということですから、やはり /boot/loader.conf で vfs.zfs.arc_max を絞る設定はしておいたほうがよいみたいですね。しばらくこれでいってみたいと思います。