检测网站记录执行统计数据的可接受方法是什么?
例如,我想知道执行某些操作需要多长时间,例如使用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);
问题在于我对使用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");
现在我有一些统计数据存在于记忆中。我可以让网站运行几个月,随时我可以连接到服务器并查看分析统计信息。这非常适合SQL Server在各种报告中显示自己的运行历史记录的能力:
问题是这是一个ASP.net网站/应用程序。在整个一年的过程中,Web服务器将通过回收应用程序池来决定关闭应用程序:
当网络服务器决定关闭时,我的所有统计信息都会丢失。
是否有 任何 ASP.net性能/工具框架来解决此问题?
我考虑过在SQL Server中存储我的统计信息。就像ASP.net会话状态可以在每个请求完成后存储在SQL Server中一样,我每次都可以在SQL Server中存储我的值:
void AddSample(String sampleName, long elapsedTicks)
{
using (IDbConnection conn = CreateDatabaseConnection())
{
ExecuteAddSampleStoredProcedure(conn, sampleName, elapsedTicks);
}
}
除了现在我已经在我的应用程序中引入了一个巨大的延迟。此分析代码每秒调用数千次。当数学仅在内存中执行时,它需要几微秒。现在需要几十毫秒。 (因数为1,000;显着延迟)。那不行。
我考虑通过实施IRegisteredObject
向ASP.net托管环境注册我的静态助手类:
public class ShutdownNotification : IRegisteredObject
{
public void Stop(Boolean immediate)
{
Profiler.SaveStatisticsToDatabase();
}
}
但我很好奇解决这个问题的正确方法是什么。比我聪明的人必须先在ASP.net中添加配置文件。
答案 0 :(得分:0)
我们使用Microsoft的应用程序性能监视。它捕获页面加载时间,数据库调用时间,API调用时间等。当页面加载意外地变慢时,它还会提醒我们并提供堆栈跟踪以及影响加载时间的各种调用的时间。它有些简陋,但它可以解决这个问题,并允许我们验证我们没有任何不符合预期的变化。
预先警告:UI仅适用于IE。