Мы запускаем довольно большое приложение Flask и обнаруживаем, что в случайное время мы получаем очень медленный запрос (иногда на минуту или больше)
Я предполагаю, что проблема связана с ленивой загрузкой модулей, а медленные запросы возникают, когда новый рабочий должен запускаться или перезагружаться. (Изначально у нас была эта проблема с Apache + mod_wsgi, но вместо этого мы решили попробовать uWSGI, поскольку он предварительно форкнул рабочих). Однако даже с перезарядкой это не выдержало. Часто я могу перезагрузить, и запросы выполняются немного медленнее, но незначительно.
Я знаю, что ленивая загрузка - это вещь в Django, но, как я понимаю из документации, Flask не делает этого, если он не настроен на. Я не понимаю, почему запросы остаются такими медленными.
Чтобы добавить к тайне, я запускаю это на EC2 за балансировщиком нагрузки (только с одним экземпляром). Кажется, у меня больше проблем при подключении через балансировщик нагрузки, чем при прямом подключении, но опять же случайное. Большинство запросов через балансировщик нагрузки не добавляют более 10 мс.
Вот различные конфигурации:
nginx:
server {
listen 80;
server_name dev.mysite.net
root /var/www/mysite;
location / {
include uwsgi_params;
uwsgi_pass unix:/var/run/uwsgi/mysite.sock;
}
}
uWSGI (управляемый императором)
[uwsgi]
base = /usr
app = my_app.py
pythonpath = /usr/lib/python2.7
pythonpath = /usr/lib/python2.7/site-packages
pythonpath = /usr/lib/python2.7/dist-packages
pythonpath = /var/www/mysite
socket = /var/run/uwsgi/%n.sock
module = %(app)
callable = app
logto = /var/log/uwsgi/%n.log
workers=10
enable-threads = 1
РЕДАКТИРОВАТЬ: Одна вещь, с которой я столкнулся, заключалась в том, что настройки тайм-аута сохранения активности могут вызвать проблемы, и кажется, что зависание ждало на несколько секунд больше, чем таймаут сохранения активности. Похоже, это помогло, но не решило полностью, особенно при запросах через балансировщик нагрузки.
Выяснил эту проблему:
Проблема заключалась в зонах доступности в ELB. Я думал, что мне нужно установить такую же зону доступности, где на самом деле находится мой экземпляр, а затем хотя бы одну публичную зону (зона, в которой находится экземпляр, является частной).
Очевидно, где находится экземпляр, не имеет значения, просто все зоны доступности должны быть общедоступными. Создание общедоступной подсети в той же зоне доступности волшебным образом заставило ее работать, даже если сам экземпляр находится в частной подсети.