Чтобы дать вам некоторый контекст:

Чтобы дать вам некоторый контекст:

Чтобы дать вам некоторый контекст:

У меня есть две серверные среды, на которых запущено одно и то же приложение. Первая, от которой я собираюсь отказаться, — это стандартная среда Google App Engine, имеющая множество ограничений. Вторая — кластер Google Kubernetes, на котором запущено мое приложение Python с Gunicorn.

Параллелизм

На первом сервере я могу отправить несколько запросов в приложение, и оно ответит на многие из них одновременно. Я запускаю два пакета одновременных запросов к приложению в обеих средах. В Google App Engine первый и второй пакеты были отвечены одновременно, и первый не блокировал второй.

В Kubernetes сервер отвечает только 6 раз одновременно, и первый пакет блокирует второй. Я читал несколько постов о том, как добиться параллелизма Gunicorn с помощью gevent или многопоточности, и все они говорят, что мне нужны ядра CPU, но проблема в том, что независимо от того, сколько CPU я в него вставляю, ограничение сохраняется. Я пробовал узлы Google от 1VCPU до 8VCPU, и это не сильно изменило ситуацию.

Можете ли вы, ребята, подсказать мне, что я упускаю? Может быть, ограничение узлов Google Cluster?

Водопад ответов Kubernetes

Как вы можете заметить, на вторую партию начали отвечать только после того, как первая партия начала заканчиваться.

введите описание изображения здесь

Водопад ответов App Engine

введите описание изображения здесь

Конфигурация Gunicorn

Я пробовал как стандартный класс с рекомендуемой настройкой: 2 * ядра + 1 для, так и 12 потоков.

Я также пробовал gevent с --worker-connections 2000.

Ни один из них не имел значения. Время отклика было очень похожим.

Мой раздел контейнера файлов 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"

решение1

Публикую это Community Wikiдля лучшей видимости для сообщества.

К сожалению, у меня нет всей информации, чтобы точно воспроизвести этот сценарий (дизайн приложения, как проводились тесты, окружающая среда и т. д.). Однако, основываясь на комментарии OP:

Оказывается, в Kubernetes многозадачность находится на уровне пода. Вместо того, чтобы иметь один большой под со множеством потоков, вы можете иметь много меньших подов, работающих. Вы можете поэкспериментировать с этим переключением.

Похоже, что ОП в своем GKEкластере использовалHPAс CPUиАвтомасштабирование кластерааналогичное решение, которое было описано вApp Engine Flex || Kubernetes Engine — ?статья.

Важно отметить, что многое зависит оттипы масштабирования.

Связанный контент