长期如何对ASP.net应用程序进行性能分析?

3

如何记录网站执行统计信息是一种被广泛接受的方法?

X需要多长时间

例如,我想知道执行某些操作需要多长时间,例如验证用户凭据与Active Directory服务器:

authenticated = CheckCredentials(Login1.UserName, Login1.Password);

很多人会建议使用各种追踪工具来输出、记录有趣的性能指标。
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相比,更关心验证成千上万个用户凭据所需的时间:

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网站/应用程序。随机地,在一年的任何时间,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);
    }
}

现在我已经给我的应用程序引入了巨大的延迟。这个分析代码被调用了成千上万次。当数学运算只在内存中进行时,它只需要几微秒。现在需要几十毫秒。(1000倍的因素; 明显的延迟)。那是不行的。

仅在应用程序关闭时保存

我考虑通过实现IRegisteredObject将我的静态帮助类注册到ASP.net托管环境:

public class ShutdownNotification : IRegisteredObject
{
    public void Stop(Boolean immediate)
    {
        Profiler.SaveStatisticsToDatabase();
    } 
}

但我很好奇解决这个问题的正确方法是什么。比我聪明的人一定在以前已经为ASP.net添加了性能分析。


1
非常有趣。我喜欢你在这里尝试做的事情。也许你可以将分析诊断工具拆分成一个“独立应用程序”,然后使用消息框架(例如RabbitMQ)来确保您的配置文件日志不会丢失。这样也可以为多个应用程序提供服务。 :) - ctrlplusb
1个回答

0
我们使用微软的应用程序性能监视器来进行此操作。它可以捕获页面加载时间、数据库调用时间、API调用时间等信息。当页面加载速度异常缓慢时,它还会提醒我们,并提供各种调用的时间以及受其影响的加载时间的堆栈跟踪。虽然有些基础,但它确实起到了作用,并使我们能够验证没有任何未按预期执行的变化。
提前警告:用户界面仅适用于IE浏览器。

http://technet.microsoft.com/en-us/library/hh457578.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接