Apache mod_wsgi 调优

Apache mod_wsgi 调优

我在 webfaction 上有一个使用 apache + mod_wsgi 的 django 网站。

站点每分钟收到大约 1000 个请求。

但它会进行一些计算,因此请求大约需要 5-10 秒。

我使用以下配置

StartServers         2
MinSpareThreads      10
MaxSpareThreads      25
ThreadLimit          25
ThreadsPerChild      25
MaxClients           75
MaxRequestsPerChild   1000

threads=15 processes=12

问题是 CPU 使用率很高,而且处理一个简单的静态页面需要花费一些时间(不需要计算)(看起来 Apache 对请求进行了排队)。

所以我想要的是 Apache 能够快速接受请求。

我完全被参数的数量搞晕了,我也不太明白它们是什么意思。我们需要它们StartServers做什么MaxRequestWorkers

任何帮助和/或解释都将不胜感激。

我有 8GB 的​​ RAM。

Apache MPM 工作者。

mod_wsgi 4.4.21。

先感谢您。

答案1

StartServers是您启动时使用的服务器进程数,MaxRequestWorkers是每个进程的线程数。Webfaction 设置在多数情况下应该是合理的,尽管每分钟一千个请求可能需要一些调整,但可能主要在应用程序中。

在正常使用中httpd,会接收请求,将其传递给mod_wsgi并等待其返回,这应该是即时的,因此实际花费时间的是 Python 脚本正在执行的操作。httpd因此,您的工作线程处于等待状态,并且会随着请求的到来而建立,而其他请求正在处理中,因此如果您的线程被占用,即使是静态页面也会最终等待。

查看应用程序正在做什么并寻找解决方案。您可以使用memcached或类似方法缓存查询。如果您的应用程序处理请求所需的时间不可避免,请考虑使用消息队列使其异步,例如芹菜,因此,您可以使用浏览器端脚本轮询响应,而不是让您的 Web 服务器等待响应。

将静态页面服务与动态页面服务分开也会改善响应。如果可能的话,您可以运行多组工作程序,或者将静态页面和对象服务传递给nginx,这是处理 的更常见方式wsgi

tornado另一种方法是通过本机 Web 服务器(如或)提供 Python,gunicorn并使用 apache 作为反向代理,这可能会改善后端响应,但如果进程导致大量等待线程,这仍然无济于事。

相关内容