FreeBSD 8.1 で Kernel Panic が発生
Kernel Panic が発生
今週の日曜日(2011-05-15)深夜に、さくらの VPS で稼動している FreeBSD 8.1 で Kernel Panic が発生した。
エラーメッセージは、
spin lock 0xc0e0b6b4 held (smp rendevous) held by 0xc50e3870 (tid 100103) too long panic: spin lock held too long
というものだった。
サーバーで最後に作業をしたのは前週の金曜日に Perl の CPAN モジュールをアップデートしただけで、その他直接システムに影響するようなものは変更をしていない。
システムに負荷がかかると Panic が発生
2日間かけて調査してわかったことは、
- カーネルパニックが起きるようになったのは、15日以降
- 再起動してから数時間後にパニックが発生する
- Disk I/O はいたって普通
- CPU の処理時間が長いと発生する傾向がある
ということだった。
負荷が高くなるのは、cron で MySQL でデータの更新作業をしているときなので、cron を停止し、MySQL も停止してみると少なくとも24時間は問題なく稼動した。
ちょうど、MySQL の最新版が ports にあったので、アップデートを実施する。そして、MySQL を稼動させてみる。
最大の失敗
見通しが甘かったとは思うが、様子を見ている間に、freebsd-update で 8.1 から 8.2 に上げる作業を行ってしまう。その作業中に Kernel Panic が発生。再起動をするも無常に、
can't find a kernel.
のメッセージ。/boot 以下に kernel がない…。
あるのは、
- /boot/kernel.old/kernel
- /boot/kernel.prev/kernel
のみ。駄目もとで、
# boot /boot/kernel.prev/kernel
を実行したら、起動する。これ幸いとばかりに、cron と MySQL を停止して、freebsd-update を再実行。この freebsd-update が負荷が高かったらしく、また Kernel Panic が発生。
起動時のメッセージに、
can't load a kernel.
と表示される。「/boot」以下に「kernel.*」のディレクトリがなく、もう完全に正常起動への道が絶たれた状態。