Flapping no Dimensionamento Automático
Este artigo descreve o dimensionamento automático e como evitá-lo.
Flapping refere-se a uma condição de ciclo que causa uma série de eventos de dimensionamento opostos. A oscilação ocorre quando um evento de dimensionamento aciona o evento de dimensionamento oposto.
O dimensionamento automático avalia uma ação de dimensionamento pendente para ver se causava oscilação. Nos casos em que a oscilação pode ocorrer, o dimensionamento automático pode ignorar a ação de dimensionamento e reavaliar na próxima execução ou o dimensionamento automático pode ser dimensionado em menos do que o número especificado de instâncias de recursos. O processo de avaliação de dimensionamento automático ocorre sempre que o motor de dimensionamento automático é executado, que é a cada 30 a 60 segundos, dependendo do tipo de recurso.
Para garantir recursos adequados, a verificação de potenciais oscilações não ocorre para eventos de aumento horizontal. O dimensionamento automático só irá diferir um evento de escalamento horizontal para evitar oscilações.
Por exemplo, vamos assumir as seguintes regras:
- Aumentar horizontalmente em 1 instância quando a utilização média da CPU é superior a 50%.
- Dimensionar na diminuição da contagem de instâncias por 1 instância quando a utilização média da CPU for inferior a 30%.
Na tabela abaixo em T0, quando a utilização está nos 56%, é acionada uma ação de escalamento horizontal e resulta numa utilização de CPU de 56% em 2 instâncias. Isto dá uma média de 28% para o conjunto de dimensionamento. Uma vez que 28% é menor do que o limiar de dimensionamento, o dimensionamento automático deve voltar a ser dimensionado. O dimensionamento no devolveria o conjunto de dimensionamento para 56% de utilização da CPU, o que aciona uma ação de escalamento horizontal.
Hora | Contagem de instâncias | % da CPU | CPU% por instância | Evento de dimensionamento | Contagem de instâncias resultante |
---|---|---|---|---|---|
T0 | 1 | 56% | 56% | Aumentar horizontalmente | 2 |
T1 | 2 | 56% | 28% | Reduzir horizontalmente | 1 |
T2 | 1 | 56% | 56% | Aumentar horizontalmente | 2 |
T3 | 2 | 56% | 28% | Reduzir horizontalmente | 1 |
Se não for controlado, haverá uma série contínua de eventos de dimensionamento. No entanto, nesta situação, o motor de dimensionamento automático irá adiar o evento de dimensionamento em T1 e reavaliar durante a próxima execução de dimensionamento automático. O dimensionamento só ocorrerá quando a utilização média da CPU for inferior a 30%.
As oscilações são frequentemente causadas por:
- Margens pequenas ou sem margens entre limiares
- Dimensionar por mais de uma instância
- Aumentar e reduzir verticalmente com métricas diferentes
Margens pequenas ou sem margens entre limiares
Para evitar a oscilação, mantenha as margens adequadas entre os limiares de dimensionamento.
Por exemplo, as seguintes regras em que não existe margem entre limiares, causam oscilação.
- Aumentar horizontalmente quando a contagem de threads >=600
- Dimensionar quando contagem de threads < 600
A tabela abaixo mostra um potencial resultado destas regras de dimensionamento automático:
Hora | Contagem de instâncias | Contagem de threads | Contagem de threads por instância | Evento de dimensionamento | Contagem de instâncias resultante |
---|---|---|---|---|---|
T0 | 2 | 1250 | 625 | Aumentar horizontalmente | 3 |
T1 | 3 | 1250 | 417 | Reduzir horizontalmente | 2 |
- No momento T0, existem duas instâncias que lidam com 1250 threads ou 625 pisos por instância. O dimensionamento automático aumenta horizontalmente para três instâncias.
- Após o aumento horizontal, em T1, temos os mesmos 1250 threads, mas com três instâncias, apenas 417 threads por instância. É acionado um evento de escalamento horizontal.
- Antes do dimensionamento, o dimensionamento automático avalia o que aconteceria se o evento de dimensionamento ocorresse. Neste exemplo, 1250 / 2 = 625, ou seja, 625 threads por instância. O dimensionamento automático teria de aumentar horizontalmente imediatamente depois de ter aumentado horizontalmente. Se voltasse a aumentar horizontalmente, o processo repetir-se-ia, levando a um ciclo de oscilação.
- Para evitar esta situação, o dimensionamento automático não é dimensionado. O dimensionamento automático ignora o evento de dimensionamento atual e reavalia a regra no próximo ciclo de execução.
Neste caso, parece que o dimensionamento automático não está a funcionar, uma vez que não ocorre nenhum evento de dimensionamento. Verifique o separador Histórico de execuções na página de definições de dimensionamento automático para ver se existe alguma oscilação.
Definir uma margem adequada entre limiares evita o cenário acima. Por exemplo,
- Aumentar horizontalmente quando a contagem de threads >=600
- Dimensionar quando a contagem de threads < 400
Se a contagem de threads de escalamento for 400, a contagem total de threads terá de descer para menos de 1200 antes de ocorrer um evento de dimensionamento. Veja a tabela abaixo.
Hora | Contagem de instâncias | Contagem de threads | Contagem de threads por instância | Evento de dimensionamento | Contagem de instâncias resultante |
---|---|---|---|---|---|
T0 | 2 | 1250 | 625 | Aumentar horizontalmente | 3 |
T1 | 3 | 1250 | 417 | nenhum evento de dimensionamento | 3 |
T2 | 3 | 1180 | 394 | dimensionar em | 2 |
T3 | 3 | 1180 | 590 | nenhum evento de dimensionamento | 2 |
Dimensionar por mais de uma instância
Para evitar oscilações ao aumentar ou reduzir horizontalmente mais do que uma instância, o dimensionamento automático pode ser dimensionado em menos do que o número de instâncias especificadas na regra.
Por exemplo, as seguintes regras podem causar a agitação:
- Aumente horizontalmente em 20 quando a contagem de pedidos >=200 por instância.
- OU quando a CPU > 70% por instância.
- Dimensione em 10 quando a contagem de pedidos <=50 por instância.
A tabela abaixo mostra um potencial resultado destas regras de dimensionamento automático:
Hora | Número de instâncias | CPU | Contagem de pedidos | Evento de dimensionamento | Instâncias resultantes | Comentários |
---|---|---|---|---|---|---|
T0 | 30 | 65% | 3000 ou 100 por instância. | Nenhum evento de dimensionamento | 30 | |
T1 | 30 | 65 | 1500 | Dimensionar por 3 instâncias | 27 | O dimensionamento em 10 provocaria um aumento estimado da CPU acima dos 70%, o que levaria a um evento de aumento horizontal. |
No momento T0, a aplicação está em execução com 30 instâncias, uma contagem total de pedidos de 3000 e uma utilização da CPU de 65% por instância.
Em T1, quando a contagem de pedidos diminuir para 1500 pedidos ou 50 pedidos por instância, o dimensionamento automático tentará dimensionar em 10 instâncias para 20. No entanto, o dimensionamento automático estima que a carga da CPU para 20 instâncias será superior a 70%, causando um evento de escalamento horizontal.
Para evitar a oscilação, o motor de dimensionamento automático estima que a utilização da CPU para a instância conta acima de 20 até encontrar uma contagem de instâncias em que todas as métricas estão nos limiares definidos:
- Mantenha a CPU abaixo dos 70%.
- Mantenha o número de pedidos por instância acima de 50.
- Reduza o número de instâncias abaixo de 30.
Nesta situação, o dimensionamento automático pode ser dimensionado em 3, de 30 a 27 instâncias para satisfazer as regras, embora a regra especifique uma diminuição de 10. Será escrita uma mensagem de registo no registo de atividades com uma descrição que inclui Reduzir verticalmente com a contagem de instâncias atualizada para evitar oscilações
Se o dimensionamento automático não conseguir encontrar um número adequado de instâncias, irá ignorar a escala em evento e reavaliar durante o próximo ciclo.
Nota
Se o motor de dimensionamento automático detetar que a oscilação pode ocorrer como resultado do dimensionamento para o número de destino de instâncias, também tentará dimensionar para um número mais baixo de instâncias entre a contagem atual e a contagem de destino. Se a oscilação não ocorrer dentro deste intervalo, o dimensionamento automático continuará a operação de dimensionamento com o novo destino.
Ficheiros de registo
Encontre flapping no registo de atividades com a seguinte consulta:
// Activity log, CategoryValue: Autoscale
// Lists latest Autoscale operations from the activity log, with OperationNameValue =="Microsoft.Insights/AutoscaleSettings/Flapping/Action
AzureActivity
|where CategoryValue =="Autoscale" and OperationNameValue =="Microsoft.Insights/AutoscaleSettings/Flapping/Action"
|sort by TimeGenerated desc
Segue-se um exemplo de um registo de atividades para bater as linhas:
{
"eventCategory": "Autoscale",
"eventName": "FlappingOccurred",
"operationId": "1111bbbb-22cc-dddd-ee33-ffffff444444",
"eventProperties":
"{"Description":"Scale down will occur with updated instance count to avoid flapping.
Resource: '/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/ed-rg-001/providers/Microsoft.Web/serverFarms/ScaleableAppServicePlan'.
Current instance count: '6',
Intended new instance count: '1'.
Actual new instance count: '4'",
"ResourceName":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/rg-001/providers/Microsoft.Web/serverFarms/ScaleableAppServicePlan",
"OldInstancesCount":6,
"NewInstancesCount":4,
"ActiveAutoscaleProfile":{"Name":"Auto created scale condition",
"Capacity":{"Minimum":"1","Maximum":"30","Default":"1"},
"Rules":[{"MetricTrigger":{"Name":"Requests","Namespace":"microsoft.web/sites","Resource":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/rg-001/providers/Microsoft.Web/sites/ScaleableWebApp1","ResourceLocation":"West Central US","TimeGrain":"PT1M","Statistic":"Average","TimeWindow":"PT1M","TimeAggregation":"Maximum","Operator":"GreaterThanOrEqual","Threshold":3.0,"Source":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/ed-rg-001/providers/Microsoft.Web/sites/ScaleableWebApp1","MetricType":"MDM","Dimensions":[],"DividePerInstance":true},"ScaleAction":{"Direction":"Increase","Type":"ChangeCount","Value":"10","Cooldown":"PT1M"}},{"MetricTrigger":{"Name":"Requests","Namespace":"microsoft.web/sites","Resource":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/rg-001/providers/Microsoft.Web/sites/ScaleableWebApp1","ResourceLocation":"West Central US","TimeGrain":"PT1M","Statistic":"Max","TimeWindow":"PT1M","TimeAggregation":"Maximum","Operator":"LessThan","Threshold":3.0,"Source":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/ed-rg-001/providers/Microsoft.Web/sites/ScaleableWebApp1","MetricType":"MDM","Dimensions":[],"DividePerInstance":true},"ScaleAction":{"Direction":"Decrease","Type":"ChangeCount","Value":"5","Cooldown":"PT1M"}}]}}",
"eventDataId": "dddd3333-ee44-5555-66ff-777777aaaaaa",
"eventSubmissionTimestamp": "2022-09-13T07:20:41.1589076Z",
"resource": "scaleableappserviceplan",
"resourceGroup": "RG-001",
"resourceProviderValue": "MICROSOFT.WEB",
"subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
"activityStatusValue": "Succeeded"
}
Passos seguintes
Para saber mais sobre o dimensionamento automático, veja os seguintes recursos: