以下は、Linux カーネル文書、Documentation/lockup-watchdogs.txt の kanda.motohiro@gmail.com による訳です。原文と同じ、GPL v2 で公開します。
===============================================================
ソフトロックアップ検出器と ハードロックアップ検出器 (nmi_watchdog とも呼ばれます)
===============================================================
Linux カーネルは、ソフトとハードなロックアップを検出するウォッチドッグとしてはたらくことができます。
「ソフトロックアップ」とは、20秒以上、カーネルがカーネルモードでループして、他のタスクに走る機会を与えないようにするバグと定義されます。(詳しくは、下の、「実装」を参照下さい。)それが検出されると、現在のスタックトレースが表示され、デフォルトでは、システムはロックアップしたままとなります。
その代わりに、カーネルをパニックするように設定もできます。
sysctl "kernel.softlockup_panic" あるいは、カーネルパラメタ "softlockup_panic" (詳しくは、"Documentation/kernel-parameters.txt" を参照下さい。)そして、コンパイルオプション "BOOTPARAM_SOFTLOCKUP_PANIC" がそのために提供されます。
「ハードロックアップ」は、10秒以上、CPU がカーネルモードでループして、他の割り込みに走る機会を与えないようにするバグと定義されます。(詳しくは、下の、「実装」を参照下さい。)ソフトロックアップの場合と同様、それが検出されると、現在のスタックトレースが表示され、デフォルトの振る舞いが変更されてなければ、システムはロックアップしたままとなります。
デフォルトは、コンパイルオプション "BOOTPARAM_HARDLOCKUP_PANIC" と、カーネルパラメタ nmi_watchdog" (詳しくは、"Documentation/kernel-parameters.txt" を参照下さい。)で変えられます、
パニックオプションは、panic_timeout と組み合わせられます。(このタイムアウトは、混乱する名前の、"kernel.panic" sysctl で設定され、指定された時間が経ったら自動的にシステムをリブートします。
=== 実装 ===
ソフトとハードロックアップ検出器は、それぞれ、hrtimer と perf サブシステムの上に構築されます。この直接の結果は、原理的には、それは前記サブシステムが存在する全てのアーキテクチャで動作するはずだということです。
周期的な hrtimer は、割り込みを生成するために動作し、ウォッチドッグタスクをキックします。"watchdog_thresh" (コンパイル時に10と初期化され、同じ名前の sysctl で変更できます。)秒ごとに、NMI perf イベントが生成されて、ハードロックアップをチェックします。システムのいずれかの CPU がその間に hrtimer 割り込みを何も受け取っていない場合には、「ハードロックアップ検出器」(NMI perf イベントのハンドラ)は、設定により、カーネル警告を出すか、あるいは、パニックします。
ウォッチドッグタスクは高優先度のカーネルスレッドで、自分がスケジュールされたときに、タイムスタンプを更新します。もし、タイムスタンプが、2*watchdog_thresh 秒(ソフトロックアップしきい値)の間、更新されないときは、「ソフトロックアップ検出器」(hrtimer コールバック関数内にコードされています)がシステムログに有益なデバッグ情報をダンプし、その後、設定により、パニックを呼ぶかあるいは他のカーネルコードの実行を再開します。
hrtimer の周期は、2*watchdog_thresh/5 です。ということは、ハードロックアップ検出器が呼ばれるまでに、割り込みを生成する機会が、2あるいは3回はあるということです。
前述したように、管理者が hrtimer と perf イベントの周期を設定することができるカーネルのつまみが提供されます。特定の環境での正しい値は、高速なロックアップ検出と検出オーバヘッドのトレードオフになります。
デフォルトでは、ウォッチドッグは全てのオンラインのコアで動作します。しかし、NO_HZ_FULL の設定のあるカーネルでは、デフォルトではウォッチドッグはハウスキーピングコアでだけ動作します。"nohz_full" ブート引数で指定されたコアでは、動作しません。もしも、"nohz_full" コアでデフォルトでウォッチドッグを走らせたら、スケジューラを活性化するためにタイマーチックを動かす必要があり、それは、これらのコアで、カーネルからユーザコードを保護するという "nohz_full" 機能のじゃまをすることになります。もちろん、nohz_full コアでデフォルトでそれを無効とすることは、これらのコアが実際にカーネルに入った時には、デフォルトでは、それがロックアップしても検出できないことを意味します。しかし、ハウスキーピング(チックレスでない)コアにおいてウォッチドッグが動き続けられるということは、これらのコアでは正しくロックアップの検出ができることを意味します。
いずれの場合も、ウォッチドッグを走らせないコアのセットは、kernel.watchdog_cpumask sysctl で調整することができます。nohz_full コアの場合、それは、nohz_full コアにおいてカーネルがハングしているらしい時のデバッグに便利です。
以上