gevent部署django(包含gunicron的gevent模式,其他的gevent模式) 太多数据库连接的问题

gunicron的坑,应该说是gevent的坑【注意要使用pymysql才能异步,但这个问题是不管pymyql或者mysqldb都会出现的】---如果使用gevent模式跑django,django的conn_max_age配置为None或者有时间的模式,那么gevent会在连接mysql的时候,遇到io阻塞就开连接,就算你的worker数量设置为4,也会开很多mysql连接,因为遇到io阻塞gevent就开协程,一个协程占一个数据库连接,成千上万个数据库连接。目前的解决办法有两个。
1. 将conn_max_age设置为0
2. gunicorn -w 8 --bind 0.0.0.0:8779 -k 'gevent' --max-requests 200 wsgi:application   
    就是配置 --max-requests 10,让一个worker跑10次就重启,就会关闭所有连接,这个值不能设置太大,太大数据库连接会太多。但是这样设置的话就会出现并发不高的情况,所以现在测试来看第一种方法比较好,除非找到第二种方法不会开很多mysql连接的方法才行
 
注意: 现在没有完美的办法解决这个事情,除非用mysql连接池,但好像gevent跑mysql的连接池,不会主动关闭连接
 
 
svn://xx.xx.xx.xx:xxxx/yxproject/usefulcode/test_celery   项目测试地址  docker 镜像在  df.xxxx.com下面, docker容器名git

分享到: 微信 更多