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
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.
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
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.
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:
{
"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: