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

というものだった。
サーバーで最後に作業をしたのは前週の金曜日に PerlCPAN モジュールをアップデートしただけで、その他直接システムに影響するようなものは変更をしていない。

システムに負荷がかかると 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.*」のディレクトリがなく、もう完全に正常起動への道が絶たれた状態。

OS の再インストールと 8.2 へのアップグレード

データの救出もあきらめ、OS の再インストールとインストールの直後に freebsd-update で 8.2 へのアップグレードを試みる。
そして、

# portsnap fetch extract update

中に、カーネルパニックの発生。そのときのコンソールの内容が下記の画像。

新規インストールすぐにカーネルパニックが発生したので、ゲスト OS の問題というよりは、ホスト側の問題と思い、さくらに問い合わせ中。

spinlock とは

のことなのだろう。Mutex と合わせて、ちょっと調べておく。