【问题标题】:ASP.NET application on IIS7 - very slow startup after iisresetIIS7 上的 ASP.NET 应用程序 - iisreset 后启动速度很慢
【发布时间】:2009-09-17 22:15:26
【问题描述】:

我有一个在 Windows 2008 的 IIS7 下运行的 ASP.NET 3.5 网站。

当我重新启动 IIS (iisreset),然后点击一个页面,初始启动真的很慢。

我在 Process Explorer 中看到以下活动:

  • w3wp.exe 生成,但显示 0% CPU 活动约 60 秒
  • 最后,w3wp.exe 达到 50% CPU 大约 5 秒,然后页面 加载。

在此期间我也没有看到任何其他进程使用 CPU。它基本上只是挂起。

在那段时间里发生了什么?我怎样才能追踪到这段时间所花费的时间?

【问题讨论】:

    标签: asp.net performance iis startup


    【解决方案1】:

    我们遇到了类似的问题,结果是 Windows 超时检查签名证书的吊销。检查您的服务器是否正在尝试呼叫某处(例如 crl.microsoft.com)。也许您的代理设置不正确?还是挡路的防火墙?我们最终确定我们对服务器有足够的控制权并且不想“打电话回家”,所以我们只是禁用了检查。您可以使用 .NET 2.0 SP1 及更高版本执行此操作,方法是将以下内容添加到 machine.config。

    <runtime> <generatePublisherEvidence enabled="false"/> </runtime>
    

    我不确定你是否可以把它放在你的 app.config/web.config 中。

    【讨论】:

      【解决方案2】:

      IL 正在被 Just-In-Time 编译器转换为机器本机代码(程序集),您可以等待所有奇迹发生。

      编译源代码时 托管代码,编译器翻译 微软中级的源代码 语言 (MSIL)。这是一个 独立于 CPU 的指令集 可以有效地转换为 本机代码。微软中级 语言 (MSIL) 是使用的翻译 作为多个输出 编译器。它是一个输入 即时 (JIT) 编译器。这 公共语言运行时包括 JIT 用于将 MSIL 转换为的编译器 本机代码。

      在微软中间语言之前 (MSIL)可以执行它,必须 由 .NET Framework 转换 即时 (JIT) 编译器到本机 代码。这是特定于 CPU 的代码 在相同的计算机架构上运行 作为 JIT 编译器。而不是使用 时间和内存来转换所有的 可移植可执行文件 (PE) 中的 MSIL 文件到本机代码。它将 MSIL 在执行时根据需要,然后 缓存生成的本机代码,以便 它可用于任何后续 来电。

      source

      【讨论】:

      • 如果是JIT编译,难道不会在Process Explorer中看到csc.exe吗?在 60 秒等待期间,我没有看到 csc.exe 运行。
      • @frankadelic csc.exe 是 C# 编译器。 JIT 是 .NET 的一部分,为什么需要在运行 C# 的机器上安装 .NET。
      • 无论是 csc 还是 JIT,您都会看到 CPU 使用情况。
      【解决方案3】:

      这就是将 asp.Net 页面编译成中间语言 + JIT 编译 - 它只在页面第一次加载时发生。 (见http://msdn.microsoft.com/en-us/library/ms366723.aspx)

      如果它真的让您感到困扰,那么您可以通过预编译您的网站来阻止它发生。

      编辑:只需重新阅读问题 - 60 秒非常长,您会希望在此期间看到一些处理器活动。检查事件日志以获取系统和应用程序目标中的错误/消息。还可以尝试在这 60 秒内创建 w3wp 进程的故障转储 - 您可能会通过查看一些调用堆栈来识别它在做什么。

      如果每次都需要恰好 60 秒,那么它很可能正在等待某事超时 - 60 秒是一个不错的整数。确保它与域控制器等有正确的连接......

      (如果有一些 IIS 诊断工具可以做得更好,那么恐怕我不知道它们,这个问题可能更适合 ServerFault,以上是一种更适合开发人员的方法故障排除:-p)

      【讨论】:

      • 正如其他 cmets 中提到的 - 我没有看到任何 csc.exe 在此延迟期间运行。
      【解决方案4】:

      我发现从前端 Web 服务器到数据库服务器的初始连接存在网络延迟。

      这个问题是 Windows 2008 和我们特定的网络硬件所特有的。

      解决方案是在 Web 服务器上禁用以下功能:

      【讨论】:

      • 对于那些正在寻找 IIS 重启缓慢的解决方案的人,请尝试清除临时 ASP.Net 文件目录。它位于 %windir%\Microsoft.NET\Framework [both 64][version]\Temporary ASP.NET Files 您可以删除此文件夹中的任何内容,但 IIS 正在使用的文件除外(系统会提示您)在我的情况下5 Gigs 的临时文件导致我们的网站在部署后 8 分钟重新启动!
      【解决方案5】:

      超过 60 秒听起来很可疑。尝试运行 test.html 页面以查看需要多长时间。这将隔离 IIS7 的角色。

      然后暂时重命名您的 web.config、global.asax 和应用程序文件夹并尝试 test.aspx 页面(非常简单的页面)。这将隔离 ASP.NET。

      如果这两个都很快(即大约 10 秒),那么这就是您的应用程序。但是,如果其中任何一个都很慢,那么不是应用程序和服务器本身的问题。

      【讨论】:

      • 在 iisreset 后测试 HTML 页面大约需要 2 秒。如果 IIS 正在运行并且我更改了 web.config,加载测试 ASPX 页面可能需要 3 秒。
      • 听起来 IIS 和 ASP.NET 那时做得很好。一定是应用程序中的某些东西导致了这种情况。如果它只是在第一次加载时很慢,那么它就是与本机代码的对话。你有一个庞大的项目吗?在您上传到服务器之前,我会检查您的项目类型和大小,并查看是否将其拆分或预编译。
      【解决方案6】:

      这顶帽子与 JIT 编译无关。如果此程序集不存在或代码文件已更改,则普通 C# 编译器会在启动时将您的代码隐藏文件 (.aspx.cs) 编译为中间语言到程序集中。您的网站程序集位于您网站的“bin”文件夹中。

      事实上,JIT 编译是在那之后发生的,但这非常快,不会花费几分钟。 JIT 编译发生在 .net 应用程序的每次启动时,并且不会超过一个视图秒。

      如果您将已编译的网站程序集 (YourWebsite.dll) 部署到 bin 文件夹中,则可以避免编译您的网站。也可以只部署 aspx 文件并将代码隐藏在文件 (aspx.cs) 文件中。

      【讨论】:

      • 实际上,即使使用预编译的站点,.aspx、.ascx 等也会被解析为 C# 代码、编译和 JIT。因此,第一次预热 ASP.NET 应用程序时会有很多活动。
      【解决方案7】:

      我一直在与类似的问题作斗争。对我来说,事实证明我已经为 NLog 启用了内部日志记录。启动时间增加了大约 3 分钟!

      原始配置

      <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            autoReload="true"
            throwExceptions="false" throwConfigExceptions="false"
            internalLogLevel="Debug"
            internalLogFile="C:\Temp\NLog.Internal.txt">
      

      固定配置

      <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            autoReload="true"
            throwExceptions="false" throwConfigExceptions="false">
      

      对于信息,我通过使用 SysInternals 的 ProcMon.exe 发现了这一点,过滤了进程名称“w3wp.exe”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-19
        • 2014-01-15
        • 2016-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多