ウォッチドッグ(意図的にシステムに過負荷を与えるスクリプトまたはコマンド)をテストする良い方法は何ですか?

ウォッチドッグ(意図的にシステムに過負荷を与えるスクリプトまたはコマンド)をテストする良い方法は何ですか?

ハードウェア監視機能がありますが、実際に動作しているかどうかをテストするための良い方法はありますか?私のシステムをすべてのリソースを使用する無限ループに設定したり、ハードウェア監視をトリガーするための類似した標準スクリプトまたは類似のスクリプトがありますか?

答え1

ウォッチドッグをテストする簡単な方法は、カーネルパニックを引き起こすことです。これはrootとして実行できます。

echo c > /proc/sysrq-trigger

カーネルはウォッチドッグ ping に対する応答を停止するので、ウォッチドッグが実行されます。

SysRqはユーザーが押すことができる「魔法の」キーの組み合わせであり、カーネルが完全にロックされていない限り、何をしてもそれに反応します。/proc/sysrq-triggerここで行ったように、文字をエコーし​​て使用することもできます。

この場合、文字はcシステムの競合を実行し、競合ダンプ(構成されている場合)を実行することを意味します。

次の文書を見つけることができますSysRq ここ

答え2

ウォッチドッグが正しく機能し、ユーザー空間でウォッチドッグプロセスを実行していることをテストするには(カーネルスレッドで実行されているカーネルウォッチドッグとは対照的に)、プロセスを終了または停止します。これは応答しないシステムをシミュレートします。ハードウェアウォッチドッグは次のとおりです。いいえハードウェアがタイマーをリセットする場所です。ハードウェアウォッチドッグは、ハードウェアにタイマーを実装するウォッチドッグです。いずれにしても、ソフトウェアは監視タイマーを定期的にリセットします。

ウォッチドッグが装備されているがアクティブではないかどうかをテストするもう1つの一般的な方法は、単にオンにすることです。

# cat >> /dev/watchdog

これは、監視プロセスが実行されていないと仮定します。オンになると、監視タイマーが起動します。cat開いたばかりで、何も記録されていないので(読んでstdin入力が来ないのを待っています)、最終的にタイマーが期限切れになり、システムがリセットされます。


重い荷重でも、通常、システムは監視がタイムアウトするまでロックされません。ウォッチドッグは、システムが失敗した場合にシステムを再起動するように設計されています。回復できない、または少なくとも一定期間内に復元することはできません。これは、非常に高いメモリ圧力やデバイスのブロックされたスワップ先などのハードロックが原因で発生する可能性があります。

コンピュータにはCPUコアの数が制限されています。 SMTを無視すると、各コアは特定の瞬間に1つのプロセスしか実行できません。プロセスがあまりにも時間を費やすのを防ぐために、カーネルスケジューラは以下を指定します。タイムピース。各プロセスはそのタイムスライス内で実行できますが、期限切れになると(またはプロセスが自発的にブロックシステムコールを実行または実行すると)、カーネルは自動的にこれをプリエンプションし、別のプロセスの実行を開始します。このデザインは、プロセスが次のことを実行できることを意味します。いいえ単に多くのCPUを使用して、他のプロセスが実行されるのを防ぎます。カーネルが健康であれば同じです。

ユーザー空間で実行されるプロセスは、いつもカーネルによって先取りされました。このようなことが起こるのを防ぐことはできません。フルタイムスライスを使用してシステム負荷を100%に保つことはできますが、カーネルが他のプロセスの順番を実行するのを防ぐことはできません。ただし、ページフォールト、シグナル、システムコールなどが原因でカーネルスペースで実行されていますが、カーネルが要求を実行できず、ユーザースペースに戻ることができないという問題が発生した場合、プロセスがロックされ、スケジューラを実行する機会が得られません。すべてのコアでこれが発生した場合、ウォッチドッグは実行する機会がなくなり、最終的にタイマーがタイムアウトし、プロセスでシステムがリセットされます。

答え3

過去には、これはperl -e '1 while 1'システムが非常に混雑していたでしょう。しかし、64コアまたは他のタイプのマルチプロセッサシステムでは、これは単に面倒なことであり、実際にメモリを消費しません。 (Linuxでは)1つのアプローチは、メモリ不足キラーの前にプロセスを作成し、システムが最終的にクラッシュするようにすることです。これを達成する1つの方法は、単一のプロセスにできるだけ多くのメモリを割り当て、複数のワーカースレッドを作成し、そのスレッドに割り当てられたすべてのメモリに対してランダムなメモリアクセスを実行させることです。その後、これらのプロセスを開始しようとするいくつかのシェルループがあり、すべて可能な限り多くのメモリを占有します。誰かがこの内容に従ってスクリプトを書いたかもしれません。

https://github.com/thrig/scripts/blob/master/bench/usemem.c

rand()これは、スレッドの呼び出しで置き換えることができるカスタムRNGを使用します。 Linux でコンパイルされてからかなり古いので、-DLinux でコンパイラを癒すためにさまざまな定義が必要になる場合があります。

関連情報