Cloud-init ограничивает трафик Gunicorn только несколькими работниками.Зачем? - PullRequest
0 голосов
/ 26 июня 2019

Я запускаю приложение Python Flask за Gunicorn на Ubuntu VM. Виртуальная машина Ubuntu размещена в Azure, и я использую сценарий cloud-init для установки приложения и запуска Gunicorn при создании экземпляра виртуальной машины.

Gunicorn запускается с 8 рабочими (рекомендуется для ВМ с 4 виртуальными ЦП). Однако сразу после инициализации виртуальной машины пропускная способность моей виртуальной машины ограничивается примерно 100 запросами в секунду.

Если я убью 8 рабочих Gunicorn, которые были запущены cloud-init, и сам запусту Gunicorn как суперпользователя (опять же 8 рабочих), то пропускная способность возрастет примерно до 900 запросов в секунду.

Я не могу сказать, какая разница между процессами Gunicorn, запускаемыми cloud-init, и процессами Gunicorn, запускаемыми superuser, за исключением того, что они показывают различное поведение под нагрузкой.

Вот скриншот top, когда виртуальная машина только что инициализирована и находится в состоянии стресса:

enter image description here

Вот скриншот top после того, как я убил рабочих Gunicorn и перезапустил их как суперпользователя:

enter image description here

Вы можете видеть, что для рабочих, порожденных облачным init, только некоторые процессы, по-видимому, получают какую-либо нагрузку, в то время как нагрузка равномерно распределяется между рабочими суперпользователя.

Ниже я сравню вывод ps для работников cloud-init и superuser.

облако инициализации:

enter image description here

суперпользователя:

enter image description here

Вывод ps показывает, что работники cloud-init действительно распределены по всем 4 виртуальным ЦП. Мне интересно, почему они ведут себя так, как будто лишь немногие из них получают трафик.

Вот содержимое моего облака-init.txt:

#cloud-config
package_upgrade: true
package_update: true
packages:
  - python3-pip
runcmd:
  - sudo -H pip3 install -U pipenv
  - cd /home/azureuser
  - git clone https://github.com/[user]/[repo].git
  - cd /home/azureuser/serve-stateful
  - pipenv install
  - pipenv run gunicorn -w 8 --bind "$(hostname -I):8034" gunicorn_server:app

1 Ответ

0 голосов
/ 26 июня 2019

Исправлена ​​проблема путем добавления флагов демона, пользователя и группы к моей команде запуска gunicorn:

pipenv run gunicorn -w 8 --bind "$(hostname -I):8034" gunicorn_server:app --user root --group root --daemon

Не уверен на 100% в деталях, но я думаю, что проблема заключается вчто работники gunicorn сохраняют наследование stdio, когда не запускаются в режиме демона: http://docs.gunicorn.org/en/stable/settings.html#enable-stdio-inheritance Все, что может записывать в stdio, может снизить производительность.

Интересно (и интересно!) отметить, что теперь количество запросов в секунду ушлодо 1368 в секунду, поскольку даже суперпользователи, которых я породил в моем вопросе выше, писали в stdio.

...