アプリケーションの差し迫った障害を示唆する、プログラムでチェックできるインジケーターを探しています。「空きIOスレッドの数が危険なほど少ない」、「アプリプールで使用できるメモリが少ない」、「プロセッサの使用率が高い」などの一般的なものを探しています。
これはC#/asp.netおよびIIS用です。
プログラムで値をチェックする例はいいでしょうが、必須ではありません。どんな良いアイデアでも歓迎します。
私は実際、数年前にこれを理解しようとする仕事をしていました。これは非常に難しい作業であることが判明しました。最近では、OS を信頼することさえできないため、.net サンドボックス内で実行すると、実際に何が起こっているのかを判断することがほとんど不可能になります。
これを進めることにした場合に考慮すべきいくつかの簡単な状況を次に示します。
CPU - 現在の CPU 使用率を判断できる場合がありますが、特定のインスタンスが 1 つの CPU にバインドされているかどうかはどうすればわかりますか? クラスターで実行しているかどうか、または他のコアが何をしているかをどのように判断しますか? CPU またはスレッドが制限された仮想マシン内で実行している可能性があります。これらの制限はその場で変更される可能性があります。
メモリ - 仮想化されたインスタンス内で実行している場合はどうなりますか? 使用可能なメモリの量を増減するために突然外部の変更が加えられた場合はどうなるでしょうか?
一部の組み込みシステム パフォーマンス カウンターの値にプログラムでアクセスできます。さらに具体的な詳細が必要な場合は、独自のカウンターを作成してクエリを実行することもできます。
始めるための記事は次のとおりです: プログラムで CPU 使用率を計算する方法
私の考え:
Web アプリケーションのパフォーマンスの入力と出力を決定します。
実際のリクエスト データでアプリケーションをプロファイリングします。入力とそれに関連する出力の適切なテーブルを作成します。例えば:
4 users calling page1 -> costs 4 - 6 mb, 4 threads
5 users calling page1 -> costs 7 - 14 mb, 5 threads
2 users calling page2 -> costs 120 - 200 mb, 1 thread
失敗の原因となることが多い出力を見つけ、それらの出力を引き起こす入力を見つけます。適切な失敗の最大可能性モデルを構築します。
入力が失敗の出力に近づき始めると、差し迫った失敗がある程度の確率で発生する可能性があります。障害が発生したときと発生しなかったときを記録し、この情報をテーブルにフィードバックします。Web アプリケーションは、いつ失敗するかを学習します。
出力を見つけることは最も簡単な部分です。
SO の質問How to get memory used in c#、How to get the cpu usage in C#、およびより一般的な質問What key performance monitor should I watch for asp.net application を参照してください。
これらの質問の要点:
GC.GetTotalMemory - ガベージ コレクターによって割り当てられた容量を示します。
プロセッサ オブジェクト- CPU に関するあらゆる種類の興味深いパフォーマンス統計 (CPU のアイドル時間、使用状況など) を示します。
プログラム化されていないかもしれませんが、倒産を防ぐために実行しなければならないサポートや残業の時間数を集計しておくことは、良い指標になるかもしれません。:-)
アプリ自体が失敗するのではなく、失敗の外因に関心があるようです。あなたはここでシスフィアンな仕事に従事しようとしていると思います。考えられる障害要因を推測しようとするのではなく、ワーカー プロセスを構成してこれらの問題を軽減することに集中してください。IIS ワーカー プロセスは非常に回復力があります。ping、リサイクルなどの機能を確認してください。