当前几个用户访问网站时,性能非常慢。
Windows Azure安装程序正在使用IIS 7.0,因此不能选择预热初始化模块。
有没有办法“热身”网站,以便这个性能速度不是问题?
我看过这个:Controlling Application Pool Idle Timeouts in Windows Azure,但不确定当Azure每隔29小时回收一次应用程序池时,这是否仍然会导致问题。
更新
部署是1个包含多个网站的Web角色。是否可以为此进行预编译?或者使用下面其中一个答案中建议的网络角色?
修改
正如@Igorek在下面所说的使用Web角色在角色启动期间自动加载自己,这在我的设置中是可能的。有没有人有如何实现这个目标的例子?
答案 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()方法以提升的权限执行。代码的其他部分不会受到影响,因此从安全角度来看这不是问题。
就是这样。现在解决了慢负荷问题:)