13

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

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

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

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

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

这段时间发生了什么?我怎样才能追踪到所有这些时间都在花费什么?

4

7 回答 7

6

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

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

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

于 2009-12-30T23:20:02.373 回答
4

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

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

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

来源

于 2009-09-17T22:27:46.993 回答
4

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

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

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

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

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

于 2009-09-17T22:28:09.553 回答
4

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

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

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

于 2010-11-05T16:48:34.500 回答
2

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

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

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

于 2009-09-17T23:48:05.823 回答
1

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

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

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

于 2009-09-17T23:02:47.270 回答
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”

于 2020-06-11T12:55:35.363 回答