gevent解决gunicorn大访问时出现卡顿的问题
2017-06-22 本文已影响465人
晓函
当你的web网站一个很普通的动态页面都很卡,但是静态图片却不卡,云服务器CPU也不高,那么就是gunicorn阻塞了导致的,可能同时连接的人太多了,这个时候就需要使用gevent来配合使用了。
最近总是发生这种情况,一个什么都没有的动态页面也要20秒才能打开。
以前是尝试重启服务器等,能恢复正常,后来重启服务器也不行了,看来还是要解决问题,这时候想到gunicorn不是异步的,就打算试试使用gevent异步模式。
第一步、用pip安装gevent库
source /var/virtualenvs/mysite_venv/bin/activate
pip install gevent
第二步、修改gunicorn配置文件
cd /mnt/www/mysite
vi gunicorn.conf
最后一行加上gevent模式,整个文件内容如下
# 进程为5
workers = 5
# 监听本地8000端口,之后这个端口来的就是看这个网站的。
bind = '127.0.0.1:8000'
#搭配gevent使用
worker_class="gevent" #sync, gevent,meinheld
保存后 重启gunicorn,我是用supervisor,所以直接
···
supervisorctl reload
···
这样就生效了,很简单吧。其他地方都不需要修改,就上面简单两步搞定。
gevent模式启用后瞬间秒开网站。
副作用:连接池超限
如果网站需要访问数据库,请慎用gevent,因为SqlAlchemy还是阻塞的,这样只会导致数据库连接数疯狂增加,从而超出连接池数量,然后所有要访问数据库的页面都会打不开了。
代码报错:
sqlalchemy.exc.TimeoutError: QueuePool limit of size 10 overflow 10 reached,
症状:
静态文件打得开,不访问数据库的页面秒开,要访问数据库的页面打不开
生产环境应用结果
实际解决问题:2个系统(短链接和合伙人系统)
未解决问题:1个系统(喵主站,产生上面提到的副作用)