【问题标题】:Azure Web Role "warm up" strategies [closed]Azure Web 角色“热身”策略 [关闭]
【发布时间】: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() 中设置preloadEnabledstartMode

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


【解决方案1】:

我们使用了其中几个答案的组合,它对我们来说非常有效,它们的更改和测试速度非常快,但是,它似乎涵盖了所有基础。

public override bool OnStart()
{
    ServicePointManager.DefaultConnectionLimit = 12;
    if(!RoleEnvironment.IsEmulated)
    {
        using(ServerManager serverManager = new ServerManager())
        {
            foreach (var app in serverManager.Sites.SelectMany(x => x.Applications))
            {
                app["preloadEnabled"] = true;
            }
            foreach (var appPool in serverManager.ApplicationPools)
            {
                    appPool.AutoStart = true;
                    appPool["startMode"] = "AlwaysRunning";
                    appPool.ProcessModel.IdleTimeout = TimeSpan.Zero;
                    appPool.Recycling.PeriodicRestart.Time = TimeSpan.Zero;
            }
            serverManager.CommitChanges();
        }
    }
    return base.OnStart();
}

【讨论】:

  • 那太好了。我从未遇到过AutoStart 功能。似乎启用后,“IIS 会忽略应用程序池和使用应用程序池的应用程序上的空闲超时设置。”
  • 如果角色实例启动时出现配置文件访问权限错误,可能需要将<Runtime executionContext="elevated" /> 添加到ServiceDefinition.csdef 中的<WebRole> 元素。
  • 需要在C:\Windows\System32\inetsrv下引用Microsoft.Web.Administration.dll
  • 它对我不起作用,因为我的 IIS 没有安装应用程序初始化模块。有很好的教程如何做到这一点fabriccontroller.net/…
  • 我正在使用该代码,它在本地工作正常,但是当我要在 azure 上上传包时,它会给出错误“您的角色实例在此期间已回收多次”。请推荐?
【解决方案2】:

您是否考虑过使用 Azure 端点监控来监控并触发您的角色每 5 分钟响应一次?它内置在 Azure 中,无需任何代码。

http://azure.microsoft.com/en-us/documentation/articles/web-sites-monitor/

【讨论】:

  • 感谢您的回答,但这似乎仅限于网站?
  • 您应该可以从您的服务(角色)仪表板中找到监控。
猜你喜欢
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
相关资源
最近更新 更多