【发布时间】:2011-08-11 05:53:38
【问题描述】:
我有一个托管在 Windows 7 / IIS 7.5 上的 .Net Framework 4.0、ASP.NET、ASP.NET MVC 3 Web 应用程序。在这台机器上启用了 IIS 日志记录并设置为以 W3C 模式登录。
应用程序是使用 Release 配置编译的,并已部署到具有显式设置的 <compilation debug='false' 属性的 IIS。 Web.config 指定使用基于 SQL Server 的会话状态。
我在 Global.asax 中分别在 BeginRequest 和 EndRequest 事件中添加了以下语句。结果,即“sw.Elapsed.TotalMilliseconds”被存储在应用程序级别的值列表中。我通过调试页面转储这些值并获得相同的平均值。
// in BeginRequest
HttpContext.Current.Items.Add("RequestStartEnd", System.Diagnostics.Stopwatch.StartNew());
// in EndRequest
var sw = (System.Diagnostics.Stopwatch)HttpContext.Current.Items["RequestStartEnd"];
sw.Stop();
我创建了一个负载测试,它针对这个应用程序运行一个请求,并发用户负载为 20 个用户。测试在 Visual Studio 2010 Ultimate 版中运行。
运行负载测试后,我得到了秒表记录的平均耗时 681 毫秒。根据 IIS 对这些请求的平均耗时(我在运行负载测试之前清除了所有日志)是2121 毫秒。 IIS 所用的平均时间与 Visual Studio 负载测试报告中显示的值相符。
秒表所用时间仅占 IIS 日志/Visual Studio 报告的所用时间的 32%。剩下的 68% 时间去哪儿了?
更新 1: 我将会话状态设置为 InProc 并重新运行负载测试。在这种情况下,秒表报告的平均时间与 IIS 日志报告的平均所用时间之间的差异增长到 70% 以上!!!这么多时间都去哪儿了?
更新 2: @Peter - 我通过将跟踪规则设置为登录状态码 200 来尝试失败的请求跟踪。接下来,我对 20 个并发用户进行了大约 1.5 分钟的负载测试。查看最后 50 个跟踪文件,发现该报告中的“所用时间”字段的范围为 750 毫秒到 1300 毫秒。 Visual Studio 报告显示平均值。时间为2300ms。在报告中,使用紧凑视图,我看到以下转换之间的时间发生了变化 (1) AspNetStart -> AspNetAppDomainEnter (2) ManagedPipelineHandler-start ManagedPipelineHandler-end。 (2) 项可能是我的应用程序的代码。根据失败的请求日志(即 1300 毫秒)和平均所用时间之间仍然存在很大差异。 Visual Studio 2300ms 显示的耗时。如何找到会计?不过感谢这个很棒的提示!
【问题讨论】:
-
您应该考虑分析您的代码。与简单的基于秒表的性能计数器相比,它会为您提供更精细和更直接可用的数据。
-
@Merlyn - 我正在使用 Visual Studio 2010 Ultimate 分析器。将尝试查看打开“显示所有代码”的报告。但是,我怀疑问题可能出在 IIS 而不是 ASP.NET 中,因此可能不会包含在分析中。怀疑背后的原因是秒表计时是在 ASP.NET 的 request-start 和 request-end 事件中进行的。
-
您是否考虑过 ASP.NET 之外的系统级因素?例如IIS开销,网络?添加了更详细的答案。
标签: asp.net asp.net-mvc performance visual-studio-2010 iis-7.5