En el caso de los servicios de Cloud Run, cada revisión se escala automáticamente al número de instancias necesarias para gestionar todas las solicitudes entrantes.
Cuando más instancias procesen solicitudes, más CPU y memoria se utilizarán, lo que supondrá un aumento de los costes.
Para ofrecerte más control, Cloud Run proporciona un ajuste de solicitudes simultáneas máximas por instancia que especifica el número máximo de solicitudes que puede procesar simultáneamente una instancia determinada.
Número máximo de solicitudes simultáneas por instancia
Puedes configurar el número máximo de solicitudes simultáneas por instancia. De forma predeterminada, cada instancia de Cloud Run puede recibir hasta 80 solicitudes al mismo tiempo. Puedes aumentar este número hasta un máximo de 1000.
Aunque deberías usar el valor predeterminado, si es necesario, puedes reducir la simultaneidad máxima. Por ejemplo, si tu código no puede procesar solicitudes paralelas, define la simultaneidad como 1
.
El valor de simultaneidad especificado es un límite máximo. Si la CPU de la instancia ya está muy utilizada, es posible que Cloud Run no envíe tantas solicitudes a una instancia determinada. En estos casos, es posible que la instancia de Cloud Run muestre que no se está utilizando la simultaneidad máxima. Por ejemplo, si el uso elevado de la CPU se mantiene, el número de instancias podría aumentar.
En el siguiente diagrama se muestra cómo afecta el ajuste del número máximo de solicitudes simultáneas por instancia al número de instancias necesarias para gestionar las solicitudes simultáneas entrantes:
Ajustar la simultaneidad para el autoescalado y el uso de recursos
Ajustar la simultaneidad máxima por instancia influye significativamente en cómo se escala tu servicio y utiliza los recursos.
- Simultaneidad más baja: obliga a Cloud Run a usar más instancias para el mismo volumen de solicitudes, ya que cada instancia gestiona menos solicitudes. Esto puede mejorar la capacidad de respuesta de las aplicaciones que no están optimizadas para un paralelismo interno alto o de las aplicaciones que quieras escalar más rápidamente en función de la carga de solicitudes.
- Mayor simultaneidad: permite que cada instancia gestione más solicitudes, lo que puede reducir el número de instancias activas y, por lo tanto, los costes. Es adecuada para aplicaciones eficientes en tareas paralelas de E/o para aplicaciones que pueden utilizar varias vCPUs para procesar solicitudes simultáneas.
Empieza con la simultaneidad predeterminada (80) , monitoriza de cerca el rendimiento y la utilización de tu aplicación, y haz los ajustes que sean necesarios.
Simultaneidad con instancias de varias vCPUs
Ajustar la simultaneidad es especialmente importante si tu servicio usa varias vCPUs, pero tu aplicación es de un solo hilo o de un solo hilo de forma efectiva (es decir, está limitada por la CPU).
- Puntos de acceso de vCPU: una aplicación de un solo subproceso en una instancia de varias vCPUs puede alcanzar el máximo de una vCPU mientras que las demás están inactivas. El escalador automático de CPU de Cloud Run mide el uso medio de CPU en todas las vCPUs. En este caso, la utilización media de la CPU puede seguir siendo engañosamente baja, lo que impide que se aplique un escalado eficaz basado en la CPU.
- Usar la simultaneidad para impulsar el escalado: si el autoescalado basado en la CPU no es eficaz debido a los puntos de acceso de vCPU, reducir la simultaneidad máxima se convierte en una herramienta importante. Los puntos de acceso de vCPU suelen producirse cuando se elige una vCPU múltiple para una aplicación de un solo subproceso debido a las altas necesidades de memoria. Si se usa la simultaneidad para controlar el escalado, este se basa en el rendimiento de las solicitudes. De esta forma, se inician más instancias para gestionar la carga, lo que reduce la latencia y las colas por instancia.
Cuándo limitar la simultaneidad máxima a una solicitud a la vez.
Puedes limitar la simultaneidad para que solo se envíe una solicitud a la vez a cada instancia en ejecución. Deberías plantearte hacerlo en los siguientes casos:
- Cada solicitud usa la mayor parte de la CPU o la memoria disponibles.
- La imagen de tu contenedor no está diseñada para gestionar varias solicitudes al mismo tiempo. Por ejemplo, si tu contenedor depende de un estado global que dos solicitudes no pueden compartir.
Ten en cuenta que una simultaneidad de 1
probablemente afectará negativamente al rendimiento del escalado, ya que se tendrán que iniciar muchas instancias para gestionar un pico de solicitudes entrantes. Consulta más consideraciones en el artículo Rendimiento frente a latencia y otras opciones.
Caso de éxito
Las siguientes métricas muestran un caso práctico en el que 400 clientes realizan 3 solicitudes por segundo a un servicio de Cloud Run que tiene un máximo de 1 solicitud simultánea por instancia. La línea superior verde muestra las solicitudes a lo largo del tiempo, mientras que la línea inferior azul indica el número de instancias que se han iniciado para gestionar las solicitudes.
Las siguientes métricas muestran 400 clientes que hacen 3 solicitudes por segundo a un servicio de Cloud Run que tiene un máximo de 80 solicitudes simultáneas por instancia. La línea superior verde muestra las solicitudes a lo largo del tiempo, mientras que la línea inferior azul muestra el número de instancias iniciadas para gestionar las solicitudes. Ten en cuenta que se necesitan muchas menos instancias para gestionar el mismo volumen de solicitudes.
Simultaneidad de las implementaciones de código fuente
Cuando la simultaneidad está habilitada, Cloud Run no proporciona aislamiento entre las solicitudes simultáneas procesadas por la misma instancia. En estos casos, debes asegurarte de que tu código se pueda ejecutar de forma simultánea. Para cambiarlo, define otro valor de simultaneidad. Te recomendamos que empieces con una simultaneidad más baja, como 8, y que la aumentes después. Si empiezas con una simultaneidad demasiado alta, es posible que se produzcan comportamientos inesperados debido a las limitaciones de recursos (como la memoria o la CPU).
Los tiempos de ejecución de los lenguajes también pueden influir en la simultaneidad. En la siguiente lista se muestran algunos de estos impactos específicos de cada idioma:
Node.js es inherentemente de un solo subproceso. Para aprovechar la simultaneidad, usa el estilo de código asíncrono de JavaScript, que es idiomático en Node.js. Para obtener más información, consulta la sección Control de flujo asíncrono de la documentación oficial de Node.js.
En Python 3.8 y versiones posteriores, para admitir una alta simultaneidad por instancia, se necesitan suficientes subprocesos para gestionar la simultaneidad. Te recomendamos que definas una variable de entorno de tiempo de ejecución para que el valor de los subprocesos sea igual al valor de simultaneidad. Por ejemplo:
THREADS=8
.
Siguientes pasos
Para gestionar el número máximo de solicitudes simultáneas por instancia de tus servicios de Cloud Run, consulta Definir el número máximo de solicitudes simultáneas por instancia.
Para optimizar la configuración del número máximo de solicitudes simultáneas por instancia, consulta los consejos de desarrollo para ajustar la simultaneidad.