Windows Azure在前几个请求上变慢

时间:2013-03-18 15:23:26

标签: azure

当前几个用户访问网站时,性能非常慢。

Windows Azure安装程序正在使用IIS 7.0,因此不能选择预热初始化模块。

有没有办法“热身”网站,以便这个性能速度不是问题?

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

更新

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

修改

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

4 个答案:

答案 0 :(得分:5)

  

我已经看过这个:在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中时,请确保在属性中选择“始终复制”作为“复制到输出目录”选项。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

mattytommo的答案完全正常,但我更喜欢以编程方式实现相同的目标,而不是依赖于cmd文件。您可以分三步完成:

步骤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()方法以提升的权限执行。代码的其他部分不会受到影响,因此从安全角度来看这不是问题。

就是这样。现在解决了慢负荷问题:)