9

当最初的几个用户访问该网站时,性能非常缓慢。

Windows Azure 设置使用 IIS 7.0,因此预热初始化模块不是一个选项。

有没有办法“预热”网站,这样性能速度就不是问题了?

我看过这个:Controlling Application Pool Idle Timeouts in Windows Azure,但不确定当 Azure 大约每 29 小时回收一次应用程序池时这是否仍然会导致问题。

更新:

部署是包含多个网站的 1 个 Web 角色。是否可以为此进行预编译?或使用以下答案之一中建议的网络角色?

编辑:

正如@Igorek 在下面关于使用在角色启动期间自动加载的Web 角色所说的那样,这在我的设置中是可能的。有没有人有一个如何实现这一目标的例子?

4

4 回答 4

5

我看过这个:Controlling Application Pool Idle Timeouts in Windows Azure,但不确定当 Azure 大约每 29 小时回收一次应用程序池时这是否仍然会导致问题。

Azure 回收应用程序池时不会导致问题,但您也可以添加到该启动任务以防止/增加应用程序池回收时间。

试试这个:

在你的定义任务ServiceDefinition

<Startup>
    <Task commandLine="startup\disableTimeout.cmd" executionContext="elevated" />
</Startup>

然后让您的cmd文件包含以下代码(只需将其放入记事本,然后另存为.cmd文件):

%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00

%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.recycling.periodicRestart.time:00:00:00

有两件事要确保

1) 确保使用 ANSI 编码保存文件。
2) 将该脚本添加到 Visual Studio 后,请确保在属性中选择“始终复制”作为“复制到输出目录”选项。

于 2013-03-28T16:16:27.490 回答
2

您是否正在预编译应用程序?默认情况下,部署后的应用仍然需要第一次编译。根据应用程序的大小,编译可能需要几秒钟 http://msdn.microsoft.com/en-us/library/399f057w(v=vs.85).aspx

于 2013-03-18T16:19:09.320 回答
2

当第一个 HTTP 请求到达时,实际上已经完成了很多额外的工作 - 启动应用程序池,找到所有需要的程序集,将所有作为 MSIL 交付的程序集编译为机器代码,然后预编译必要的 ASP.NET 视图(除非您部署它们是预编译的,但使用 Azure 工具很难,所以我猜你不这样做)。这一切都需要一些时间,因此不幸的第一批用户必须等待。

解决方法是从内部角色入口点预热站点OnStart()- 使其预编译站点,然后向 localhost 发送 HTTP 请求。

于 2013-03-19T06:49:56.617 回答
0

mattytommo 的答案非常好,但我更喜欢以编程方式实现相同的目标,而不是依赖于 cmd 文件。您可以通过 3 个步骤完成:

第 1 步:您必须安装 NuGet 包 Microsoft.Web.Administration。该包包含从应用程序代码控制 IIS 所需的库。

第 2 步:然后您只需从 Web 角色的 RoleEntryPoint 添加对该方法的调用。如果不存在,只需添加一个继承自 RoleEntryPoint 的类。

private void ConfigureAppPools()
{
    using (ServerManager serverManager = new ServerManager())
    {
        foreach (var appPool in serverManager.ApplicationPools)
        {
            appPool.ProcessModel.IdleTimeout = TimeSpan.Zero;
            appPool.Recycling.PeriodicRestart.Time = TimeSpan.Zero;
        }
        serverManager.CommitChanges();
    }
}

此代码只是将机器上的所有应用程序池配置为永不回收或超时。

第 3 步:为此,还需要将这一行添加到 ServiceDefinition.csdef:

  <WebRole name="YourWebRoleName" vmsize="ExtraSmall">
    ...
    <Runtime executionContext="elevated" />
    ...
  </WebRole>

这可确保您的 Web RoleEntryPoint 的 OnStart() 方法以提升的权限执行。您的代码的其他部分不会受到影响,因此从安全角度来看这不是问题。

就这些。现在解决了加载慢的问题:)

于 2014-05-21T18:00:55.247 回答