解决sqlchemy+gunicorn+nginx+mysql线上环境经常连接超时问题
解决sqlchemy+gunicorn+nginx+mysql线上环境经常连接超时问题
最近线上环境经常出现页面timeout,每刷新几次就timeout,真是烦死了。
首先排查日志,先看下supervisor日志
发现gunicorn经常重启,百度了一下,大概是一个请求30秒内没得到回应,gunicorn就会重启这个进程,不是特别明白哪里出问题了。。
猜想是不是sqlchemy和数据库之间出问题了,然后研究了一下sqlchemy的连接池等配置,也检查了代码是不是没关闭连接,检查完发现没毛病啊。。
然后在代码里加了些输出日志放在测试环境中跑,顺便打开了nginx日志,发现每次timeout时,nginx入口日志检测到了请求过来,但是输出日志并没什么反应,我勒个去。。请求都没走到代码里,难道是nginx配置出问题了?
然后研究了一下nginx的配置,什么event,upstream啥的,也都试了下,并没什么卵用,后来甚至还研究了TIME_WAIT和CLOSE_WAIT啥的,
最后还是把问题定位到nginx到gunicorn这段过程,最后终于在一篇博客中找到了希望,
博客地址:http://san-yun.iteye.com/blog/1890784
发现他们启动gunicorn加了-k gevent参数,原来gunicorn默认是用的同步阻塞的网络模型(-k sync),对于大并发的访问可能表现不够好,使用gevent异步模型性能会更好,
试了一下果然没有再出现timeout了。