我正在尝试运行一个简单的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
谢谢!
答案 0 :(得分:0)
慢查询不应该减慢整个服务的速度。只有一个特定的要求。其他工作人员可以提供其他请求。
你可以尝试使用很多单线程的gunicorn工作人员。它们会占用大量内存,但它是最强大的解决方案。
我不是AWS专家,所以以下是一个疯狂的猜测。
不幸的是,mysqldb是C扩展名,因此无法“正确”修补它。相反,eventlet使用线程池使mysqldb greenthread友好。
前Python3.3线程没有充分的理由浪费了大量的CPU资源。因此,您的性能问题可能是由于greenlet,Python线程和AWS虚拟化的兼容性差。再一次,我不知道确切的原因,这是一个猜测。