gevent解决gunicorn大访问时出现卡顿的问题

当你的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个系统(喵主站,产生上面提到的副作用)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,205评论 19 139
  • 来源:陶邦仁 链接:http://my.oschina.net/xianggao/blog/524943 0 系列...
    meng_philip123阅读 3,571评论 0 65
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,192评论 25 709
  • 晨读概要 身处一个仿佛任何信息都唾手可得的时代,看起来似乎很幸福。 外事不决问谷歌,内事不决问百度。我们不知道的东...
    一半一半zyh阅读 131评论 0 3
  • 来自sunnyxx的技术博客文章 最近总结了几个 Xcode 小技巧,在微博上(@我就叫Sunny怎么了)都发过,...
    难却却阅读 362评论 0 0