Um Ihnen etwas Kontext zu geben:

Um Ihnen etwas Kontext zu geben:

Um Ihnen etwas Kontext zu geben:

Ich habe zwei Serverumgebungen, auf denen dieselbe App läuft. Die erste, die ich aufgeben möchte, ist eine Standardumgebung von Google App Engine, die viele Einschränkungen hat. Die zweite ist ein Google Kubernetes-Cluster, auf dem meine Python-App mit Gunicorn läuft.

Parallelität

An den ersten Server kann ich mehrere Anfragen an die App senden und sie wird viele davon gleichzeitig beantworten. Ich führe zwei Batches gleichzeitiger Anfragen an die App in beiden Umgebungen aus. Bei Google App Engine wurden der erste und der zweite Batch gleichzeitig beantwortet und der erste blockierte den zweiten nicht.

Bei Kubernetes antwortet der Server nur auf 6 gleichzeitige Anfragen, und der erste Batch blockiert den zweiten. Ich habe einige Beiträge darüber gelesen, wie man Gunicorn-Parallelität mit Gevent oder mehreren Threads erreicht, und alle sagen, dass ich CPU-Kerne brauche, aber das Problem ist, dass die Einschränkung bestehen bleibt, egal wie viele CPUs ich einsetze. Ich habe Google-Knoten von 1 VCPU bis 8 VCPU ausprobiert und es ändert sich nicht viel.

Könnt ihr mir sagen, was ich möglicherweise übersehe? Vielleicht die Knotenbeschränkung von Google Cluster?

Kubernetes-Antwort-Wasserfall

Wie Sie bemerken, wurde auf den zweiten Stapel erst geantwortet, als der erste bereits zu Ende war.

Bildbeschreibung hier eingeben

Wasserfall für App Engine-Antworten

Bildbeschreibung hier eingeben

Gunicorn-Konfiguration

Ich habe es sowohl mit der Standardklasse als auch mit der empfohlenen Einstellung versucht: 2 * Kerne + 1 für und 12 Threads.

Ich habe auch gevent mit ausprobiert --worker-connections 2000.

Keiner von ihnen machte einen Unterschied. Die Reaktionszeiten waren sehr ähnlich.

Mein Kubernetes-Dateicontainerabschnitt:

    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"

Antwort1

Ich poste dies Community Wiki, damit es für die Community besser sichtbar ist.

Leider verfüge ich nicht über alle Informationen, um dieses Szenario genau zu reproduzieren (Anwendungsdesign, Art und Weise der Testausführung, Umgebung usw.). Basierend auf dem Kommentar des OP gilt jedoch:

Es stellt sich heraus, dass Multitasking bei Kubernetes auf Pod-Ebene erfolgt. Anstatt einen großen Pod mit vielen Threads zu haben, können Sie viele kleinere Pods laufen lassen. Sie könnten mit diesem Wechsel experimentieren.

Es sieht so aus, als ob OP in seinem GKECluster verwendet hatHPAmit CPUundAutomatische Skalierung von Clusternähnliche Lösung, die beschrieben wurde inApp Engine Flex || Kubernetes Engine — ?Artikel.

Wichtig zu erwähnen ist, dass vieles davon abhängtSkalierungsarten.

verwandte Informationen