FreeBSD8.3-RELEASEにおいて、munin を回していると、
dmesg|grep panic
panic: kmem_malloc(16384): kmem_map too small: 335507456 total allocated
#2 0xc0b503aa at kmem_malloc+0x28a
とかいってよく落ちる。(i386に顕著なはず)
ちょっと調べてみると、
# sysctl -a|grep kmem
vm.kmem_size_max 320M <-これが最大
vm.kmem_size 220M <-だんだん増えてく
ふむ。
ぐぐると、どうやら zfs を使っている場合に「kmem増やせ」的な流れがあるようだが、zfs環境ではない。
このへんみてると、dtrace使ってる。(OpenSolaris様々)
このへんにdtrace使えるカーネルの作り方がある。
カスタムカーネルは
# mkdir /root/kernels
# cd /root/kernels
# emacs MYKERNEL
include GENELIC
ident MYKERNEL
options KDTRACE_HOOKS # all architectures - enable general DTrace h
ooks
options DDB_CTF # all architectures - kernel ELF linker loads
CTF data
options KDTRACE_FRAME # amd64 - ensure frames are compiled in
makeoptions DEBUG="-g" # build kernel with gdb(1) debug symbols
# cd /usr/src/sys/i386/conf
# ln -s /root/kernels/MYKERNEL
# config MYKERNEL
# cd /usr/src
# make buildkernel WITH_CTF=1 KERNCONF=MYKERNEL
# make installkernel KERNCONF=MYKERNEL
# reboot
でよい。書いてあるママ、普通。
これを走らせてみると……fadviseの増え方がおかしい。(#8のスクリプトも)
vmstat -m
を眺めると、やっぱり fadvise が大きい気がする。
ぐぐると
fadvise memory leak in FreeBSD 8.3-RELEASE
なるものを発見。
munin が使ってる RRDtool によって、fadvise がメモリリークして panicしてたらしい。
ここの diff を取ってきて充てる。
# cd /usr/src
# patch < kern_descrip.diff
# patch < vfs_syscalls.diff
(なんかrejるけど手で充てる)
そして同じようにkernel再構築してreboot
解決! vmstat -m | grep fadvise
ふえてないし、kmemも余裕!
ちなみに、64bit環境の場合は、上限が遥か遠いので中々落ちない。
だから先送りされてんのかな……。