【问题标题】:ASP.Net application runs slow at first timeASP.Net 应用程序第一次运行缓慢
【发布时间】:2011-01-14 08:16:37
【问题描述】:

我有一个使用 C# 用 ASP.Net 3.0 编写的 Web 应用程序,生产机器是带有 IIS 6.0 和 sql server 2005 的 windows server 2003。

应用结构

下面显示了我的 ASP.net Web 应用程序的结构:

IIS 中的根应用程序(//localhost/es)包括常用页面,例如:母版页、主题、用户控件、图像文件夹。 根应用程序下的子项目数(//localhost/es/sub-project)。 删除子项目中的 web.config 子项目的汇编文件在根应用程序的bin文件夹下(子项目属性>>编译>>构建输出路径:..\bin\ 我的应用程序是一个 3 层 Web 应用程序(偏差层、数据层和表示层。此外,每个 aspx 页面都有其代码在 cs 文件后面)

IIS 设置

应用程序池 “1740 in minutes”后回收工作进程 空闲“20 分钟”后空闲超时工作进程 每“30 秒”Ping 工作进程
工作处理器“90 秒”的启动时间限制 工作处理器“90 秒”的关闭时间限制

应用程序配置
在内存“500”中缓存有限的 ASP 文件

在磁盘“2000”上缓存有限的 ASP 文件

部署应用程序:

我将 Web 应用程序及其所有文件发布到生产服务器。

问题:

该应用程序在第一次运行时非常慢,加载需要 10 秒以上,但是在下次请求页面时它会更快。我相信第一次请求页面时,它会编译并且通常比其他请求花费更多时间, 因为页面在缓存内存中。 这里的问题是为什么第一次编译页面需要时间?

解决问题的尝试:

我尝试执行以下操作:

  • 将所需文件的副本部署到生产服务器。
  • 更改了 IIS 设置,更改了工作进程的空闲超时关闭
  • 关闭跟踪
  • 关闭会话状态
  • 禁用页面的视图状态
  • 在 web.config 中设置 debug=false
  • 在根应用下创建一个hello world子项目,耗时5秒。
  • 创建单独的 hello word web 应用程序,如上所述需要很长时间才能加载。
  • 删除 page_load 事件处理程序中的代码,但不影响性能。
  • 只发布根应用需要的文件(后面代码中没有写代码),子项目源代码中的所有文件(代码在后面的代码中),

但是,应用程序仍然启动缓慢,但随后变得更快。

请帮助诊断和解决这个问题。

【问题讨论】:

标签: iis-6 publish web-applications performance


【解决方案1】:

对于在 IIS 7.0 和更低版本上运行的 asp.net 应用程序,编写预热程序或脚本是防止应用程序池空闲超时的最佳方法。 可以从同一应用程序或外部网站或程序设置此预热触发器。 你可以在这个article中找到不同的方法来实现相同的目标

【讨论】:

    【解决方案2】:

    由于 .NET Framework 平台中的 CLR 组件,任何 .NET 应用程序的首次加载总会有轻微延迟。因为驻留在 CLR(ASP.NET 运行时环境)中的 JIT(即时)将中间语言 (IL) 转换为本机机器代码,所以 .net 应用程序的第一次执行总是需要更长的时间。

    可以在以下位置观看有关此特定问题的详细视频:

    https://www.youtube.com/watch?v=ruf4U9_Rbss&index=1&list=PL8598C97BA1D871C1

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:
      VBscript + Dos Batch file... run every 1 hr 
      
      
      Dim strNewTime , strSiteName
      strNewTime = Now() 
      strNewTime = Replace(strNewTime, "/","")
      strNewTime = Replace(strNewTime, " ","")
      strNewTime = Replace(strNewTime, ":","") 
      
      strSiteName = "https://www.yoursite.com/userlogin.aspx?dummytime=" + strNewTime
      
      Dim oXMLHTTP
      Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.6.0")       
      
      oXMLHTTP.Open "GET", strSiteName, False
      oXMLHTTP.Send
      
      If oXMLHTTP.Status = 200 Then
      '  working
      ELSE
          CALL SendEmail("!!! www - web site is NOT working... " + strSiteName + " *** ") 
      End If
      
      Set oXMLHTTP = Nothing 
      

      【讨论】:

      • 请添加 cmets 以描述您的答案如何解决问题。
      【解决方案4】:

      您还可以使用适用于 .net framework 4 Web 应用程序的自动启动应用程序功能。欲了解更多信息,请访问here

      【讨论】:

        【解决方案5】:

        我在 ruby​​ on rails 应用程序中也有同样的乘客,但我找到了一个很好的工具 (http://www.wekkars.com),它可以防止网络服务器进入睡眠状态。

        【讨论】:

          【解决方案6】:

          【讨论】:

            【解决方案7】:

            除了 sky 所说的之外,您还可以运行“预热脚本”作为部署过程的最后一步。虽然这不会加快第一次编译所需的时间,但使用这样的脚本至少可以防止用户看到启动缓慢。 在此处查看此类脚本的示例: http://programmerramblings.blogspot.com/2008/09/aspnet-site-warmup.html

            对应用程序的第一个请求很慢的另一个原因可能是 IIS 必须在第一个请求期间启动 asp.net 工作进程。但是,这不应影响对其他页面的首次请求。

            【讨论】:

            • 自动启动Web应用程序很好的解决了第一次页面加载但应用程序不会关闭的性能的最大缺点。我的应用程序包含很多页面,如果我使用“自动启动”或“预热”会影响内存吗?剂量预热会对服务器性能产生负面影响吗?使用“预热脚本”有什么缺点吗?
            【解决方案8】:

            发布预编译的网站,而不是复制它。

            您遇到的行为是正常的。

            【讨论】:

              【解决方案9】:

              没有办法解决这个问题。在网站编译时,首次加载总是会稍有延迟。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-10-31
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多