防止慢查询耗尽Gunicorn工作池
假设我们有一个比较典型的Django网页应用:
- 前面有一个Nginx,它负责做代理和提供静态内容
- 有一个gunicorn在启动工作进程来处理Django的请求
- 有一个基于Django的网页应用,做各种有趣的事情
- 有一个Redis服务器用来处理会话和缓存
- 有一个MySQL数据库来响应Django的查询
有些网址基本上只是渲染的Django模板,几乎没有查询,有些页面会从Redis获取一些信息。但是有几个页面需要进行比较复杂的数据库查询,这些查询在MySQL上执行时,经过各种优化后,可能需要几秒钟才能完成。
这就是我的问题——每当gunicorn的工作进程接到这样的重网址请求时,它就会暂时不处理其他请求,干等着数据库的回复。如果这样的查询很多,最终所有的工作进程都会闲着,等待这些重网址的响应,导致没有人来处理其他更快的页面。
有没有办法让工作进程在等待数据库回复时,去处理其他工作?或者在这种情况下,如何扩大工作进程的数量(最好不增加内存使用和数据库连接数 :))?至少有没有办法查看gunicorn池中有多少工作进程在忙碌,以及每个工作进程处理请求的时间?