首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Azure Web角色“预热”策略

Azure Web角色“预热”策略
EN

Stack Overflow用户
提问于 2014-07-10 20:08:50
回答 2查看 5.9K关注 0票数 20

我发现,在不活动一段时间后向我们的web角色发出请求将导致非常慢的请求(长达30秒)。在最初的请求之后,角色将按其应有的方式执行。

经过大量的谷歌搜索,我发现了四种不同的策略(如下所示):

(a)在RoleEntryPoint.OnStart()中禁用IIS空闲超时

代码语言:javascript
复制
public override bool OnStart()
{
    using (var server = new ServerManager())
    {
        server.ApplicationPoolDefaults.ProcessModel.IdleTimeout = TimeSpan.Zero;
        server.CommitChanges();
    }

    return base.OnStart();
}

这还要求角色在更高的级别上运行。

(b)在RoleEntryPoint.Run()中执行常规请求

代码语言:javascript
复制
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

代码语言:javascript
复制
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网站!)

我应该执行这些策略中的哪一个?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-11 03:23:04

我们使用了这些答案的组合,它对我们来说工作得很好,他们非常快地改变和测试,然而,它似乎涵盖了所有的基础。

代码语言:javascript
复制
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();
}
票数 18
EN

Stack Overflow用户

发布于 2014-07-11 06:40:14

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24676194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档