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

Captura de ecrã a mostrar regras de dimensionamento automático com escalamento horizontal quando a contagem de threads é maior ou igual a 600 e dimensiona quando a contagem de threads é inferior a 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.

Uma captura de ecrã a mostrar o separador histórico de execuções de dimensionamento automático com registos a mostrar a 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

Captura de ecrã a mostrar regras de dimensionamento automático com escalamento horizontal quando a contagem de threads é superior ou igual a 600 e dimensiona quando o thread conta menos de 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 reduzir horizontalmente 2
T3 3 1180 590 nenhum evento de dimensionamento 2

Dimensionar em mais do que uma instância

Para evitar oscilações ao aumentar ou reduzir horizontalmente em 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 oscilação:

  • Aumente horizontalmente em 20 quando a contagem de pedidos >=200 por instância.
  • OU quando a CPU > 70% por instância.
  • Reduza horizontalmente em 10 quando a contagem de pedidos <=50 por instância.

Captura de ecrã a mostrar uma condição de dimensionamento predefinido de dimensionamento automático com regras configuradas para o exemplo.

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 Reduzir horizontalmente por 3 instâncias 27 O aumento horizontal 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 cai para 1500 pedidos ou 50 pedidos por instância, o dimensionamento automático tentará reduzir horizontalmente 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%, o que causa um evento de aumento horizontal.

Para evitar oscilações, o motor de dimensionamento automático estima a utilização da CPU para contagens de instâncias superiores a 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 reduzir horizontalmente 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 o dimensionamento no 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 instâncias de destino, 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

Localize a oscilação 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 a oscilação:

Uma captura de ecrã a mostrar um registo de um evento de oscilação.

{
"eventCategory": "Autoscale",
"eventName": "FlappingOccurred",
"operationId": "ffd31c67-1438-47a5-bee4-1e3a102cf1c2",
"eventProperties": 
    "{"Description":"Scale down will occur with updated instance count to avoid flapping. 
     Resource: '/subscriptions/d1234567-9876-a1b2-a2b1-123a567b9f8767/  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/d1234567-9876-a1b2-a2b1-123a567b9f8767/resourcegroups/ed-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/d1234567-9876-a1b2-a2b1-123a567b9f8767/resourceGroups/ed-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/d1234567-9876-a1b2-a2b1-123a567b9f8767/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/d1234567-9876-a1b2-a2b1-123a567b9f8767/resourceGroups/ed-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/d1234567-9876-a1b2-a2b1-123a567b9f8767/resourceGroups/ed-rg-001/providers/Microsoft.Web/sites/ScaleableWebApp1","MetricType":"MDM","Dimensions":[],"DividePerInstance":true},"ScaleAction":{"Direction":"Decrease","Type":"ChangeCount","Value":"5","Cooldown":"PT1M"}}]}}",
"eventDataId": "b23ae911-55d0-4881-8684-fc74227b2ddb",
"eventSubmissionTimestamp": "2022-09-13T07:20:41.1589076Z",
"resource": "scaleableappserviceplan",
"resourceGroup": "ED-RG-001",
"resourceProviderValue": "MICROSOFT.WEB",
"subscriptionId": "D1234567-9876-A1B2-A2B1-123A567B9F876",
"activityStatusValue": "Succeeded"
}

Passos seguintes

Para saber mais sobre o dimensionamento automático, veja os seguintes recursos: