Python 防止检查gunicorn工作池的慢速查询

Python 防止检查gunicorn工作池的慢速查询,python,mysql,django,redis,gunicorn,Python,Mysql,Django,Redis,Gunicorn,假设我们有一个相当典型的Django web应用程序: 在应用程序前面有一个Nginx在做代理和服务 静态内容 gunicorn正在启动工人来处理Django请求 有一个基于Django的web应用程序可以做各种有趣的事情 有一个用于会话/缓存的Redis服务器 有一个MySQL数据库服务于来自Django的查询 有些URL基本上只有一个呈现的Django模板,几乎没有查询,有些页面包含一些来自Redis的信息。但也有一些页面执行一些相当复杂的数据库查询,在MySQL端执行所有可能的优化可能需要

假设我们有一个相当典型的Django web应用程序:

在应用程序前面有一个Nginx在做代理和服务 静态内容 gunicorn正在启动工人来处理Django请求 有一个基于Django的web应用程序可以做各种有趣的事情 有一个用于会话/缓存的Redis服务器 有一个MySQL数据库服务于来自Django的查询 有些URL基本上只有一个呈现的Django模板,几乎没有查询,有些页面包含一些来自Redis的信息。但也有一些页面执行一些相当复杂的数据库查询,在MySQL端执行所有可能的优化可能需要几秒钟

这里是我的问题——每次gunicorn工作人员收到如此繁重的URL请求时,它都会在一段时间内不再为其他请求提供服务——它只是坐在那里等待数据库的响应。如果有足够多的此类查询,那么最终所有的工作人员都会无所事事地等待繁重的URL,而不会留下任何内容来服务其他更快的页面


在等待数据库回复时,是否有一种方法允许工作人员执行其他工作?或者在这种情况下以某种方式扩展工作池,最好不扩展RAM使用率和数据库连接计数:?至少有一种方法可以找出关于gunicorn池中有多少工作人员在忙以及他们每个人处理请求的时间长短的统计数据吗?

对于您的情况,一种简单的方法可能是增加工作人员的数量。建议的工作人数为2-4 x{NUM CPU}。根据负载和对站点的请求类型,这可能就足够了


如果增加工人数量还不够,下一步要研究的是使用异步工人文档。描述了更详细的配置选项。请注意,根据您选择使用的异步工作程序类型,您必须安装eventlet、gevent或tornado。

您是否尝试过使用gunicorn的异步工作程序类型?您可能还希望将数据库查询单独发布到Stackexchange,你可能会对一些你没有想到的优化感到惊讶。你可能会发现我的帖子很有趣。但是,由于没有适当的多线程选项,也没有在一个托管系统中垂直拆分应用程序的能力,gunicorn实际上是此类优化的糟糕选择。