カテゴリー
技術

FreeBSD 8.3 の munin で kernel panic する時の対処

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してたらしい。

Revision 234661

ここの diff を取ってきて充てる。

# cd /usr/src
# patch < kern_descrip.diff
# patch < vfs_syscalls.diff
(なんかrejるけど手で充てる)

そして同じようにkernel再構築してreboot

解決! vmstat -m | grep fadviseふえてないし、kmemも余裕!

ちなみに、64bit環境の場合は、上限が遥か遠いので中々落ちない。
だから先送りされてんのかな……。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です