3

実行統計を記録するために 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 にプロファイリングを追加したことがあるはずです。

4

1 に答える 1