防止从操纵gunicorn工作人员池的慢查询

时间:2014-03-14 08:15:44

标签: python mysql django redis gunicorn

让我们说我们有一个相当典型的Django Web应用程序:

  • 在应用程序前面有一个Nginx做代理服务和服务 静态内容
  • 有枪手的首发工人来处理Django请求
  • 有基于Django的网络应用程序,可以做各种有趣的事情
  • 有一个用于会话/缓存的Redis服务器
  • 有一个MySQL数据库提供来自Django的查询

有些网址基本上只是一个几乎没有查询的渲染Django模板,有些网页包含了Redis的一些信息。 但是有一些页面可以执行一些相当复杂的数据库查询,这些查询可以(在所有可能的优化之后)在MySQL端执行几秒钟。

这就是我的问题 - 每当一个gunicorn工作者收到这样的 URL的请求时,它不再服务其他请求一段时间 - 它只是闲置在等待数据库回复。如果有足够的此类查询,那么最终所有工作人员都会闲置并等待 URL,而不会为其他更快的页面提供服务。

有没有办法允许工作人员在等待数据库回复时做其他工作?或者以某种方式扩大工作池在这种情况下(最好不要缩放RAM使用和数据库连接计数:))?至少有没有办法找出有关多少工人在枪炮池中忙碌的统计数据以及他们每个人处理请求的时间长短?

1 个答案:

答案 0 :(得分:0)

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

下一步看看越来越多的工作人员是否足够,将考虑使用异步工作者(关于它的文档here)。更详细的配置选项描述为here。请注意,根据您选择使用的异步工作者的类型,您必须安装eventlet,gevent或tornado。