Flapping em Autoscale

Este artigo descreve o batimento na escala automática e como evitá-lo.

Flapping refere-se a uma condição de loop que causa uma série de eventos de escala opostos. O Flapping acontece quando um evento de escala aciona o evento de escala oposta.

O dimensionamento automático avalia uma ação de dimensionamento pendente para ver se ela causaria batimento. Nos casos em que o batimento pode ocorrer, o dimensionamento automático pode ignorar a ação de escala e reavaliar na próxima execução, ou o dimensionamento automático pode ser dimensionado por menos do que o número especificado de instâncias de recurso. O processo de avaliação de escala automática ocorre cada vez que o mecanismo de escala automática é executado, que é a cada 30 a 60 segundos, dependendo do tipo de recurso.

Para garantir recursos adequados, a verificação de possíveis oscilações não ocorre para eventos de expansão. O dimensionamento automático apenas adiará um evento de dimensionamento para evitar o batimento.

Por exemplo, vamos supor as seguintes regras:

  • Dimensione aumentando em 1 instância quando o uso médio da CPU estiver acima de 50%.
  • Dimensione para diminuir a contagem de instâncias em 1 instância quando o uso médio da CPU for inferior a 30%.

Na tabela abaixo em T0, quando o uso está em 56%, uma ação de expansão é acionada e resulta em 56% de uso da CPU em 2 instâncias. Isso dá uma média de 28% para a escala definida. Como 28% é menor do que o limite de expansão, o dimensionamento automático deve ser reduzido. O dimensionamento retornaria a escala definida para 56% de uso da CPU, o que aciona uma ação de expansão.

Hora Contagem de instâncias CPU% % de CPU por instância Evento de escala 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 fosse controlada, haveria uma série de eventos de escala em curso. No entanto, nessa situação, o motor de escala automática adiará o evento de dimensionamento em T1 e reavaliará durante a próxima execução de escala automática. O scale-in só acontecerá quando o uso médio da CPU estiver abaixo de 30%.

O batimento é frequentemente causado por:

  • Margens reduzidas ou inexistentes entre limiares
  • Dimensionamento por mais de uma instância
  • Escalar para dentro e para fora usando métricas diferentes

Margens reduzidas ou inexistentes entre limiares

Para evitar batimentos, mantenha margens adequadas entre os limiares de escala.

Por exemplo, as seguintes regras, onde não há margem entre os limites, causam agitação.

  • Dimensionar quando a contagem >de threads for = 600
  • Dimensionar quando a contagem < de threads 600

Uma captura de tela mostrando regras de dimensionamento automático com dimensionamento quando a contagem de threads é maior ou igual a 600 e dimensionada quando a contagem de threads é menor que 600.

A tabela abaixo mostra um resultado potencial dessas regras de dimensionamento automático:

Hora Contagem de instâncias Contagem de threads Contagem de threads por instância Evento de escala Contagem de instâncias resultante
T0 2 1250 625 Aumentar horizontalmente 3
T1 3 1250 417 Reduzir horizontalmente 2
  • No momento T0, há duas instâncias manipulando 1250 threads, ou 625 pisos por instância. O dimensionamento automático é dimensionado para três instâncias.
  • Após o scale-out, em T1, temos os mesmos 1250 threads, mas com três instâncias, apenas 417 threads por instância. Um evento de scale-in é acionado.
  • Antes do dimensionamento, o dimensionamento automático avalia o que aconteceria se o evento de expansão ocorresse. Neste exemplo, 1250 / 2 = 625, ou seja, 625 threads por instância. O dimensionamento automático teria que ser dimensionado imediatamente novamente após a escala. Se fosse ampliado novamente, o processo se repetiria, levando a um loop de batimento.
  • Para evitar essa situação, o dimensionamento automático não é dimensionado. A escala automática ignora o evento de escala atual e reavalia a regra no próximo ciclo de execução.

