低Apache/mod_wsgi吞吐量

5

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

def viewData(request):
    return Response("aaaaaaaaaa" * 120000) # return 1,2MB of data

在我的测试机器上,我获得了大约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)的当前版本,吞吐量没有显着变化。我还用spawning 0.9.5替换了apache的mod_proxy中的mod_wsgi-这将吞吐量提高了四倍,但仍远远没有达到我想要的水平。

这似乎不是一个非常有用的测试。你想要做什么?至少尝试对代码进行分析。如果您想通过mod_wsgi发送大型静态文件,则可以使用文件包装器扩展(http://code.google.com/p/modwsgi/wiki/FileWrapperExtension)。 - Nicholas Riley
1个回答

4
在WSGI中,应用程序或框架应该返回一个可迭代对象。不知道Pesto是否遵循这个规范。
请将您的代码更改为:
def viewData(request):
    return Response(["aaaaaaaaaa" * 120000])

请重新尝试。


成功了。似乎迭代一个只有一个元素的列表比逐个字符地迭代一百万个字符的字符串要快一点,;-) - Simon
@Simon - 不知道将响应主体包装成可迭代对象的责任是应用程序还是框架的责任,或者框架是否应该检查它是否已经被包装并继续包装它。我认为你应该在Pesto列表中讨论这个问题。 - Clodoaldo Neto
2
虽然字符串是可迭代的并且也是有效的响应,但是如上所示,性能会很差。为了检测常见的非最优迭代器的使用,可以使用WSGI中间件,参见'http://code.google.com/p/modwsgi/wiki/DebuggingTechniques#Poorly_Performing_Code'。显然,如果框架本身包装了可迭代对象并且循环在框架中进行,则可能无法突出显示问题。 - Graham Dumpleton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接