困難な気象条件でのプログラムのテスト



こんにちは、Habr様! 私は、発電所、宇宙センター、複雑な産業などで使用される、信頼性の高い自動制御システムの開発に参加しています。 かつて、 あらゆる種類のハードウェアが存在する状態でプログラムの操作性をチェックする方法を思いつくという課題に直面しました。
  1. CPU使用率
  2. 送受信によるネットワーク輻輳
  3. RAM不足
  4. ハードディスクの読み込み/書き込み要求
また、特定のプログラムが他のプログラムが機能するための遅延/干渉をどれだけ作成できるかを評価する方法を考え出します。 私の意見では、これらの4つの中で最も興味深いのは最初のポイントであるため、それに焦点を当てます。

猫の下で、私が得た2つのユーティリティ、それらの仕事の原理、およびいくつかのスクリーンショットとビデオが説明されています。



したがって、テスト済みのプログラムのセットがあります。

高プロセッサ負荷下での安定性をチェックするプログラムを開発する必要があります。


それはもっと簡単に思えるかもしれません:



while true do x:=x+1-1;
      
      





ここに車を積みました。

ただし、(タスクマネージャからの)プロセッサ負荷の100パーセントが100パーセント不一致であることを説明する必要があります。 まず、コンピューター上に複数のコアが存在する場合があり、1つのコアをロードすると、もう1つのコアが静かに動作します。 第二に、すべてのプロセッサコアが100%占有されていて、熱風を噴き出す冷却ファンがコンピューターをオフィスに自由飛行させようとしても、テストされたプログラムの動作に少なくとも何らかの影響を与える保証はありません。いくつかの目に見える遅れの遅れについて話す。

しかし、MouseClickは、MouseDownの3秒後、5秒後に動作する1秒のタイマーにしたいので、プログラムスレッドが同期し、制御された混乱が発生するのは本当に「困難」です。



ここで、各コア/プロセッサに個別のスレッド(クラスTThread)を作成する必要があることが明らかになります。

コアの数を確認します。



  var info: TSystemInfo; ... GetSystemInfo(info); n:=info.dwNumberOfProcessors;
      
      





次に、意味のない計算が回転するn個のスレッドを作成します。 オペレーティングシステム自体がそれらを異なるコアに分散します。 同時に、作成されたスレッドの優先度が少なくとも2つの値の間でランダムに切り替わる必要があります。 これを行わない場合、優先度が低いと、テストされたプログラムは何も「感じない」可能性があり、優先度が高すぎると、プロセッサ時間をほとんど受け取ることができません。 tpTimeCriticalから他の何かへの切り替えを保証するために、作成したいくつかのストリームの優先順位が重要になることがあるため、重要なストリームがそれに対処する必要があります。

私のプログラムでは、スレッドを作成するときに、そのうちの1つを「フォアマン」にします。このフォアマンは、自分の優先順位と他のすべての優先順位を同期して自分自身に切り替えます。

作成中に、いつ、どの優先順位を切り替えるかを制御スレッドが決定できるように、必要なパラメーターを要求します。



P1 + p2 = 100%であることは明らかです。

pr1が重要な優先順位であり、pr2が正常であると判断した場合、一種の「制御されたカオス」 が発生します。これは、特定の分布を持つコンピューターの一連のほぼ完全なシャットダウンです



どういうわけかそれをすべてチェックして修正するために残っています。

だから...



カオスを作って見てみましょう


私はタイムラインのようなものを使用しました:





間隔が100ミリ秒の通常のタイマーによれば、このスケールの内容はMピクセルだけ左にシフトされます。ここで、Mは前の測定から経過した数百ミリ秒の数です。 右側の空きスペースは赤で塗りつぶされ、ピクセルの右端の列は緑の影で塗りつぶされます。 したがって、遅延がない場合、つまり M = 1、スケールの内容は100ミリ秒ごとに1ピクセル左にスライドし、右側に緑の列が描画されます。 大幅な遅延が発生すると、Mが1より大きくなり、発生した遅延に比例する幅の赤いストライプが観察され始めます。 スケールの右側の数字は、最後の数秒間の通常の動作時間に対する遅延時間の比率を示しています。 ビデオ録画はプロセス全体を示しています。







ビデオの「レッドゾーン」では、マウスがほとんど機能しない様子を見ることができます。

自分で、ビデオが表示されないことを追加します。音楽が再生されない、ビデオ、プログラムが起動しないなどです。



さて、今では各プロセッサコアに対して個別にそのようなスケールを作成することだけが残っており、特定のプログラムが特定のコアまたはプロセッサ全体の動作の遅延をどの程度調整するかを観察し、スクリーンショットを撮り、評価できます。

これを行うには、プロセッサ内のコアと同じ数のスレッドを作成します。 システムを使用して、APIを使用して異なるカーネルでそれらを実行します。



  SetThreadAffinityMask(handle,mask);
      
      





メモリ内のこのような各プロセスは、独自のスケールを保持し、上記のアルゴリズムに従ってメモリ内で完了します。 同時に、測定間の時間を短縮することにより、遅延に対する感度を高めることができます。 さて、メインプログラムでは、別のタイマーに従って、これらすべてのスケールが上下に並んで表示されます。 結果はビデオで見ることができます:







テスト中のプログラムが他のプログラムの作業をどれだけ遅らせるかを評価するために、私の特定のケースでは、スタイルのこれらのスケールの画像のいくつかの主観的な評価で十分でした:

「スケールはすべてのコアでほぼ緑色であるため、プログラムAは他のプログラムにそれほど干渉しませんが、プログラムBの場合、反対にスケールは半分赤色であり、注意する必要があります。」



ただし、プログラムがシステムで行う遅延の数値評価を行うには、次のような指標を識別する必要があることに注意してください。遅延時間の分布関数、マット。 遅延、遅延の分散を待っています。

これらの指標により、主観的な評価を避けたり、プログラムやアルゴリズムの明確な要件を策定したりすることができます。

尊敬されるHabrasocietyがそのような情報を有用であると考えるならば、私は喜んでそれを次のトピックのトピックにします。



このテキストが誰かにとって興味深いものになり、誰かにとって有用であることが判明した場合、私は非常に幸せになることを願っています! ;-)



PS。 私はここで新しいです。 サイトのすべてのセクションを正直に確認しましたが、配置に適した場所が見つかりませんでした。 ヒントに感謝します。



UPD

同様のソリューションとツールへのリンクを提供してくれたhabraの人々に感謝します。

それらのリストは次のとおりです。




All Articles