检测网站记录执行统计数据的公认方法是什么?
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");
现在我在内存中有一些统计数据。我可以让网站运行几个月,并且在任何时候我都可以连接到服务器并查看分析统计信息。这是 SQL Server 在各种报告中呈现其自己的运行历史的能力:
但是 ASP 在没有警告的情况下杀死应用程序
问题是这是一个 ASP.net 网站/应用程序。在一年的过程中,网络服务器会随机决定关闭应用程序,通过回收应用程序池:
- 也许它已经闲置了 3 周
- 也许它达到了最大回收时间限制(例如 24 小时)
- 也许文件上的日期发生了变化,网络服务器必须重新编译应用程序
当网络服务器决定关闭时,我所有的统计数据都会丢失。
是否有任何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,000 的系数;明显的延迟)。那是行不通的。
仅在应用程序关闭时保存
我已经考虑通过实现在 ASP.net 托管环境中注册我的静态帮助程序类IRegisteredObject
:
public class ShutdownNotification : IRegisteredObject
{
public void Stop(Boolean immediate)
{
Profiler.SaveStatisticsToDatabase();
}
}
但我很好奇解决这个问题的正确方法是什么。比我聪明的人之前一定已经在 ASP.net 中添加了分析。