防止慢查询耗尽Gunicorn工作池

6 投票
1 回答
3088 浏览
提问于 2025-04-17 22:16

假设我们有一个比较典型的Django网页应用:

  • 前面有一个Nginx,它负责做代理和提供静态内容
  • 有一个gunicorn在启动工作进程来处理Django的请求
  • 有一个基于Django的网页应用,做各种有趣的事情
  • 有一个Redis服务器用来处理会话和缓存
  • 有一个MySQL数据库来响应Django的查询

有些网址基本上只是渲染的Django模板,几乎没有查询,有些页面会从Redis获取一些信息。但是有几个页面需要进行比较复杂的数据库查询,这些查询在MySQL上执行时,经过各种优化后,可能需要几秒钟才能完成。

这就是我的问题——每当gunicorn的工作进程接到这样的网址请求时,它就会暂时不处理其他请求,干等着数据库的回复。如果这样的查询很多,最终所有的工作进程都会闲着,等待这些网址的响应,导致没有人来处理其他更快的页面。

有没有办法让工作进程在等待数据库回复时,去处理其他工作?或者在这种情况下,如何扩大工作进程的数量(最好不增加内存使用和数据库连接数 :))?至少有没有办法查看gunicorn池中有多少工作进程在忙碌,以及每个工作进程处理请求的时间?

1 个回答

2

一个简单的方法,可能对你有帮助,就是增加工作进程的数量。一般推荐的工作进程数量是你电脑CPU数量的2到4倍。根据你网站的访问量和请求类型,这个数量可能就足够了。

如果增加工作进程后还是不够,那你可以考虑使用异步工作进程(关于这方面的文档可以在这里找到)。更详细的配置选项可以在这里查看。需要注意的是,选择不同类型的异步工作进程时,你可能需要安装eventlet、gevent或tornado其中之一。

撰写回答