実行統計を記録するために Web サイトを計測する一般的な方法は何ですか?
Xまでの所要時間
たとえば、Active Directory サーバーでユーザーの資格情報を検証するなど、何らかの操作を実行するのにかかる時間を知りたいです。
authenticated = CheckCredentials(Login1.UserName, Login1.Password);
多くの人が、さまざまな種類のTracingを使用して、興味深いパフォーマンス メトリックを出力、ログ、または記録することを提案します。
var sw = new System.Diagnostics.Stopwatch();
sw.Start();
authenticated = CheckCredentials(Login1.UserName, Login1.Password);
sw.Stop();
//write a number to a log
WriteToLog("TimeToCheckCredentials", sw.ElapsedTicks);
X ではありません。すべて X
これの問題は、Active Directory に対してユーザーの資格情報を検証するのにかかった時間には興味がないことです。ActiveDirectory で何千ものユーザーの資格情報を検証するのにかかった時間に興味があります。
var sw = new System.Diagnostics.Stopwatch();
sw.Start();
authenticated = CheckCredentials(Login1.UserName, Login1.Password);
sw.Stop();
timeToCheckCredentialsSum = timeToCheckCredentialsSum + sw.ElapsedTicks;
timeToCheckCredentialsCount = timeToCheckCredentialsCount + 1;
if ((sw.ElapsedTicks < timeToCheckCredentialMin) || (timeToCheckCredentialMin == 0))
timeToCheckCredentialMin = sw.ElapsedTicks;
if ((sw.ElapsedTicks > timeToCheckCredentialMax) || (timeToCheckCredentialMax == 0))
timeToCheckCredentialMax = sw.ElapsedTicks;
oldMean = timeToCheckCredentialsAverage;
newMean = timeToCheckCredentailsSum / timeToCheckCredentialsCount;
timeToCheckCredentialsAverage = newMean;
if (timeToCheckCredentailsCount > 2)
{
timeToCheckCredentailsVariance = (
((timeToCheckCredentialsCount -2)*timeToCheckCredentailsVariance + (sw.ElapsedTicks-oldMean)*(sw.ElapsedTicks-newMean))
/ (timeToCheckCredentialsCount -1))
}
else
timeToCheckCredentailsVariance = 0;
これは、次のように簡単に抽象化できる多くのボイラープレート コードです。
var sw = new System.Diagnostics.Stopwatch();
sw.Start();
authenticated = CheckCredentials(Login1.UserName, Login1.Password);
sw.Stop();
//record the sample
Profiler.AddSample("TimeToCheckCredentials", sw.ElapsedTicks);
これはまだ多くの定型コードであり、次のように抽象化できます。
Profiler.Start("TimeToCheckCredentials");
authenticated = CheckCredentials(Login1.UserName, Login1.Password);
Profiler.Stop("TimeToCheckCredentials");
今、私はいくつかの統計をメモリに置いています。Web サイトを数か月間稼働させることができ、いつでもサーバーに接続してプロファイリング統計を確認できます。これは、さまざまなレポートで独自の実行履歴を表示する SQL Server の機能です。
しかし、ASP は警告なしにアプリを強制終了します
問題は、これが ASP.net Web サイト/アプリケーションであることです。1 年を通してランダムに、Web サーバーはアプリケーション プールをリサイクルして、アプリケーションをシャットダウンすることを決定します。
- おそらく3週間アイドル状態だった
- リサイクル時間の上限 (24 時間など) に達した可能性があります。
- おそらくファイルの日付が変更され、Web サーバーはアプリケーションを再コンパイルする必要があります
Web サーバーがシャットダウンすることを決定すると、すべての統計が失われます。
この問題を解決する ASP.net パフォーマンス/インストルメンテーション フレームワークはありますか?
SQL Server への永続化を試みる
統計を SQL Server に保存することを考えました。すべてのリクエストが完了すると、ASP.net セッション状態を SQL Server に保存できるように、毎回 SQL Server に値を保存できます。
void AddSample(String sampleName, long elapsedTicks)
{
using (IDbConnection conn = CreateDatabaseConnection())
{
ExecuteAddSampleStoredProcedure(conn, sampleName, elapsedTicks);
}
}
今を除いて、私はアプリケーションに巨大な待ち時間を導入しました. このプロファイリング コードは、1 秒間に何千回も呼び出されます。計算がメモリ内でのみ実行される場合、数マイクロ秒かかります。今では数十ミリ秒かかります。(係数 1,000; 顕著な遅延)。それはうまくいきません。
アプリケーションのシャットダウン時にのみ保存
以下を実装して、静的ヘルパー クラスを ASP.net ホスティング環境に登録することを検討しましたIRegisteredObject
。
public class ShutdownNotification : IRegisteredObject
{
public void Stop(Boolean immediate)
{
Profiler.SaveStatisticsToDatabase();
}
}
しかし、この問題を解決する正しい方法が何であるかに興味があります。私より賢い人は、以前に ASP.net にプロファイリングを追加したことがあるはずです。