vm.kmem_size よりも vm.kmem_size_max で ― 2014年04月28日 13時04分10秒
この、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。
最近のコメント