我正在尝试运行一个简单的 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/