この週末の間に2度も「このサイトを動かしている」サーバーがデッドロックするというトラブルが発生しました。
Webサーバーの画面リフレッシュに失敗してしまうため、「プロキシープロセスが落ちたかな?」 というくらいの気持ちで、ターミナルエミュレータからサーバーへコマンドを送ったところ無応答!
やむなくサーバーのキーボードから直接コマンドを送ろうとしたところ、次のようなエラーが画面に表示されていました。1度目は一時的なものかと思って記録しませんでしたが、26時間くらいで2度目が発生となるとちょっとやばいかもって記録することにしました。
ad0: TIMEOUT – WRITE_DMA retrying (1 retry left) LBA=575
unknown : TIMEOUT – READ_DMA retrying (1 retry left) LBA=13351747
ata0: timeout waiting to issue command
ata0: error isssuing READ_DMA command
ですって。
ad0: 8223MB <Seagate ST38410A 3.07> at ata0-master UDMA66
症状としては、コンソールキーボードから仮想端末の切り替えはできるものの、コマンド入力やログイン、ctrl+alt+del などのキーボード操作は受け付けません。ネットワークからも入れません。(pingを試すのを忘れた。)仮想ターミナルが切り替えられるということはダウンはしていないですが、コマンド入力による回復作業を行えないということ。どうしようもないので、一度目はリセットボタンを押しました。(電源停止は行っていない。)
ログにはこのエラーと関係しているような不自然な事前エラーが残っていないし、ログが停止している時刻から深夜の比較的涼しい時間帯、ただしCPU高負荷時、に発生していることがわかっています。
サーバーは、i810チップセットのボードにIDE HDDを3台の構成なので、起動用HDDへの書き込み、読み出しに失敗しているということを示しているようです。しかし、これくらいでOSのカーネル部分が止まってしまうってどういうこと? アクセスできなかったそのデータ部を使っているプロセスがクラッシュする程度で済みそうなものです。
一度目の発生時は電源停止は行っていないため、HDDに何か不都合な状態が残ったままになっていたのかもしれないと考え、二度目は情報をメモした他、数秒間完全に電源を停止させてPCパーツから電荷を抜きました。(抜けたはず。)
今は証拠が少なすぎるので原因が何かは特定できませんが、ログに残っていたメッセージから判断すれば ad0 HDDかメインボードのIDEインタフェースかケーブルが怪しいということになります。もし次に発生することがあった場合、エラーメッセージによってはHDD交換してみる必要があるかもしれません。
<2013/08/06 追記>
今朝もダウンしないものの操作不能状態になっていました。
xl0: transmission error: 0x90
xl0: tx underrun, increasing tx start threshold to 120 bytes
unknown: TIMEOUT – WRITE_DMA retrying (1 retry left) LBA=46911
ata0: timeout waiting to issue command
ata0: error issuing WRITE_DMA command
前回とLBAの位置がかなり違うためHDD上に不良セクターがあるわけではないようです。
ちなみに ATAインタフェースエラーの上の tx underrun は、サーバー起動から一日以内であるため、OSがNICのバッファサイズを自動調節しているもので、本件には関係ないと判断しています。
とりあえず夜間に動いている boinc を止めてみたいと思いますが、どこかのタイミングでケースを開けて、ケーブルとコネクタの抜き差しを行ってみたいと考えているところです。


夜間ジョブのBoincを停止してみたところ、その後はサーバーが操作不能になる現象が発生していません。
このことから推測すると、boinc が計算結果や経過を書き込んでいるファイルが偶然 HDD に発生した bad sector の上にあるってことかもしれません。
さらに切り分けるためには、現時点のboinc ディレクトリをリネームして放置し、新しい boinc ディレクトリを作って夜間ジョブを再スタートさせればいいと思います。
現時点でそこまでする気にならないため、何か別件でサーバー構成を再検討するときに検討することにして、現サーバーでのBoinc計算は一旦停止。