Я запускаю приложение 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
, когда виртуальная машина только что инициализирована и находится в состоянии стресса:
Вот скриншот top
после того, как я убил рабочих Gunicorn и перезапустил их как суперпользователя:
Вы можете видеть, что для рабочих, порожденных облачным init, только некоторые процессы, по-видимому, получают какую-либо нагрузку, в то время как нагрузка равномерно распределяется между рабочими суперпользователя.
Ниже я сравню вывод ps
для работников cloud-init и superuser.
облако инициализации:
суперпользователя:
Вывод 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