WSGI server - Gunicorn worker调度--timeout问题分析

前一段时间遇到一个问题,gunicorn在启动之后worker一直报timeout的错误,并且一直不断地重启。开始以为是worker内部遇到什么错误才导致gunicorn不断地重启worker。
先说一下配置,worker_class我们采用的是gevent,数据库连接采用的mysql+sqlalchemy。因为在app启动时需要连接很多个数据库,遇到这个问题就一直在纠结是不是程序的bug,数据库连接太多会有问题,但程序没有任何日志打出来啊!?但是将连接数据库的数量改小一点,就不会再出现worker重启的现象了。为什么数据库连接数变小就不会timeout了呢?是不是master觉得worker的启动时间太长了,过了一定时间就直接干掉并重启?后来将配置中的timeout改大,数据库连接数改为原来的值,问题解决!

为什么会这样?
看gunicorn源码:
    def run(self):
        servers = []
        ssl_args = {}

        if self.cfg.is_ssl:
            ssl_args = dict(server_side=True, **self.cfg.ssl_options)

        for s in self.sockets:
            s.setblocking(1)
            pool = Pool(self.worker_connections)
            if self.server_class is not None:
                environ = base_environ(self.cfg)
                environ.update({
                    "wsgi.multithread": True,
                    "SERVER_SOFTWARE": VERSION,
                })
                **server = self.server_class(
                    s, application=self.wsgi, spawn=pool, log=self.log,
                    handler_class=self.wsgi_handler, environ=environ,
                    **ssl_args)**
            else:
                hfun = partial(self.handle, s)
                server = StreamServer(s, handle=hfun, spawn=pool, **ssl_args)

            server.start()
            servers.append(server)

        while self.alive:
            **self.notify()**
            gevent.sleep(1.0)

重点在server初始化的过程中,由于数据库连接数量过多,这里耗费时间过久,self.notify在timeout时间内一直没有执行,导致主进程master在timeout时间过后立即回收并重启worker进程,所以会导致上面的问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值