Azure App Service自动缩放无法在

时间:2018-04-10 17:59:21

标签: azure azure-web-sites autoscaling azure-web-app-service azure-app-service-plans

我的应用服务在向外扩展后无法扩展。这似乎是我几个月来一直试图排除故障的模式。

我已经尝试了以下但没有一个有效:

我的比例条件基于CPU和内存。但是,我从未见过CPU超过12%,所以我假设它实际上是根据内存进行扩展。

  1. 在5分钟内平均10分钟将缩小条件设置为内​​存超过90%。冷却时间和规模在5分钟内平均低于70%的记忆。这似乎没有意义,因为如果我的内存利用率已达到90%,我确实有潜在的内存泄漏,而且应该已经扩展了。

  2. 在60分钟的平均时间内将缩小条件设置为内​​存超过80%,持续10分钟。在5分钟的平均时间内记忆在60%以下的情况下的冷却时间和比例。这更有意义,因为我已经看到内存使用量在几个小时内突然下降。

  3. enter image description here

    预期行为:应用服务自动扩展将在5分钟后减少实例计数,其中内存使用率降至60%以下。

    问题:

    如果我的基线CPU大致平均为6%且内存为53%,那么度量标准可以平滑扩展的理想阈值是多少?意思是,最大的最小值可以缩放,最大的最大值可以向外扩展,而不必担心像拍打这样的反模式?较大的20%差异阈值对我来说更有意义。

    替代解决方案:

    鉴于所涉及的故障排除涉及的内容与简单的"按钮缩放",使得它几乎不值得配置模糊的头痛(你可以&#t; t甚至在没有自定义PowerShell脚本的情况下使用连接计数等IIS指标!)。我考虑禁用自动扩展,因为它具有不可预测性,只需保持2个实例运行以实现自动负载平衡和手动扩展。

    自动缩放配置:

    {
        "location": "East US 2",
        "tags": {
            "$type": "Microsoft.WindowsAzure.Management.Common.Storage.CasePreservedDictionary, Microsoft.WindowsAzure.Management.Common.Storage"
        },
        "properties": {
            "name": "CPU and Memory Autoscale",
            "enabled": true,
            "targetResourceUri": "/redacted",
            "profiles": [
                {
                    "name": "Auto created scale condition",
                    "capacity": {
                        "minimum": "1",
                        "maximum": "10",
                        "default": "1"
                    },
                    "rules": [
                        {
                            "scaleAction": {
                                "direction": "Increase",
                                "type": "ChangeCount",
                                "value": "1",
                                "cooldown": "PT10M"
                            },
                            "metricTrigger": {
                                "metricName": "MemoryPercentage",
                                "metricNamespace": "",
                                "metricResourceUri": "/redacted",
                                "operator": "GreaterThanOrEqual",
                                "statistic": "Average",
                                "threshold": 80,
                                "timeAggregation": "Average",
                                "timeGrain": "PT1M",
                                "timeWindow": "PT1H"
                            }
                        },
                        {
                            "scaleAction": {
                                "direction": "Decrease",
                                "type": "ChangeCount",
                                "value": "1",
                                "cooldown": "PT5M"
                            },
                            "metricTrigger": {
                                "metricName": "MemoryPercentage",
                                "metricNamespace": "",
                                "metricResourceUri": "/redacted",
                                "operator": "LessThanOrEqual",
                                "statistic": "Average",
                                "threshold": 60,
                                "timeAggregation": "Average",
                                "timeGrain": "PT1M",
                                "timeWindow": "PT10M"
                            }
                        },
                        {
                            "scaleAction": {
                                "direction": "Increase",
                                "type": "ChangeCount",
                                "value": "1",
                                "cooldown": "PT5M"
                            },
                            "metricTrigger": {
                                "metricName": "CpuPercentage",
                                "metricNamespace": "",
                                "metricResourceUri": "/redacted",
                                "operator": "GreaterThanOrEqual",
                                "statistic": "Average",
                                "threshold": 60,
                                "timeAggregation": "Average",
                                "timeGrain": "PT1M",
                                "timeWindow": "PT1H"
                            }
                        },
                        {
                            "scaleAction": {
                                "direction": "Decrease",
                                "type": "ChangeCount",
                                "value": "1",
                                "cooldown": "PT5M"
                            },
                            "metricTrigger": {
                                "metricName": "CpuPercentage",
                                "metricNamespace": "",
                                "metricResourceUri": "/redacted",
                                "operator": "LessThanOrEqual",
                                "statistic": "Average",
                                "threshold": 40,
                                "timeAggregation": "Average",
                                "timeGrain": "PT1M",
                                "timeWindow": "PT10M"
                            }
                        }
                    ]
                }
            ],
            "notifications": [
                {
                    "operation": "Scale",
                    "email": {
                        "sendToSubscriptionAdministrator": false,
                        "sendToSubscriptionCoAdministrators": false,
                        "customEmails": [
                            "redacted"
                        ]
                    },
                    "webhooks": []
                }
            ],
            "targetResourceLocation": "East US 2"
        },
        "id": "/redacted",
        "name": "CPU and Memory Autoscale",
        "type": "Microsoft.Insights/autoscaleSettings"
    }
    

3 个答案:

答案 0 :(得分:3)

对于 CpuPercentage 指标,当它超过60时会有SCALE UP操作,当它低于40时会有缩小操作,并且两者之间的差异非常小。这可能会导致描述为Flapping的行为,这将导致AutoScale的操作规模无法启动。类似的问题是您已配置的MemoryPercent规则。

为了避免拍打,你应该在你的放大和尺度之间至少有40的差异。关于Flapping的更多细节在https://docs.microsoft.com/en-us/azure/monitoring-and-diagnostics/insights-autoscale-best-practices#choose-the-thresholds-carefully-for-all-metric-types(搜索Flapping一词)

答案 1 :(得分:1)

我有完全相同的问题,而且我已经开始相信自动缩放回到一个实例,就像我们现在想要的那样。

我目前的解决方法是缩放到1个实例,第二个配置文件在23:55到00:00之间每天重复。

重申问题。我有以下场景。它与你的基本相同。

  • App Service的内存基准为50%
  • 当avg(记忆)>时展开1个实例。 80%
  • 当avg(记忆)< 60%

当平均内存百分比超过80%时,从1个实例扩展到2个实例将正常工作。但扩展到1个实例永远不会起作用,因为内存基线太高了。

在阅读Best Practices之后,我的理解是,在进行扩展时,它会估算得到的内存百分比并检查是否没有触发扩展规则。

因此,如果两个实例的平均内存百分比降至50%,则会触发规则中的比例,并且它将估计生成的内存使用量为2 * 50% / 1 = 100%,这当然会触发扩展规则,因此它将会不适合。

然而,当从3个实例扩展到2个实例时,它应该有效:3 * 50% / 2 = 75%小于扩展规则的80%。

答案 2 :(得分:0)

我在这里有同样的问题。我的应用程序仅需要一个实例,并且具有自动缩放配置,例如:

  

横向扩展
  当br-empresa(平均)CpuPercentage> 85时将实例计数增加1
  或Br-Empresa(平均)MemoryPercentage> 85将实例计数增加1

     

放大
  当br-empresa(平均)CpuPercentage <= 75减少实例计数减1
  Br-Empresa(平均)MemoryPercentage <= 75将实例计数减少1

内存基准为60%。

横向扩展逻辑很不错。但是,即使内存下降到60%,该应用也永远不会扩展。 (60%* 2)/ 1 = 120%

对于内存或CPU指标,实际的震荡估算没有任何意义。