mysql - Gunicorn 多线程与 MySQL

标签 mysql django multithreading gunicorn eventlet

我正在尝试运行一个简单的 NGnix + Gunicorn + Django + MySQL(AWS 上的 RDS)堆栈,但显然某些 MySQL 查询发生的任何情况都会减慢并锁定服务。

为了防止这种情况,我开始使用 eventlet(它也与 Celery 配合得很好),但是修补 MySQLdb 似乎会导致性能损失(2-3 倍响应时间)和不稳定(可能会在运行期间锁定所有数据库连接几秒钟)重新启动)。

具有相同逻辑的 Celery + eventlet 似乎工作得很好,那么我错过了什么?

try:
    import eventlet

    worker_class = 'egg:gunicorn#eventlet'
    worker_connections = 1000
    def do_post_fork(server, worker):
        eventlet.monkey_patch()
        eventlet.monkey_patch(MySQLdb=True)

    post_fork = do_post_fork
except ImportError as e:
    import logging
    logging.exception(e)
    pass

谢谢!

最佳答案

缓慢的查询不应减慢整个服务的速度。只应提出一项特定要求。其他工作人员能够满足其他请求。

您可以尝试仅使用大量单线程gunicorn worker 。它们会消耗大量内存,但这是最强大的解决方案。

我不是 AWS 专家,因此以下内容纯属猜测。

不幸的是,mysqldb 是 C 扩展,所以没有办法“正确”地修补它。相反,eventlet 使用线程池来使 mysqldb greenthread 友好。

Python3.3 之前的线程无缘无故地浪费大量 CPU 资源。所以你的性能问题可能是由于greenlet、Python线程和AWS虚拟化的兼容性不好造成的。再说一次,我不知道确切的原因,这只是猜测。

关于mysql - Gunicorn 多线程与 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18773894/

相关文章:

mysql - Docker容器仅在附加卷时停止运行

mysql - 使用 vba 的 MS-Access 前端中的 MySQL 存储过程的多个结果集?

python - 无法运行 django 项目下的 python 文件

python - 在 Divio 上为 Wagtail 应用程序部署静态文件

Django 表单缓存或重新加载问题

c - 从线程中的 stdin 读取以写入 c 中的文件

java - 编写多线程套接字代理: IOException SocketClosed where it shouldn't

c - 多线程随机数生成器在 initstate_r 函数中不断出现 SegFault

mysql - SQL 查询问题 - 未知列错误

php - 我需要将阿拉伯语数据存储到mysql中