Oscilación en Escalabilidad automática
En este artículo se describe la oscilación en la escalabilidad automática y cómo evitarla.
La oscilación hace referencia a una situación de bucle que provoca una serie de eventos de escalado opuestos. La oscilación se produce cuando un evento de escalado desencadena el evento de escalado opuesto.
La escalabilidad automática evalúa una acción de escalado pendiente para ver si provocaría la oscilación. En los casos en los que se puede producir la oscilación, la escalabilidad automática puede omitir la acción de escalado y volver a evaluarla en la siguiente ejecución, o la escalabilidad automática puede escalar por menos del número especificado de instancias de recursos. El proceso de evaluación de escalado automático se produce cada vez que se ejecuta el motor de escalado automático, que es cada 30 a 60 segundos, según el tipo de recurso.
Para asegurarse de que hay recursos adecuados, la comprobación de posibles oscilaciones no se produce para eventos de escalabilidad horizontal. La escalabilidad automática solo aplazará un evento de escalado de reducción para evitar la oscilación.
Por ejemplo, suponga las reglas siguientes:
- Escalar horizontalmente aumentando en 1 instancia cuando el uso medio de CPU es superior al 50 %.
- Reducir horizontalmente el recuento de instancias en 1 instancia cuando el uso medio de CPU es inferior al 30 %.
En la tabla siguiente en T0, cuando el uso es del 56 %, se desencadena una acción de escalabilidad horizontal y se produce un uso de CPU del 56 % en dos instancias. Esto proporciona un promedio del 28 % para el conjunto de escalado. Dado que el 28 % es menor que el umbral de reducción horizontal, la escalabilidad automática debe volver a reducirse horizontalmente. La reducción horizontal devolvería el conjunto de escalado al 56 % de uso de CPU, lo que desencadena una acción de escalado horizontal.
Time | Recuento de instancias | % de CPU | % de CPU por instancia | Evento de escalado | Recuento de instancias resultante |
---|---|---|---|---|---|
T0 | 1 | 56% | 56% | Escalado horizontal | 2 |
T1 | 2 | 56% | 28 % | Reducción horizontal | 1 |
T2 | 1 | 56% | 56% | Escalado horizontal | 2 |
T3 | 2 | 56% | 28 % | Reducción horizontal | 1 |
Si se deja sin controlar, habrá una serie continua de eventos de escalado. Sin embargo, en esta situación, el motor de escalado automático aplazará el evento de reducción horizontal en T1 y volverá a evaluarse durante la siguiente ejecución de escalabilidad automática. La reducción horizontal solo se producirá una vez que el uso medio de CPU sea inferior al 30 %.
A menudo, la oscilación la provoca:
- Márgenes pequeños o inexistentes entre umbrales
- Escalado por más de una instancia
- Escalado y reducción horizontales mediante diferentes métricas
Márgenes pequeños o inexistentes entre umbrales
Para evitar la oscilación, mantenga los márgenes adecuados entre los umbrales de escalado.
Por ejemplo, las reglas siguientes en las que no hay ningún margen entre umbrales, provocan la oscilación.
- Escalado horizontal cuando el número >de subprocesos = 600
- Reducción horizontal cuando el número de subprocesos < es 600
En la tabla siguiente se muestra un resultado potencial de estas reglas de escalabilidad automática:
Time | Recuento de instancias | Número de subprocesos | Número de subprocesos por instancia | Evento de escalado | Recuento de instancias resultante |
---|---|---|---|---|---|
T0 | 2 | 1250 | 625 | Escalado horizontal | 3 |
T1 | 3 | 1250 | 417 | Reducción horizontal | 2 |
- En el momento T0, hay dos instancias que controlan 1250 subprocesos o 625 subprocesos por instancia. La escalabilidad automática se escala horizontalmente a tres instancias.
- Después del escalado horizontal, en T1, tenemos los mismos 1250 subprocesos, pero con tres instancias, solo 417 subprocesos por instancia. Se desencadena un evento de reducción horizontal.
- Antes de la reducción horizontal, la escalabilidad automática evalúa lo que sucedería si se produjera el evento de reducción horizontal. En este ejemplo, 1250 / 2 = 625, es decir, 625 subprocesos por instancia. La escalabilidad automática tendría que volver a escalar horizontalmente inmediatamente después de escalar horizontalmente. Si se escalara horizontalmente de nuevo, todo el proceso se repetiría, lo que daría lugar a un bucle oscilante.
- Para evitar esta situación, la escalabilidad automática no reduce horizontalmente. La escalabilidad automática omite el evento de escalado actual y vuelve a evaluar la regla en el siguiente ciclo de ejecución.
En este caso, parece que la escalabilidad automática no funciona, ya que no se produce ningún evento de escalado. Compruebe la pestaña Historial de ejecución de la página de configuración de escalado automático para ver si hay alguna oscilación.
Establecer un margen adecuado entre umbrales evita el escenario anterior. Por ejemplo,
- Escalado horizontal cuando el número >de subprocesos = 600
- Reducción horizontal cuando el número de subprocesos < es 400
Si el recuento de subprocesos de reducción horizontal es 400, el número total de subprocesos tendría que caer por debajo de 1200 antes de que se produzca un evento de escalado. Vea la tabla siguiente.
Time | Recuento de instancias | Número de subprocesos | Número de subprocesos por instancia | Evento de escalado | Recuento de instancias resultante |
---|---|---|---|---|---|
T0 | 2 | 1250 | 625 | Escalado horizontal | 3 |
T1 | 3 | 1250 | 417 | ningún evento de escalado | 3 |
T2 | 3 | 1180 | 394 | reducción horizontal | 2 |
T3 | 3 | 1180 | 590 | ningún evento de escalado | 2 |
Escalado por más de una instancia
Para evitar la oscilación al escalar o reducir horizontalmente en más de una instancia, la escalabilidad automática puede escalar por menos del número de instancias especificadas en la regla.
Por ejemplo, las reglas siguientes pueden provocar la oscilación:
- Escalar horizontalmente en 20 cuando el recuento >de solicitudes = 200 por instancia.
- O cuando CPU > 70 % por instancia.
- Escalar horizontalmente en 10 cuando el recuento de solicitudes <= 50 por instancia.
En la tabla siguiente se muestra un resultado potencial de estas reglas de escalabilidad automática:
Time | Número de instancias | CPU | Recuento de solicitudes | Evento de escalado | Instancias resultantes | Comentarios |
---|---|---|---|---|---|---|
T0 | 30 | 65 % | 3000, o 100 por instancia. | Ningún evento de escalado | 30 | |
T1 | 30 | 65 | 1.500 | Reducir horizontalmente en 3 instancias | 27 | La reducción horizontal en 10 provocaría un aumento estimado de la CPU por encima del 70 %, lo que provocaría un evento de escalabilidad horizontal. |
En el momento T0, la aplicación se ejecuta con 30 instancias, un recuento total de solicitudes de 3000 y un uso de CPU del 65 % por instancia.
En T1, cuando el recuento de solicitudes cae a 1500 solicitudes, o 50 solicitudes por instancia, la escalabilidad automática intentará escalar en 10 instancias a 20. Sin embargo, la escalabilidad automática calcula que la carga de CPU para 20 instancias será superior al 70 %, lo que provoca un evento de escalabilidad horizontal.
Para evitar la oscilación, el motor de escalado automático calcula el uso de CPU para los recuentos de instancias superiores a 20 hasta que encuentre un recuento de instancias en el que todas las métricas se encuentran dentro de los umbrales definidos:
- Mantenga la CPU por debajo del 70 %.
- Mantenga el número de solicitudes por instancia por encima de 50.
- Reduzca el número de instancias a menos de 30.
En esta situación, la escalabilidad automática puede reducir en 3, de 30 a 27 instancias para satisfacer las reglas, aunque la regla especifique una disminución de 10. Se escribe un mensaje de registro en el registro de actividad con una descripción que incluye La reducción vertical se producirá con el recuento de instancias actualizado para evitar la oscilación
Si la escalabilidad automática no encuentra un número adecuado de instancias, omitirá la escala en caso de que se vuelva a evaluar durante el siguiente ciclo.
Nota
Si el motor de escalabilidad automática detecta que podrían producirse oscilaciones como resultado del escalado al número de instancias de destino, también intentará escalar a un número diferente de instancias entre el recuento actual y el recuento de destino. Si no se produce una oscilación en este intervalo, la escalabilidad automática continuará la operación de escalado con el nuevo destino.
Archivos de registro
Busque la oscilación en el registro de actividad con la siguiente 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
A continuación se muestra un ejemplo de un registro de actividad para la oscilación:
{
"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"
}
Pasos siguientes
Para más información sobre el escalado automático, consulte los siguientes recursos: