2006年07月13日
Linuxでクラッシュダンプを採取(5) 〜 nmi_watchdogとの併用 〜
とりあえず、ここまでの仕組みで「カーネルパニックが発生」した際のクラッシュダンプを採取することはできそうです。しかし、実際にトラブルが発生する状況では綺麗にパニックしてくれることは希で、大抵の場合はどうにもこうにも身動きがとれなくなってしまいがちなものです。ping が通らなくなりコンソールでの制御が不能になってみたり・・・
本気でクラッシュダンプが欲しい状況ってまさにこんな状況のときなわけですが、制御不能になったサーバのダンプを採取するためにはどうすればよいのでしょうか。sysrq で強制的にパニックさせるしかないのかなあと思っていたら、「路地裏 ソース解読研究所」の「最強の割り込み」で nmi_watchdog というものが紹介されていました。「定期的に NMI を発行させて自分自身の死活監視するですか、へえぇ〜」と思いつつ実際にやってみました。
しかし、問題はどうやって動作確認するかですよね。
だめもとでサーバを過負荷状態に追い込んでロードアベレージを350くらいまで上げてみたんですが、さすがに割り込み処理はちゃんと動いてるようでなかなか落ちてくれません。(逆に過負荷なだけで nmi_watchdog が効いてしまうのも困るので一安心ですが・・・)
で、ふと思い立ってこんなカーネルモジュール(stall.c)を書いてみました。
初期化時に割り込みを禁止したままだんまりしてしまう極悪非道のモジュールです。
(危険ですのでマネしないでください・・・念のため)
コンパイルして insmod stall.ko したところ、綺麗に(?)セカンドカーネルが立ち上がってダンプを残してくれました。
その際のログはこんな感じです。
なんとなくいい感じの動作をしているように見えます。
しかし、問題はどうやって動作確認するかですよね。
だめもとでサーバを過負荷状態に追い込んでロードアベレージを350くらいまで上げてみたんですが、さすがに割り込み処理はちゃんと動いてるようでなかなか落ちてくれません。(逆に過負荷なだけで nmi_watchdog が効いてしまうのも困るので一安心ですが・・・)
で、ふと思い立ってこんなカーネルモジュール(stall.c)を書いてみました。
static int __init stall_init(void)
{
printk("stall module loading\n");
local_irq_disable();
while(1);
return 0;
}
module_init(stall_init);
初期化時に割り込みを禁止したままだんまりしてしまう極悪非道のモジュールです。
(危険ですのでマネしないでください・・・念のため)
コンパイルして insmod stall.ko したところ、綺麗に(?)セカンドカーネルが立ち上がってダンプを残してくれました。
その際のログはこんな感じです。
crash> log
stall module loading
NMI Watchdog detected LOCKUP on CPU0, eip f8872010, registers:
Modules linked in: stall i2c_i801 e1000 psmouse
CPU: 0
EIP: 0060:[] Not tainted VLI
EFLAGS: 00000082 (2.6.16.24 #1)
EIP is at stall_init+0x10/0x12 [stall]
eax: 0000002a ebx: f8870400 ecx: c031a1b0 edx: 00000292
esi: 080486e1 edi: b7f9ef30 ebp: f2d02000 esp: f2d03f9c
ds: 007b es: 007b ss: 0068
Process insmod (pid: 21270, threadinfo=f2d02000 task=e14ef5f0)
Stack: f887005e c013a3ad c03b6108 00000001 f8870400 b7e2b008 080486e1 c0102d45
b7e2b008 0002364e 0804b008 080486e1 b7f9ef30 bfdbd968 00000080 0000007b
c010007b 00000080 b7f4570e 00000073 00000246 bfdbd920 0000007b 5a5a5a5a
Call Trace:
[17186313.728000] [] sys_init_module+0x188/0x235
[17186313.728000] [] syscall_call+0x7/0xb
なんとなくいい感じの動作をしているように見えます。
klab_gijutsu2 at 14:55│Comments(2)│TrackBack(0)
トラックバックURL
この記事へのコメント
1. Posted by やすま 2006年07月13日 21:41
![5](https://parts.blog.livedoor.jp/img/star/5.gif)
実は私自身も自分でNMI割り込みでダンプ取ったことなかったりします。なのであの記事はちょっと嘘書いてないかびくびくしながら、書きました。
ただ、Oracle利用ユーザはシステムストールに敏感なので、nmi_watchdogを使うことがかなり昔から推奨されていたので、書いてみた次第です。
多分、ダウンタイムが短いシステムでは結構設定されているんではないかと思います。
2. Posted by 安井 2006年07月14日 14:38
やすまさん、コメントありがとうございます。
とりあえずテストではうまくいきましたが、実運用でどうなるかどきどきものです。DSASに組み込みにはもう少し練らないといけ部分も残ってますが、この仕組みがトラブル解析の役にたってくれるものと期待してます。
いままではストレスの元だったカーネルストールも、今後は多少は楽しめるようになるかもしれません。
とりあえずテストではうまくいきましたが、実運用でどうなるかどきどきものです。DSASに組み込みにはもう少し練らないといけ部分も残ってますが、この仕組みがトラブル解析の役にたってくれるものと期待してます。
いままではストレスの元だったカーネルストールも、今後は多少は楽しめるようになるかもしれません。