我的应用服务在向外扩展后无法扩展。这似乎是我几个月来一直试图排除故障的模式。
我已经尝试了以下但没有一个有效:
我的比例条件基于CPU和内存。但是,我从未见过CPU超过12%,所以我假设它实际上是根据内存进行扩展。
在5分钟内平均10分钟将缩小条件设置为内存超过90%。冷却时间和规模在5分钟内平均低于70%的记忆。这似乎没有意义,因为如果我的内存利用率已达到90%,我确实有潜在的内存泄漏,而且应该已经扩展了。
在60分钟的平均时间内将缩小条件设置为内存超过80%,持续10分钟。在5分钟的平均时间内记忆在60%以下的情况下的冷却时间和比例。这更有意义,因为我已经看到内存使用量在几个小时内突然下降。
预期行为:应用服务自动扩展将在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"
}
答案 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之间每天重复。
重申问题。我有以下场景。它与你的基本相同。
当平均内存百分比超过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指标,实际的震荡估算没有任何意义。