Appengine,Python27性能下降

26 投票
6 回答
1587 浏览
提问于 2025-04-17 07:28

我想在App Engine上测试python27,所以把我的应用从python25迁移过去了。结果每次请求的性能下降了超过2倍!于是我又回到了python25,性能又恢复到了之前的水平。这里有一张图:

在这里输入图片描述 (每个请求的毫秒数)(cgi处理器 python 27,然后是python25)

我的应用使用了WerkzeugJinja2,而且使用了很多memcache。是什么原因导致性能下降这么严重?还是说只是因为python2.7在App Engine上还处于测试阶段?

关于应用的一些细节:

这其实是一个相当简单的在线商店。虽然有一些延迟任务是生成pdf的,但这些对整体性能影响不大,因为首页的访问量最大。几乎所有的数据都存储在缓存中。用python 2.5加载一个页面,空缓存的情况下大约需要0.8秒。没有缓存的页面加载时间很长,主要是因为有很多数据库查询。缓存的页面加载时间在60到100毫秒之间。平均加载时间大约是150毫秒。而用python 2.7时,性能就很糟糕。没有缓存的页面加载时间超过2秒。缓存的页面加载时间在200毫秒以上。

不幸的是,我没有任何性能分析的数据,无法确切知道在python 2.7中是什么导致了速度变慢。

我收集的页面加载时间数据来自一个实时页面,这个页面大约每秒处理10个请求,而一个python25实例轻松应对这个负载。

我还测试了python 2.7与wsgi和threadsafe:yes的组合,但与python 2.7和cgi相比,性能提升不大。

6 个回答

3

你有没有把你的应用程序迁移到使用WSGI,而不是在Python 2.7上使用CGI呢?

有可能CGI接口其实只是WSGI的一个包装,现在在2.7版本中可以使用。

5

Python 2.7 目前还处于实验阶段。这意味着它还没有经过像 Python 2.5 那样的性能优化和调整。

17

我在Usenet上看到过谷歌的一句话:“Python 2.7的运行速度在某些情况下比Python 2.5慢,而在其他情况下又更快。我们现在不打算公开原因。”看起来到目前为止,没人找到2.7比2.5快的情况,所以……

我对此的理解是:

  1. 谷歌知道存在性能问题。
  2. 他们不确定该如何解决这个问题。

我的性能分析显示,Python 2.7的多线程应用大约有35%的时间花在{method 'acquire' of 'thread.lock' objects}上,而这似乎发生在谷歌的RPC代码中。此外,还有迹象表明,导入模块时存在严重的锁定问题。

基本上,你对此无能为力,只能等待AppEngine来修复这个问题。有关性能下降的详细信息,可以参考这份全面的文档

以下因素几乎可以肯定不会对这个问题产生重大影响:

  • 上传pyc文件(GAE的基础设施会为你处理这个)
  • 服务器配置(GAE的规模非常庞大,即使在封闭测试中,2.7也很慢)
  • WSGI与CGI(这并不能解释如此巨大的性能下降)

让人不爽的是,谷歌在两次价格上涨中告诉我们:“使用多线程的Python 2.7,你可以运行得更有效,所以新价格看起来并不那么糟糕。”不幸的是,Python 2.7的运行环境仍然被标记为“实验性”,并没有提供生产级别的性能。

撰写回答