我目前使用mod_wsgi和python 2.7.10在Windows上使用web2py运行apache。我注意到的是当我有并发连接时,每个请求的响应时间增加。这种增加可能从1连接的20ms到5个并发连接的200ms。如果我最多连接20个并发连接,则响应时间为800毫秒 - 请求的响应时间仅为545 B。
添加像nginx这样的前端有助于解决这个问题,还是可以在apache配置中更改某些内容?
我当前的apache配置限制是:
Threadlimit 100
ThreadsPerChild 100
MaxRequestsPerChild 10000
AcceptFilter http none
AcceptFilter https none
KeepAlive On
正在执行的代码是:
使用Javascript:
$(function () {
function refresh(){
$.get('/database/domath_stuff', {num:document.getElementById('mathstuff').innerHTML}, function (response) {
document.getElementById('mathstuff').innerHTML = response
})
}
window.setInterval(refresh, 1000);
});
python是:
def domath_stuff():
number = int(request.vars.num)
number = number + 1
return number
答案 0 :(得分:1)
nginx通常比Apache快,但是使用低请求服务器几乎不重要。为什么会发生这种情况有很多不同的原因;这是一个非常常见的事情,被称为瓶颈。最简单的解释是,您的应用程序消耗更多资源并接受比服务器能够处理的更多并发事务,但由于您的请求非常低,您可以一方面计算它们,显而易见的答案是:您的应用程序很慢。 / p>
答案 1 :(得分:0)
nginx服务器,正如其他人所建议的那样,如果问题在你的Python代码中,那么根本不会有帮助。这是因为请求不是在nginx中处理的,而是您正在使用的单独的Python Web托管机制。
由于应用程序或框架中某些资源的错误锁定导致请求处理序列化,因此Python应用程序中可能会出现问题。由于Python全局解释器锁定,CPU绑定任务也可能导致问题。
由于Apache MPM配置不佳,您可能会加剧问题。您的线程指令值不一致。 1000的ThreadsPerChild
错误,大于Threadlimit
。由于Python GIL问题,在Python应用程序中使用大量线程也是一个坏主意。人们会倾向于少量的线程和多个进程。
不幸的是,您使用的是Windows,这是一个运行Python Web应用程序的非常糟糕的平台。您的Apache无法处理多个进程。
根据您用于测试的HTTP客户端,使用KeepAlive
也可能使事情变得复杂并导致请求序列化。
答案 2 :(得分:0)
使用Graham的反馈,我切换到IIS,现在我正在获得20个并发连接< 200毫秒的响应时间,这对我的需求是好的。我在设置IIS时遵循了web2py文档,因此对于遇到同样问题的人来说,它是“开箱即用”的配置。