在 ASP.NET 应用程序中为初始启动计时
Posted
技术标签:
【中文标题】在 ASP.NET 应用程序中为初始启动计时【英文标题】:Timing initial startup in an ASP.NET application 【发布时间】:2009-09-12 00:28:15 【问题描述】:在 iisreset 或应用程序域回收后,我的 ASP.NET 应用程序需要很长时间才能加载第一个页面请求。
有没有办法可靠地测量应用域回收所需的时间?
【问题讨论】:
【参考方案1】:如果没有编写一个监控进程并等待 CPU 时间归零的应用程序,您很可能需要使用秒表并重新启动几次。当您进入多秒计时时,毫秒就不再重要了。所以,秒表应该就足够了。
【讨论】:
【参考方案2】:您可以使用分析器,通过使用不同的 CPU 采样模式测量瓶颈等来浏览代码。类似的工具是 dotTrace。 :) http://www.jetbrains.com/profiler/
【讨论】:
问题在于他试图在他编写的代码之外测量时间。 他想测量整个过程,所以测量一部分是不够的。 IIS 的性能以某种方式得到了证明,因此它必须与代码有关。但正如约翰所说,确实应该有一个整体的方法。【参考方案3】:我们遇到了类似的问题,我不知道我们的经验是否会对您有所帮助。幸运的是,这发生在我们第一次研究面向服务的架构时,因此我们对使用 Web 服务与其他获取数据的方法相比如何影响性能非常感兴趣。
我并不是说我们的结果会对您有所帮助,但可能是方法。
实际上,我们花了整整两个 8 小时的时间来测试不同的连接场景,我们对通过 XML 获取数据而不是二进制数据相关的额外带宽感到特别好奇。我们完全预料到仅仅通过获取 XML 数据会导致性能下降,我们认为这将是网络上的更多字节。
我不会深入研究结果,因为它本身就是一个 10 页的文档,但我们确实发现了一个有趣的延迟,当我们从一个用 .Net 语言编写的 Web 服务获取数据时,该服务正在访问数据在 iSeries 上(AS/400、System i 或现在的任何新术语)。正如您所描述的,第一次调用获取数据需要一段时间,但后续调用更快。
通过查看网络数据包,我们发现我们使用的连接类型(Microsoft 提供的 ODBC)是我们案例的罪魁祸首。
我们测量了客户端和 Web 服务之间以及 Web 服务和 iSeries(数据存储)之间的网络数据包,我们发现出现延迟是因为 Web 服务第一次连接到 iSeries ,来回发送了几个不必要的数据包。
简而言之,Windows 端会发送一个连接请求,等待几毫秒,然后再发送一个。同时,iSeries 只是响应缓慢,所以在第一次尝试连接时,从 Windows 端到 iSeries 端有四个连接调用,然后是 iSeries 的四个响应,被 Windows 端忽略(因为Windows 端的连接已放弃)。最后经过4-6次尝试,建立了连接。在那之后,连接肯定已经被池化了,因为短时间内后续的连接很快。但是,如果时间过去了(我们从未确定需要多长时间才能发生这种情况),缓慢的初始连接会重新出现。
所以,经过这么长时间的吐槽,@Aggelos Mpimpoudis 建议分析您自己的代码。我的建议是找一个有分析网络数据包经验和工具的人,分析整个过程。你也许可以通过这种方式追查罪魁祸首。
顺便说一句,在我们切换到使用 Ibm.Data.Db2.iseries 而不是 System.Data.Odbc 驱动程序连接到 iSeries 并且在我们有足够的 Web 服务写入对 iSeries 的调用频率之后,我们的问题得到了改善足以使池连接保持打开状态。
【讨论】:
以上是关于在 ASP.NET 应用程序中为初始启动计时的主要内容,如果未能解决你的问题,请参考以下文章
如何在Asp.net Core的登录过程中为“记住我”设置单个cookie超时?
一题多解,ASP.NET Core应用启动初始化的N种方案[上篇]
一题多解,ASP.NET Core应用启动初始化的N种方案[上篇]