我的假设是,如果我在 Azure 中启用 IIS8 应用程序预热,那么我的所有网站都将立即加载,不是这种情况。
因此,基本上,我已经打开preloadEnabled
并将 设置startMode
为AlwaysRunning
,使用:
public class WebRole : RoleEntryPoint
{
public override void Run()
{
using (var serverManager = new ServerManager())
{
foreach (var application in serverManager.Sites.SelectMany(c => c.Applications))
{
application["preloadEnabled"] = true;
}
foreach (var appPool in serverManager.ApplicationPools)
{
appPool["startMode"] = "AlwaysRunning";
}
serverManager.CommitChanges();
}
}
}
我还使用以下启动任务禁用了 IIS 应用程序池的回收和定期的 IIS 重启:
%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
在我的每个站点中,我都在 web.config 中输入了以下内容:
<system.webServer>
<applicationInitialization skipManagedModules="true">
<add initializationPage="/" />
</applicationInitialization>
</system.webServer>
但尽管如此,我的所有网站首次访问仍需 30 秒。如果我在访问任何网站之前远程访问机器,我可以看到 IIS 中应用了所有设置。我还可以看到这些网站闲置了大约 60-80MB 的内存(暗示它们已经预加载)。
我的问题是,这是否是预加载的最佳效果?这肯定意味着更快?我原本以为延迟会很小,第一次加载可能只有 2 到 3 秒?
答案1
我认为您实际上已经安装了默认 IIS8 安装中未包含的应用程序初始化模块?
查看这篇很棒的文章关于如何启动和运行它,希望这可以解决你的问题。
答案2
虽然没有直接回答您的问题,但您可以利用 Azure 中的新监控功能来保持您的网站正常运行。
如果您查看云服务下的管理门户,会发现一个标记为“Web 端点状态”的部分。如果您设置该值,则 Azure 将每隔几分钟左右轮询一次该页面。