0

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

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

具有相同逻辑的 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

谢谢!

4

1 回答 1

0

慢查询不应该减慢整个服务。只有一个特定的请求应该是。其他工作人员能够满足其他请求。

您可以尝试仅使用大量单线程 gunicorn 工作者。他们会吃掉很多内存,但这是最强大的解决方案。

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

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

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

于 2013-09-13T14:15:17.983 回答