我们正在运行一个相当大的 Flask 应用程序,发现在随机时间我们会收到非常缓慢的请求(有时需要一分钟或更长时间)
我推测该问题与延迟加载模块有关,当需要启动或重新加载新工作进程时,请求会变得缓慢。(我们最初在 Apache + mod_wsgi 中遇到了这个问题,但后来决定尝试使用 uWSGI,因为它会预先分叉工作进程)。但是,即使重新加载也不一致。通常我可以重新加载,请求会慢一点,但并不明显。
我知道 Django 中有延迟加载功能,但据我从文档中了解,除非配置了 Flask,否则它不会执行此操作。我不知道为什么请求会持续这么慢。
更令人费解的是,我在负载均衡器后面的 EC2 上运行它(只有一个实例)。通过负载均衡器连接时遇到的问题似乎比直接连接时遇到的问题更多,但这又是随机的。通过负载均衡器的大多数请求不会增加超过 10ms 的时间。
以下是各种配置:
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 (由 Emperor 管理)
[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
编辑:我确实遇到过一件事,那就是保持活动超时设置可能会导致问题,而且挂起似乎比保持活动超时等待了几秒钟。这似乎有所帮助,但并没有完全解决问题,尤其是对于通过负载平衡器的请求。
答案1
弄清楚了这个问题:
问题在于 ELB 中的可用区域。我认为我必须将可用区域设置为与我的实例实际所在的位置相同,然后至少设置一个公共区域(实例所在的区域是私有区域)。
显然,实例的位置并不重要,只要可用区域全部为公共区域即可。在同一个可用区域中创建公共子网就能神奇地使其工作,即使实例本身位于私有子网上。