我在 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 作为反向代理,这可能会改善后端响应,但如果进程导致大量等待线程,这仍然无济于事。