【发布时间】:2014-07-10 12:08:50
【问题描述】:
我发现在一段时间不活动后向我们的网络角色发出请求会导致请求非常缓慢(最多 30 秒)。在该初始请求之后,该角色将按应有的方式执行。
经过大量谷歌搜索,我发现了四种不同的策略(如下所列):
(a) 在RoleEntryPoint.OnStart() 中禁用 IIS 空闲超时
public override bool OnStart()
{
using (var server = new ServerManager())
{
server.ApplicationPoolDefaults.ProcessModel.IdleTimeout = TimeSpan.Zero;
server.CommitChanges();
}
return base.OnStart();
}
这也要求角色在更高的级别上运行。
(b) 在RoleEntryPoint.Run() 中执行常规请求
public override void Run()
{
var localuri = new Uri(string.Format("https://{0}/Help", RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["HttpsIn"].IPEndpoint));
while (true)
{
try
{
var request = (HttpWebRequest)WebRequest.Create(localuri);
request.Method = "GET";
var response = request.GetResponse();
}
catch { }
System.Threading.Thread.Sleep(3000);
}
}
(c) 在RoleEntryPoint.OnStart() 中设置preloadEnabled 和startMode
public override void OnStart()
{
using (var serverManager = new ServerManager())
{
foreach (var application in serverManager.Sites.SelectMany(x => x.Applications))
{
application["preloadEnabled"] = true;
}
foreach (var applicationPool in serverManager.ApplicationPools)
{
applicationPool["startMode"] = "AlwaysRunning";
}
serverManager.CommitChanges();
}
return base.OnStart();
}
(d) 最后,使用 Azure 的“Always On”(编辑:不幸的是,这仅适用于 Azure 网站!)
我应该执行以下哪些策略?
【问题讨论】:
-
很抱歉,但我会以“主要基于意见”投票结束这个问题。您自己发现了不同的解决方案。使用哪一个是基于您的应用程序细节的唯一决定。您必须深入了解所有不同的方法及其对您的应用和应用程序的影响,才能决定使用哪种方法。
-
我同意,但该列表可以很好地回答以下问题:如何避免角色在不活动后进行热身?
-
@Dave New 使用选项 b 的缺点是什么?选项 b 是否也有助于确保应用程序空闲?
标签: azure azure-web-roles iis-8 azure-configuration