Para darle un poco de contexto:

Para darle un poco de contexto:

Para darle un poco de contexto:

Tengo dos entornos de servidor ejecutando la misma aplicación. El primero, que pretendo abandonar, es un entorno estándar de Google App Engine que tiene muchas limitaciones. El segundo es un clúster de Google Kubernetes que ejecuta mi aplicación Python con Gunicorn.

concurrencia

En el primer servidor, puedo enviar múltiples solicitudes a la aplicación y esta responderá muchas simultáneamente. Ejecuto dos lotes de solicitudes simultáneas en la aplicación en ambos entornos. En Google App Engine, el primer lote y el segundo respondieron simultáneamente y el primero no bloqueó al segundo.

En Kubernetes, el servidor solo responde 6 simultáneamente y el primer lote bloquea el segundo. He leído algunas publicaciones sobre cómo lograr la concurrencia de Gunicorn con gevent o subprocesos múltiples, y todas dicen que necesito tener núcleos de CPU, pero el problema es que no importa cuánta CPU le ponga, la limitación continúa. Probé nodos de Google de 1VCPU a 8VCPU y no cambia mucho.

¿Pueden darme alguna idea sobre lo que posiblemente me estoy perdiendo? ¿Quizás la limitación de los nodos de Google Cluster?

Cascada de respuesta de Kubernetes

Como puede observar, el segundo lote solo comenzó a recibir respuesta después de que el primero comenzó a terminar.

ingrese la descripción de la imagen aquí

Cascada de respuesta de App Engine

ingrese la descripción de la imagen aquí

Configuración de Gunicorn

Probé con la clase estándar con la configuración recomendada: 2 * núcleos + 1 para y 12 subprocesos.

También probé gevent con --worker-connections 2000.

Ninguno de ellos marcó la diferencia. Los tiempos de respuesta fueron muy similares.

Mi sección contenedor de archivos de Kubernetes:

    spec:
      nodeSelector:
        cloud.google.com/gke-nodepool: default-pool
      containers:
      - name:  python-gunicorn
        image:  gcr.io/project-name/webapp:1.0
        command:
          - /env/bin/gunicorn
          - --bind
          - 0.0.0.0:8000
          - main:app
          - --chdir
          - /deploy/app
          #- --error-logfile
          #- "-"
          - --timeout
          - "7200"
          - -w
          - "3"
          - --threads
          - "8"
          #- -k
          #- gevent
          #- --worker-connections
          #- "2000"

Respuesta1

Publicar esto Community Wikipara una mejor visibilidad para la comunidad.

Desafortunadamente, no tengo toda la información para reproducir exactamente este escenario (diseño de la aplicación, cómo se ejecutaron las pruebas, entorno, etc.). Sin embargo, según el comentario de OP:

Resulta que con Kubernetes, la multitarea está al nivel del pod. En lugar de tener un pod grande con muchos subprocesos, puede tener muchos pods más pequeños ejecutándose. Podrías experimentar con ese interruptor.

Parece que OP en su GKEclúster usóHPAcon CPUyEscalado automático de clústersolución similar que se describió enAplicación Engine Flex || ¿Motor Kubernetes?artículo.

Lo importante que vale la pena mencionar es que muchos dependen detipos de escala.

información relacionada