Просто добавляю свой собственный недавний опыт в @ matino's answer . Приложения WSGI также могут получить пользу от asyn c работников. Я добавлю несколько пунктов о async workers
и connection pools
здесь.
Недавно мы столкнулись с некоторыми похожими проблемами в нашей продукции. Наш трафик c прыгнул с парашютом через 1-2 дня, и все запросы по какой-то причине были забиты. Мы использовали gunicorn с gevent
asyn c работниками для нашего django
приложения. Оказалось, что psql соединения были причиной того, что многие запросы были остановлены (и в конечном итоге истекли).
Рекомендуемое число одновременных запросов - (2*CPU)+1
. Таким образом, в сценарии syn c ваши вычисления будут выглядеть так: (workers_num * threads_num) <= (2 * cores_num) + 1
И вы получите (workers_num * threads_num)
макс. Подключений к вашей базе данных. (скажем, все запросы имеют db-запросы). Поэтому вам нужно будет установить для вашего параметра psql pool_size
значение, превышающее это число. Но когда вы используете asyn c работники, расчеты будут немного другими. Посмотрите на эту команду gunicorn:
gunicorn --worker-class=gevent --worker-connections=1000 --workers=3 django:app
В этом случае максимальное количество одновременных запросов может составить до 3000
запросов. Поэтому вам нужно установить pool_size
на значение, большее 3000
. Если ваше приложение связано с вводом-выводом, вы получите лучшую производительность с работниками asyn c. Таким образом, вы сможете более эффективно использовать свой ЦП.
А что касается пула соединений, когда вы используете решение, подобное PgBouncer
, вы все время избавляетесь от накладных расходов на открытие и закрытие соединений. Так что это не повлияет на ваше решение о настройке pool_size
. Эффекты могут быть не заметны при низких трафиках, но это будет необходимо для обработки более высоких скоростей трафика c.