资讯专栏INFORMATION COLUMN

Gunicron + gevent Mongodb数据库连接一直增加不释放

Taste / 1274人阅读

摘要:解决过程关于什么是是一个上被广泛使用的高性能的。和大多数的框架兼容,并具有实现简单,轻量级,高性能等特点。为了解决这个问题,在实例化对象的时候要加上参数。参考用来,能否长连接连接从未发布和在上使用

问题描述

使用Flask开发的Web服务,部署在服务器上使用的是gunicorn manage:app -k gevent -w 4

某日告警,说浏览器崩了,当时急急忙忙的重启,搞好了,因为所有的服务都正常运行,后面查看日志,也没有发现什么特别的地方,最终感觉因该是MongoDB连接数满了,本地测试发现确实是连接数一直增加,不会释放。


解决过程 关于Gunicron

什么是Gunicron:是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server。和大多数的web框架兼容,并具有实现简单,轻量级,高性能等特点。

深入理解uwsgi和gunicorn网络模型

为什么要使用Gunicron:用于接受http请求并转换为WSGI协议,以供实现了WSGI协议的flask使用,并且gunicorn得益于gevent等技术,大幅度提高了性能,在生产环境以替代框架自带的WSGI server。

生产环境

配置

gevent==1.3.6
greenlet==0.4.14
gunicorn==19.9.0
pymongo==3.7.0

mongodb连接代码

    def __init__(self):
        config_name = os.getenv("FLASK_CONFIG") or "default"
        base_config = config[config_name]  # object
        self.client = MongoClient(host=base_config.MONGO_HOST, port=base_config.MONGO_PORT)
        db_name = base_config.MONGO_NAME
        self.db = self.client[db_name]
修改方案

参考pymongo: MongoClient opened before fork错误排解

fork是启动新进程的方法,由于MongoClient不是进程安全的,所以不可以将该实例从父进程中复制到子进程当中。在这个flask应用中,flask使用gunicorn作为网关接口,在启动的时候会启动一个主进程和多个子进程,也就是master/workers,这个时候就出现了MongoClient实例在进程之间的传递。

为了解决这个问题,在实例化MongoClient对象的时候要加上connect=False参数。

    def __init__(self):
        config_name = os.getenv("FLASK_CONFIG") or "default"
        base_config = config[config_name]  # object
        self.client = MongoClient(host=base_config.MONGO_HOST, port=base_config.MONGO_PORT, maxIdleTimeMS=300000, connect=False)
        db_name = base_config.MONGO_NAME
        self.db = self.client[db_name]
参考

用gevent来host wsgi server,mysql能否长连接

python – Mongo连接从未发布 – Django和Mongoengine在gevent上使用gunicorn

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

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

相关文章

  • Gunicron + gevent Mongodb据库连接一直增加释放

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

    Yujiaao 评论0 收藏0
  • Flask+python3+supervisor+redis+docker+nginx技术架构web

    摘要:总结本次镜像化大概花了一周的时间,包括测试和解决一些坑,很多知识点包括原来的项目都不是太熟悉,所以记录一下,可能回头会发现这些很,但是相信对一些人还是有用的。 背景 手里有一个web项目,代码按照前端代码库、后端代码库分别在GitHub上,分散带来的结果是,不容易持续集成,比如你可能需要很多的job去保证一个项目的正常运作,但是这个项目也不是特别大,所以尝试将代码融合,于此同时将代码d...

    susheng 评论0 收藏0
  • Flask+python3+supervisor+redis+docker+nginx技术架构web

    摘要:总结本次镜像化大概花了一周的时间,包括测试和解决一些坑,很多知识点包括原来的项目都不是太熟悉,所以记录一下,可能回头会发现这些很,但是相信对一些人还是有用的。 背景 手里有一个web项目,代码按照前端代码库、后端代码库分别在GitHub上,分散带来的结果是,不容易持续集成,比如你可能需要很多的job去保证一个项目的正常运作,但是这个项目也不是特别大,所以尝试将代码融合,于此同时将代码d...

    mo0n1andin 评论0 收藏0
  • Flask+python3+supervisor+redis+docker+nginx技术架构web

    摘要:总结本次镜像化大概花了一周的时间,包括测试和解决一些坑,很多知识点包括原来的项目都不是太熟悉,所以记录一下,可能回头会发现这些很,但是相信对一些人还是有用的。 背景 手里有一个web项目,代码按照前端代码库、后端代码库分别在GitHub上,分散带来的结果是,不容易持续集成,比如你可能需要很多的job去保证一个项目的正常运作,但是这个项目也不是特别大,所以尝试将代码融合,于此同时将代码d...

    Jioby 评论0 收藏0
  • mongo连接分析

    摘要:本文旨在梳理这些问题,进行一个全面的分析。等到进行数据库操作的时候,再去中获取一个连接,进行操作总结通过以上分析,对于以下的数据库连接池与关系型数据库连接池并无区别。 摘要 在前面的文章中有分析过关系型数据库的连接,以及连接池的原理。在mongo数据库同样存在,经常看到有网友在问mongo 连接了数据库要不要关,怎么关。内置的数据库连接池是单线程还是多线程,mongo服务器为什么会杀游...

    yuanxin 评论0 收藏0

发表评论

0条评论

Taste

|高级讲师

TA的文章

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