项目页面上点一点,偶尔会出502报错,因为开发不怎么影响,之前一直没细查,今天测试开了issue出来,就抽空查了一下
结论
gunicorn同步模式启动的时候,可指定worker的timeout时间,默认是30s,根据官方文档和作者的解释,如果一个worker持续繁忙超过timeout时间,就会被kill掉,然后有新的子进程起来,但是当时触发了worker timeout的请求就502了。
参考
http://docs.gunicorn.org/en/stable/settings.html#timeout
https://github.com/benoitc/gunicorn/issues/1801#issuecomment-398661674
过程
1. nginx
既然nginx 502,先查nginx的log
时间对上以后,看的出来,access 502的时候,error log里也报错了,上游服务器关闭了连接,看来应该是后台服务的问题。
2. gunicorn
后台是用gunicorn启动的,查看gunicorn进程的log
继续查worker timeout是什么问题,而且这个log level是critical,官方文档:gunicorn timeout参数 ,找到了一个github上的issue,里面有owner的comment:timeout的生效方式,为什么level是critical,合起来解释了一下这个timeout时间的作用。当worker持续工作超过timeout时间后,就会被kill掉,新的子进程会起来,同步模式下建议设置大一点,异步模式没什么影响。
其他
还查了一下我们自己服务的log,发现这个时间点,没有收到请求,所以worker timeout直接导致触发timeout的那个请求被502了。
因为我们是同步启动的,先把timeout改成300了,观察一下。
还有个gevent和gunicorn和sqlalchemy共同使用的坑没填。