Gunicorn与MySQL的多线程

时间:2013-09-12 20:36:56

标签: 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

谢谢!

1 个答案:

答案 0 :(得分:0)

慢查询不应该减慢整个服务的速度。只有一个特定的要求。其他工作人员可以提供其他请求。

你可以尝试使用很多单线程的gunicorn工作人员。它们会占用大量内存,但它是最强大的解决方案。

我不是AWS专家,所以以下是一个疯狂的猜测。

不幸的是,mysqldb是C扩展名,因此无法“正确”修补它。相反,eventlet使用线程池使mysqldb greenthread友好。

前Python3.3线程没有充分的理由浪费了大量的CPU资源。因此,您的性能问题可能是由于greenlet,Python线程和AWS虚拟化的兼容性差。再一次,我不知道确切的原因,这是一个猜测。