Signal 11問題
自分もFreeBSD(98)-currentの開発で何度かひどい目にあったので,その時の
経験や伝聞による知識をまとめてみました.内容は,当然のことですが無保証
です.
症状
FreeBSDあるいはFreeBSD(98)を使っていて,
- カーネルをコンパイルすると,`Segmentation fault'でしょっちゅう落ちる.
- 大きなアプリケーションをコンパイルすると,`Segmentation fault'で
しょっちゅう落ちる.
- とにかく`Segmentation fault'で落ちまくる.
という経験をしたことはないですか?`Segmentation fault'の部分は,ほかに
- Signal 11
- Bus Error
- Signal 10
- Abort
- Signal 6
- 無効命令例外でパニック
- ページフォールトでパニック
- 一般保護例外でパニック
となる場合もあります.コンパイル中であれば,
gcc: Internal compiler error: program cc1 got fatal signal
11
という表示があるかも知れません.さまざまな症状があるわけですが,
よくあらわれるのがSegmentation Faultで,これはSignal 11となることもあ
るので,「Signal 11問題」と呼ぶことにします.
ここでは,このやっかいな問題について考えてみます.
原因
Signal 11問題の原因としては,おおざっぱには以下のものが考えられます.
- コンパイラーのバグ
- カーネルのバグ
- ハードウェアのトラブル
これらについて考えてみましょう.
原因の特定
Signal 11問題の原因はすぐに見つかることもあれば,なかなか発見できない
場合もあります.地道に原因を調べていきましょう.
まず,`make'の最中にSignal 11にはまってしまった時は,再度`make'を実行
してみてください.もし,いくつかのファイルをコンパイルしてから止まった
のであれば,ハードウェアやカーネルにやっかいな問題がある可能性が極めて
高いです.「さらなる原因の追究」に進んで
ください.
もし,同じところで止まるのであれば,以下のコードをコンパイル
したものを用意しておき,それを実行してみましょう.
#include <stdlib.h>
void
f1(p)
char *p;
{
int i;
for (i = 0; i < 4096; i++)
*(p + i) = 1;
}
void
main()
{
char *p;
while (1) {
if ((p = (char *)malloc(4096)) != NULL)
f1(p);
}
}
さて,このプログラムはひたすら記憶領域を1ページずつ消費していきます.
そのうちスワップの嵐がおきるでしょう.激しいディスクアクセスが終わって
も戻ってこないように見えたら,CTRL + Cで強制終了させてかまいません.そ
して,再度`make'を実行してみてください.もし,同じところで止まったので
あれば,
- コンパイラのバグ.システム付属のcc以外のコンパイラ(例えばPentium
用最適化ができるgcc)を使用していませんか?
- コンパイルしようとしているソースにとんでもないコードが含まれていま
せんか?(コンパイラのバグとからんでいることがある)
- 電源に問題はないですか?内蔵ハードディスクドライブがいっぱいある場
合や,電力消費の大きいCPUを使っている場合はチェックが必要です.
- スワップ領域は十分に確保していますか?
- ファイルシステムが飛んでいませんか?
ということを考えてみてください.また,リブートしてもまったく同じところ
で止まることはありませんか?もしそうなら,かなり再現性が高いのでそれな
りの人が分析すれば,原因が特定できる可能性が高いです.この時,発生する
のがカーネルのpanicなら,カーネルの検視解剖
のところを参考にしてみてください.
さて,上記のプログラムを実行した後にいくつか
のファイルをコンパイルすることができたのであれば,ハードウェアやカーネ
ルにやっかいな問題がある可能性が極めて高いです.
ハードウェアやカーネルにやっかいな問題があるようなので,それについて考
えてみます.経験的に言うと,Signal 11問題の原因の大部分は,ディスクと
メモリのデーターのやりとりや,メモリとCPUのデーターのやり取りで問題が
発生することです.たとえば,前のところで実行したプログラムは,仮想記憶
を食い潰し,キャッシュの内容を消し去り,Cプログラムやコンパイラーのバイ
ナリーを再度ディスクから読み直すということをしています.これにより,
Signal 11問題が発生するファイルが変わるということは,「なぜか突然中身
が変わる」ということを意味しています.メモリの内容が予期せぬものになっ
た場合,それがアドレスを示していればどこかとんでもないアドレスにアクセ
スしようとすることになります.また,実行コードであれば,わけのわからな
い命令を実行することになります.これがSignal 11問題の正体です.
このようなことの原因として,
- ディスクのケーブルがおかしい.
- メモリ周りがおかしい.
- キャッシュがおかしい.
- マザーボードがはずれ.
- CPUがおかしい.
- カーネルがおかしい.
が考えられます.まず,以下のことについて検討してみてください.
- ハードディスクのファームウェアーにバグはいませんか?もしかしたら,
ベンダーが情報を提供しているかもしれません.ストレージデバイスのベンダーリス
トからたどってみてください.
- ディスクデバイスとコントローラあるいはマザーボードとの接続は確実に
行われていまずか?
- 斜めにささっていたり,抜けかけていたりしませんか?
- 規格通りのケーブルを使用していますか?
- ノイズをひろっていませんか?
- SCSIバスのターミネーションは正しく行われていますか?
- メモリ関係は大丈夫ですか?BIOSのメモリーテストに通過したからといっ
て安心してはいけません.
- 接点は汚れていませんか?
- アクセス速度が遅すぎませんか?
- BIOSの設定を変えて,余裕を持ったアクセスができるようにしたらどう
なりますか?
- BIOSは正しくメモリのアクセス方法を設定しますか?もしかしたらBIOS
のアップデートが必要かも知れません.
- パリティつきメモリとパリティ無しメモリが混在していませんか?混在
している状態をマザーボードは動作保証していますか?
- EDOラムとファーストページラムが混在していませんか?混在している
状態をマザーボードは動作保証していますか?
- 熱源の近くにありませんか?あるなら,放熱対策はじゅうぶんですか?
- MAXMEMを使い,実際に搭載されているメモリよりも少ないメモリしか使
用しないようにしてみてください.これで問題が解決すれば,高いアドレスの
部分で使用されていたRAMに問題があるかもしれません.SIMMを入れ替えたり
してみてテストしてみてください.(ただ,カーネルのバグでこのような症状
がでる可能性も否定できません.むずかしいのです.)
- リマーク品をつかまされていませんか?
- キャッシュ関係は大丈夫ですか?
- キャッシュメモリは正しく取りつけてありますか?
- BIOSの設定やバージョンに問題はないですか?
- マザーボードがバグっている可能性はありませんか?ジャンパーピンなど
の設定は正しいですか?
- CPUはまともに動いていますか?
- オーバークロックしてませんか?
- ファンなどの放熱対策は十分ですか?
- リマーク品をつかまされていませんか?
- じつはバグありCPUをつかまされたということはないですか?
- CPUのバグのため使用すべきでない機能を使用していませんか?
- CPUのバグが気になるなら,Signal 11関
連のCPUバグを参考にしてみてください.
- CPUのバグによりおかしなことが起こった例は,カーネルデバッグの実例(その1)にあります.
- マザーボードは,あなたが使用しているCPUをサポートしていますか?
- その他,ハードウェアー関係に怪しいところがないですか?設計がダサい
ボードを使用していませんか?
ハードウェアのことをいくら考えても原因がみつからなければ,いよいよカー
ネルのバグを疑います.排他処理に問題がある場合など,いろいろ原因は考え
られます.しかし残念ながら詳しい原因はここに書くことができません.もし
ここに書くことができるのであれば,とっくにsend-prを使って報告している
か,自分で修正しているからです.
ただ,カーネルにバグがあってもSignal 11問題は発生するということを忘れ
てはならないと思います.crrentを使い続けている人なら,cluster
read / writeが有効になった直後に何が起きたか思い出してみてください.
熱について
計算機には多数の半導体が使われています.これらは以下のことをするとより
速いクロックについていきます.
しかし,オーバークロックや,電源の昇圧は発熱量を多くしたり場合によって
は半導体部品を破壊したりしてしまいます.また,発熱対策が不十分であれば,
半導体部品の温度上昇を引き起こします.温度が上がれば,耐えられるクロッ
ク数は低くなります.あまりに温度が上昇しすぎると定格すら満たさなくなり
ます.当然,Signal 11問題の原因にもなり得ます.
謝辞
Signal 11問題については,上記のcluster read / writeの変更(実は,他にも
重大な変更が重なっていてわけわかんなかった)があっておもいっきりはまっ
ていた時に,FreeBSD(98)開発用メーリングリストで本多さん@北大にもらっ
たアドバイスが知識のみなもとになっています.というより,ほとんど受け売
り状態のものがあります.本多さん,ありがとうございます!また,私の
ハードディスクを何度もクラッシュさせたCyrix 5x86 CPUのBTBも,私が
Signal 11問題を考えるきっかけになっているので,Cyrixにも感謝します :-).
|