Compartilhar via


Oscilação no dimensionamento automático

Este artigo descreve a oscilação no dimensionamento automático e como evitá-lo.

Oscilação refere-se a uma condição de loop que causa uma série de eventos de escala opostos. A oscilação acontece quando um evento de escala dispara o evento de escala oposto.

O dimensionamento automático avalia uma ação de redução horizontal pendente para ver se isso causaria oscilação. Nos casos em que poderia ocorrer oscilação, o dimensionamento automático pode ignorar a ação de escala e reavaliar na próxima execução, ou o dimensionamento automático pode escalar menos em relação ao número especificado de instâncias de recurso. O processo de avaliação do dimensionamento automático ocorre sempre que o mecanismo 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 possíveis oscilações não ocorre para eventos de expansão. O dimensionamento automático adiará apenas um evento de redução horizontal para evitar a oscilação.

Por exemplo, vamos supor as seguintes regras:

  • Aumento da escala horizontal em 1 instância quando o uso médio da CPU estiver acima de 50%.
  • Diminuição da redução horizontal na contagem de instâncias em 1 instância quando o uso médio da CPU estiver abaixo de 30%.

Na tabela abaixo em T0, quando o uso está em 56%, uma ação de expansão é disparada e resulta em 56% de uso da CPU em 2 instâncias. Isso fornece uma média de 28% para o conjunto de dimensionamento. Como 28% é menor que o limite de redução horizontal, o dimensionamento automático deve ser reduzido horizontalmente de novo. A redução horizontal retornaria o conjunto de dimensionamento para 56% de uso da CPU, o que dispara uma ação de expansão.

Tempo Contagem de instâncias CPU% CPU% por instância Evento de escala Contagem de instâncias resultante
T0 1 56% 56% Escalar horizontalmente 2
T1 2 56% 28% Reduzir horizontalmente 1
T2 1 56% 56% Escalar horizontalmente 2
T3 2 56% 28% Reduzir horizontalmente 1

Se deixado sem controle, haveria uma série contínua de eventos de escala. No entanto, nessa situação, o mecanismo de dimensionamento automático adiará o evento de redução horizontal em T1 e reavaliará durante a próxima execução de dimensionamento automático. A redução horizontal só ocorrerá quando o uso médio da CPU estiver abaixo de 30%.

A oscilação costuma ser causada por:

  • Margens pequenas ou nenhuma entre limites
  • Escala em mais de uma instância
  • Reduzir ou escalar horizontalmente usando métricas diferentes

Margens pequenas ou nenhuma entre limites

Para evitar oscilação, mantenha margens adequadas entre os limites de escala.

Por exemplo, as regras a seguir em que não há margem entre limites, causam oscilação.

  • Escalar horizontalmente quando a contagem de threads >=600
  • Reduzir horizontalmente quando a contagem de threads < 600

Uma captura de tela mostrando as regras de dimensionamento automático com escala horizontal quando a contagem de threads for superior ou igual a 600 e redução horizontal quando a contagem de threads for inferior a 600.

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

Tempo 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 Escalar horizontalmente 3
T1 3 1250 417 Reduzir horizontalmente 2
  • No momento T0, há duas instâncias manipulando 1250 threads ou 625 threads por instância. O dimensionamento automático escala horizontalmente três instâncias.
  • Seguindo a expansão, em T1, temos os mesmos 1250 threads, mas com três instâncias, sendo apenas 417 threads por instância. Um evento redução horizontal é disparado.
  • Antes de reduzir horizontalmente, o dimensionamento automático avalia o que aconteceria se o evento de redução ocorresse. Neste exemplo, temos 1250 / 2 = 625, ou seja, 625 threads por instância. O dimensionamento automático teria que escalar horizontalmente outra vez após reduzir horizontalmente. Se fosse escalado horizontalmente outra vez, todo o processo se repetiria, levando a um loop infinito.
  • Para evitar essa situação, o dimensionamento automático não reduz horizontalmente. O dimensionamento automático 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, pois nenhum evento de escala ocorre. Verifique a guia Histórico de execuções na página de configuração de dimensionamento automático para ver se há alguma oscilação.

Uma captura de tela mostrando o histórico de execuções de dimensionamento automático com registros mostrando oscilação.

Definir uma margem adequada entre limites evita o cenário acima. Por exemplo,

  • Escalar horizontalmente quando a contagem de threads >=600
  • Reduzir horizontalmente quando a contagem de threads < 400

Uma captura de tela mostrando as regras de dimensionamento automático com escala horizontal quando a contagem de threads for superior ou igual a 600 e redução horizontal quando a contagem de threads for inferior a 400.

Se a contagem de threads da escala horizontal for 400, a contagem total de threads teria que cair abaixo de 1200 antes que um evento de escala ocorra. Veja a tabela abaixo.

Tempo 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 Escalar horizontalmente 3
T1 3 1250 417 nenhum evento de escala 3
T2 3 1180 394 reduzir horizontalmente 2
T3 3 1180 590 nenhum evento de escala 2

Escala em mais de uma instância

Para evitar a oscilação ao escalar ou reduzir horizontalmente por mais de uma instância, o dimensionamento automático pode escalar por menos do que o número de instâncias especificadas na regra.

Por exemplo, as seguintes regras podem causar oscilação:

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

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

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

Tempo Número de instâncias CPU Contagem de solicitações 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 Reduzir horizontalmente por 3 instâncias 27 Reduzir horizontalmente por 10 causaria um aumento estimado da CPU acima de 70%, levando a um evento de expansão.

No momento T0, o aplicativo está em execução 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á reduzir horizontalmente por 10 instâncias para 20. No entanto, o dimensionamento automático estima que a carga da CPU para 20 instâncias será acima de 70%, causando um evento de expansão.

Para evitar oscilação, o mecanismo de dimensionamento automático estima o uso da CPU para contagens de instâncias acima de 20 até encontrar uma contagem de instâncias em que todas as métricas estão nos limites definidos:

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

Nessa situação, o dimensionamento automático pode reduzir horizontalmente por 3, de 30 para 27 instâncias para atender às 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 vertical ocorrerá com a contagem de instâncias atualizada para evitar oscilação

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

Observação

Se o mecanismo de dimensionamento automático detectar que a oscilação pode ocorrer como resultado da escala para o número de instâncias de destino, ele também tentará escalar para um número menor de instâncias entre a contagem atual e a contagem de destino. Se a oscilação não ocorrer nesse intervalo, o dimensionamento automático continuará a operação de escala com o novo destino.

Arquivos de log

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

Veja abaixo um exemplo de um registro de log de atividades para oscilações:

Uma captura de tela mostrando um registro de log de um evento de oscilação.

{
"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óximas etapas

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