Nesse caso, parece que o dimensionamento automático não está funcionando, já que nenhum evento de escala ocorre. Verifique a guia Histórico de execução na página de configuração de dimensionamento automático para ver se há alguma oscilação.

Uma captura de tela mostrando a guia Histórico de execução em escala automática com registros mostrando o batimento.

A fixação de uma margem adequada entre os limiares evita o cenário acima referido. Por exemplo,

  • Dimensionar quando a contagem >de threads for = 600
  • Dimensionar quando a contagem de threads for < 400

Uma captura de tela mostrando regras de dimensionamento automático com dimensionamento quando a contagem de threads é maior ou igual a 600 e dimensionada quando a contagem de threads é menor que 400.

Se a contagem de threads em escala for 400, a contagem total de threads terá que cair para menos de 1200 antes que um evento de escala ocorra. Veja a tabela abaixo.

Hora Contagem de instâncias Contagem de threads Contagem de threads por instância Evento de escala Contagem de instâncias resultante
T0 2 1250 625 Aumentar horizontalmente 3
T1 3 1250 417 nenhum evento de escala 3
T2 3 1180 394 escala em 2
T3 3 1180 590 nenhum evento de escala 2

Dimensionamento por mais de uma instância

Para evitar oscilações ao escalar para dentro ou para fora em mais de uma instância, o dimensionamento automático pode ser dimensionado em menos do que o número de instâncias especificado na regra.

Por exemplo, as seguintes regras podem causar batimento:

  • Dimensione em 20 quando a contagem >de solicitações = 200 por instância.
  • OU quando a CPU > 70% por instância.
  • Dimensione em 10 quando a contagem <de solicitações = 50 por instância.

Uma captura de tela mostrando uma condição de escala padrão de dimensionamento automático com regras configuradas para o exemplo.

A tabela abaixo mostra um resultado potencial dessas regras de dimensionamento automático:

Hora Número de instâncias CPU Contagem de pedidos Evento de escala Instâncias resultantes Comentários
T0 30 65% 3000, ou 100 por instância. Nenhum evento de escala 30
T1 30 65 1500 Dimensionar em 3 instâncias 27 O escalonamento em 10 causaria um aumento estimado da CPU acima de 70%, levando a um evento de expansão.

No momento T0, o aplicativo está sendo executado com 30 instâncias, uma contagem total de solicitações de 3000 e um uso de CPU de 65% por instância.

Em T1, quando a contagem de solicitações cair para 1500 solicitações, ou 50 solicitações 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 estará acima de 70%, causando um evento de expansão.

Para evitar o batimento, o mecanismo de dimensionamento automático estima que o uso da CPU, por exemplo, conte acima de 20 até encontrar uma contagem de instâncias em que todas as métricas estejam nos limites definidos:

  • Mantenha a CPU abaixo de 70%.
  • Mantenha o número de solicitações por instância acima de 50.
  • Reduza o número de instâncias abaixo de 30.

Nessa situação, a escala automática pode ser dimensionada em 3, de 30 para 27 instâncias, a fim de satisfazer as regras, mesmo que a regra especifique uma diminuição de 10. Uma mensagem de log é gravada no log de atividades com uma descrição que inclui Redução de escala ocorrerá com contagem de instâncias atualizada para evitar batidas

Se o dimensionamento automático não conseguir encontrar um número adequado de instâncias, ele ignorará a escala no evento e reavaliará durante o próximo ciclo.

Nota

Se o mecanismo de dimensionamento automático detetar que o batimento pode ocorrer como resultado do dimensionamento para o número de instâncias de destino, ele também tentará dimensionar para um número menor de instâncias entre a contagem atual e a contagem de destino. Se o batimento não ocorrer dentro desse intervalo, o dimensionamento automático continuará a operação de escala com o novo destino.

Ficheiros de registo

Encontre flapping no registro 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 

Abaixo está um exemplo de um registro de registro de atividade para bater:

Uma captura de tela mostrando um registro de log de um evento de batimento.

{
"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"
}

Próximos passos

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