IIS7上的ASP.NET应用程序 - 在iisreset之后启动非常慢

时间:2009-09-17 22:15:26

标签: asp.net performance iis startup

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

当我重新启动IIS(iisreset),然后点击页面时,初始启动非常慢。

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

  • w3wp.exe产生,但显示0%CPU 活动约60秒
  • 最后,w3wp.exe进入50%CPU 约5秒然后页面 负荷。

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

在那段时间里发生了什么?我怎样才能追踪到目前为止所做的事情?

7 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:4)

IL正在被Just-In-Time编译器转换为机器本机代码(Assembly),你可以在所有魔法发生时等待。

  

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

     

Microsoft中级语言之前   (MSIL)可以执行它,必须是   由.NET Framework转换   实时(JIT)编译器到本机   码。这是特定于CPU的代码   在同一计算机体系结构上运行   作为JIT编译器。而不是使用   转换所有的时间和记忆   可移植可执行文件(PE)中的MSIL   文件到本机代码。它转换了   然后执行时根据需要使用MSIL   缓存生成的本机代码   它可以随后访问   调用

source

答案 2 :(得分:4)

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

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

编辑:重新阅读问题 - 60秒很长,您可能会在此期间看到一些处理器活动。检查EventLog中的系统和应用程序目标中的错误/消息。还要尝试在60秒内创建w3wp进程的崩溃转储 - 你可能会通过查看一些调用堆栈来识别它的作用。

如果每次都需要完全 60秒,那么它可能会等待超时--60秒是一个不错的回合数。确保它与域控制器等有正确的连接......

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

答案 3 :(得分:4)

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

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

解决方法是在网络服务器上禁用以下内容:

答案 4 :(得分:2)

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

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

如果两者都很快(即大约10秒),那么它就是你的应用程序。但是,如果要么慢,那么不是应用程序和服务器本身的东西。

答案 5 :(得分:1)

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

事实上,JIT编译之后会发生,但这非常快,不需要几分钟。 JIT编译在.net应用程序的每次启动时都会发生,并且不会超过查看秒数。

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

答案 6 :(得分:0)

我一直在与类似的问题作斗争。对我来说,事实证明是我为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”进行过滤而发现的