Gunicorn не отвечает более чем на 6 запросов за раз

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

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

Параллелизм

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

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

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

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

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

enter image description here

Каскад ответов App Engine

enter image description here

Конфигурация 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"
2
задан 18 April 2018 в 21:34
1 ответ

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

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

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

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

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

1
ответ дан 25 February 2021 в 15:29

Теги

Похожие вопросы