资讯专栏INFORMATION COLUMN

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

xiaodao / 3726人阅读

摘要:前一段时间遇到一个问题,在启动之后一直报的错误,并且一直不断地重启。先说一下配置,我们采用的是,数据库连接采用的。

前一段时间遇到一个问题,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进程,所以会导致上面的问题。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38317.html

相关文章

  • Python Web开发最难懂的WSGI协议,到底包含哪些内容?

    摘要:通过回调函数将响应状态和响应头返回给,同时返回响应正文,响应正文是可迭代的并包含了多个字符串。返回响应正文负责获取请求,将请求传递给,由处理请求后返回。 我想大部分Python开发者最先接触到的方向是WEB方向(因为总是有开发者希望马上给自己做个博客出来,例如我),既然是WEB,免不了接触到一些WEB框架,例如Django,Flask,Torando等等,在开发过程中,看过一些文档总会...

    atinosun 评论0 收藏0
  • CentOS 下使用 Pipenv + Gunicorn + Supervisor 部署 Flask

    摘要:根据中华人民共和国信息产业部第十二次部务会议审议通过的非经营性互联网信息服务备案管理办法精神,在中华人民共和国境内提供非经营性互联网信息服务,应当办理备案。未经备案,不得在中华人民共和国境内从事非经营性互联网信息服务。 当我们开发了一个简单的 Flask 程序,想把项目部署上线,我们可以选择传统的部署方式或者云部署方式把项目部署上线。在本文中,笔者将使用 阿里云轻量应用服务器 安装 C...

    anyway 评论0 收藏0
  • Gunicron + gevent Mongodb数据库连接一直增加不释放

    摘要:解决过程关于什么是是一个上被广泛使用的高性能的。和大多数的框架兼容,并具有实现简单,轻量级,高性能等特点。为了解决这个问题,在实例化对象的时候要加上参数。参考用来,能否长连接连接从未发布和在上使用 问题描述 使用Flask开发的Web服务,部署在服务器上使用的是gunicorn manage:app -k gevent -w 4 某日告警,说浏览器崩了,当时急急忙忙的重启,...

    Yujiaao 评论0 收藏0
  • Gunicron + gevent Mongodb数据库连接一直增加不释放

    摘要:解决过程关于什么是是一个上被广泛使用的高性能的。和大多数的框架兼容,并具有实现简单,轻量级,高性能等特点。为了解决这个问题,在实例化对象的时候要加上参数。参考用来,能否长连接连接从未发布和在上使用 问题描述 使用Flask开发的Web服务,部署在服务器上使用的是gunicorn manage:app -k gevent -w 4 某日告警,说浏览器崩了,当时急急忙忙的重启,...

    Taste 评论0 收藏0

发表评论

0条评论

xiaodao

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<