vm.kmem_size よりも vm.kmem_size_max で2014年04月28日 13時04分10秒

FreeBSD で ZFS を使っていると、ARC キャッシュの割り当てを増やそうとした事はあるはず。vfs.zfs.arc_max を増やすためには、往々にして、カーネルメモリを増やさなければいけない。vm.kmem_size を /boot/loader.con にて設定できる。

この、kmem はカーネル内で動的に割り当てられる部分。以下の様に、物理メモリの二倍までに設定できるようになっている。


        /*
         * Limit kmem virtual size to twice the physical memory.
         * This allows for kmem map sparseness, but limits the size
         * to something sane.  Be careful to not overflow the 32bit
         * ints while doing the check or the adjustment.
         */
        if (vm_kmem_size / 2 / PAGE_SIZE > mem_size)
                vm_kmem_size = 2 * mem_size * PAGE_SIZE;

vm.kmem_size_max が先に読み込まれ、vm.kmem_size はこの直後に読み込まれるので、 vm.kmem_size_max を無視して上書きできるはずなのだが、実験では、vm.kmem_size が vm.kmem_size_max を越えることはなかった。


        TUNABLE_ULONG_FETCH("vm.kmem_size_max", &vm_kmem_size_max);
        if (vm_kmem_size_max > 0 && vm_kmem_size >= vm_kmem_size_max)
                vm_kmem_size = vm_kmem_size_max;

        /* Allow final override from the kernel environment */
        TUNABLE_ULONG_FETCH("vm.kmem_size", &vm_kmem_size);


それよりも問題だったのは、vm.kmem_size を大きくし過ぎると panic を起こして、kernel が起動しない事。他のシステムから mount して、/boot/loader.conf を書き直さなければいけない。

それよりも、vm.kmem_size_max を指定した方が panic にならずに良かった。確かに、最高を指定しただけなので、kmem_size はそれより小さい事もあるが、調整してくれるみたいで panic する事はなかった。

特にこの辺りは長いこと変わっていないみたいだが、今回見たコードは FreeBSD 8.4 RELEASE。