8

我目前正在处理的 ASP.NET Web 应用程序项目随着时间的推移而变得越来越慢,以重新加载(在 IIS 或 .NET 开发服务器中)。目前需要:

  • 通过 F5 调试加载 1:28 分钟
  • 41 秒在浏览器中刷新,构建后(不是重建)

这台机器相当快 - 一个 Core 2 Quad 2.40ghz,8 gig o' RAM,在 HyperV 下运行开发机器,分配给 dev VM 的 2 gig o' RAM。

有没有办法跟踪/报告初始负载的整个周期?如果我能看到启动基本 IIS 工作进程、加载 DLL、运行实际的 .NET 代码需要多长时间,那就太好了。

我知道我可以在代码上使用分析器——它没有出现任何超慢的数据库连接建立时间,但我想在处理实际页面之前对这些东西的性能有一些了解。我可以看到 CPU 监视器在此过程中达到了 100%,RAM 使用率略有上升 - 但我正在寻找更好的洞察力,希望能稍微调整一下。

虽然我在项目开始时(4 个月前)没有进行任何测量,但我完全确定重新加载相对轻而易举。

非常感谢任何帮助,程序员只能在构建时喝这么多咖啡。

更新:

JetBrain 的dotTrace非常好(在本例中),谢谢。它具有启动 Web 项目的完美界面,并很快强调大部分时间都在Application_Start()中(在Global.asax中)。

其他选项不会选择这个,因为:

  • Trace选项仅从 PreInit 开始,缺少 Application_Start() 调用。

  • 秒表调用将要求我知道在哪里看,或者恢复到 printf 式调试的美好时光......

  • nprof想要定位一个 .exe,它在尝试附加到新的 w3wp.exe 实例时会错过目标区域......

4

6 回答 6

6

为什么不使用 ASP.NET 跟踪功能。使用 trace.axd 分析请求。

这可能有用:

http://msdn.microsoft.com/en-us/library/ms972204.aspx

http://msdn.microsoft.com/en-us/library/wwh16c6c.aspx

于 2009-11-07T09:11:09.420 回答
5

JetBrains dotTrace这样的分析器应该告诉您瓶颈在哪里……如果您没有看到任何异常(即方法的处理时间长),那么它不是您的应用程序。应该是环境。可能是您正在使用 Active Directory 并且对 Active Directory 的调用挂起... 是否有 Web 服务调用?您在使用 Team Systems 吗?是否有后期构建流程?

对我来说,这听起来像是有些事情正在超时。这就是为什么你等了这么久。

于 2009-11-07T06:01:30.963 回答
4

过去,我使用过 redgate 的 ANTS 性能分析器。这真的很好,对我来说效果很好。我知道不是每个人都想在这些类型的工具上花钱,但这个可能是值得的。看看吧,他们有一个免费的 14 天试用版,你可以在这个网站上使用它并找出问题所在。

http://www.red-gate.com/products/ants_performance_profiler/index.htm

祝你好运!

于 2009-11-07T17:58:24.847 回答
3

您是否尝试过打开页面跟踪以查看它是否告诉您任何信息的简单技术?您的 aspx 页面中的第一行将如下所示:

<%@ Page Language="C#" Trace="true" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SilverlightApplication1.Web._Default"  %>

当页面在浏览器中呈现时,一大堆信息也将附加到它的底部。

于 2009-11-07T06:59:53.170 回答
2

分析和跟踪都是很好的建议。

如果您要使用 DateTime.Now.ToString() 建议,我建议您改用 System.Diagnostics.StopWatch 类。它使用起来非常简单,而且我发现它更准确。

using System.Diagnostics;
//...
Stopwatch watch = new Stopwatch();
watch.Start();
// Do your loading work here
watch.Stop();
// You can use watch.ElapsedMilliseconds to get the elapsed time
于 2009-11-07T07:26:46.743 回答
-1

将时间写入日志文件并检查。

namespace TracePageLoad
{
    public partial class _Default : System.Web.UI.Page
    {
        string sLogDir = "Your path to write the log";
        protected void Page_Load(object sender, EventArgs e)
        {
            TextWriter objTW = new StreamWriter(sLogDir, true);
            objTW.WriteLine(DateTime.Now.ToString());
            //Your code 
            objTW.WriteLine(DateTime.Now.ToString());
            objTW.Close();
        }
    }
}
于 2009-11-07T06:03:55.030 回答