低Apache/mod_wsgi吞吐量

Sim*_*mon 5 python apache mod-wsgi

我在pesto,mod_wsgi和Apache上运行了一个简单的WSGI应用程序:

def viewData(request):
    return Response("aaaaaaaaaa" * 120000) # return 1,2MB of data
Run Code Online (Sandbox Code Playgroud)

在我的测试机器上,我获得大约100kb/s的吞吐量,这意味着请求大约需要12秒才能完成.从同一个Apache实例下载静态文件给我大约20MB/s.为什么会有这么大的差异,我怎样才能加快WSGI应用程序的速度?

软件版本:Ubuntu 10.04,Apache 2.2.14,Python 2.6.5,mod_wsgi 2.6(所有Ubuntu的默认包),pesto-18

编辑:此示例表示的真实应用程序不会尝试发送静态文件,但会动态生成大量HTML.HTML生成发生快速(我跑它通过cProfile和timeit),但传输速度慢,我想解决这个特定的问题.

编辑2:我在同一堆栈上测试了当前版本的pesto(21)和mod_wsgi(3.3),吞吐量没有显着变化.我还将mod_wsgi替换为在apache的mod_proxy后面产生0.9.5 - 这使吞吐量增加了四倍,但距离我想要的还有几英里远.

Clo*_*eto 4

在 WSGI 中,应用程序或框架应该返回一个可迭代对象。不知道Pesto是不是就是这么做的。

将您的代码更改为:

def viewData(request):
    return Response(["aaaaaaaaaa" * 120000])
Run Code Online (Sandbox Code Playgroud)

然后再试一次。

  • 尽管字符串是可迭代的,也是有效的响应,但如图所示,性能会很差。有关检测常见非最佳迭代的使用的 WSGI 中间件,请参阅“http://code.google.com/p/modwsgi/wiki/DebuggingTechniques#Poorly_Performing_Code”。显然,如果框架正在包装可迭代本身并且因此循环位于框架中,那么这可能不会突出问题。 (2认同)