GoogleAppEngine 上的 Django:性能指南
Posted
技术标签:
【中文标题】GoogleAppEngine 上的 Django:性能指南【英文标题】:Django on GoogleAppEngine: performance howto 【发布时间】:2012-04-14 01:30:32 【问题描述】:几周前我问过this question。今天我实际上已经编写并发布了一个标准的 Django 应用程序,即由Google CloudSQL 支持的全功能关系数据库支持(因此也是全功能 Django 管理员)。唯一一次我不得不偏离标准的 Django 方式是发送电子邮件(必须以 GAE 方式进行)。我的设置是GAE 1.6.4
、Python2.7
、Django 1.3
,在app.yaml
中使用以下内容:
libraries:
- name: django
version: "1.3"
但是,我确实需要您提出明确的可操作步骤,以改善此 Django 应用程序冷时初始请求的响应时间。我在 GAE 上有一个简单的 webapp2
网站,它不 访问数据库,当 冷 时响应时间为 1.56s
。 Django 在冷时使用 2 个查询(两个 count(*)
查询每个包含少于 300 行的表)访问数据库,响应时间为 10.73s
!不鼓励主页;)
想到的事情是删除我不需要的 middleware
类和其他特定于 Django 的优化。然而,从 GAE 的角度来看也能改进事情的技巧会非常有用。
注意我不希望这成为关于在 GAE 上选择 Django 的优点的讨论。我可以提一下,我个人的 Django 专业知识,以及由此产生的开发效率,确实对采用 Django 而不是其他框架产生了很大影响。此外,使用 CloudSQL,很容易摆脱 GAE(希望不会!),因为 Django 代码只需很少(或无需)修改即可在其他任何地方工作。相关讨论可以在here和here找到。
【问题讨论】:
应用暖机时首页的响应时间是多少? 你已经分析了什么? @DanielRoseman 平均在200ms
标记附近,非常好。
好吧,一个好的开始是识别和删除那些计数查询。另外,您是否启用了预热请求?
@JosvicZammit 正确 - 它允许系统在后台启动一个新实例,因此您的用户不会看到很长的启动时间。
【参考方案1】:
我没有完整的答案,但我正在做出贡献,因为我也想找到解决方案。我目前正在使用一个正在运行的 cron 作业(我实际上需要 cron 作业,所以它不仅仅是为了让我的应用程序保持活力)。
我在 GAE/Python/Django 相关邮件列表之一中看到过,与 webapp 相比,加载所有 Django 文件所需的时间很重要,因此删除不使用的 django 组件from deployment 也应该可以改善您的启动时间。通过删除 contrib 文件夹的某些部分,我已经能够减少大约 3 秒。我将它们排除在我的 app.yaml 中。
我的启动时间仍然在 6 秒左右(完整应用程序、Django-nonrel、HRD)。当我的应用程序更简单时,它曾经更像是 4。
我怀疑 Django 在启动时会验证其所有模型,并且处理时间很长。如果您有时间尝试使用绝对 0 模型的应用程序,我会很好奇它是否会产生任何影响。
我也很好奇您的两个初始查询是否会产生重大影响。
【讨论】:
预热请求是为此而设计的 - 不需要 cronjob 来做。 @dragonx 问题必须与 Django 很重并查询 CloudSQL... 与 WebApp2 一样,当 cold 时它总是以 ~2s 标记响应。我正在做一些调整/改进会让你知道结果。 @NickJohnson 我专注于 django-only 优化,通过删除 django-admin 在生产实例上的启用。根据应用程序是在生产中运行还是在本地运行,我设置了 Django 设置变量DEBUG
,现在如果我在本地运行,我还添加到MIDDLEWARE_CLASSES
和INSTALLED_APPS
。我还删除了大约 600Kb 的 Django 管理静态媒体(它们在生产中是 not available automatically)。这些 Django-focuse 调整改进了我在 cold 时的响应时间,从上面的 ~10 秒到 ~5 秒。
@NickJohnson 下一步是删除命中 CloudSQL 的查询。我删除了我的 2 个count(*)
查询。现在响应时间总是~3s。
Josvic,我怀疑大部分时间只是磁盘加载时间。仅我的 Django 文件夹就有 30MB,加载需要时间(webapp2 小得多)。因此,您不仅要从 INSTALLED_APPS 中删除多余的东西,而且根本不希望从磁盘中读取它们。尝试使用 app.yaml 中的“skip_files:”指令尽可能多地排除 django/contrib。 @NickJohnson:无论如何,我需要一个 cron 作业来清除超时请求(特定于我的应用程序),所以这是一个奖励。【参考方案2】:
当没有实例运行时,例如版本升级后或者15分钟没有请求,那么一个请求会触发一个实例的加载,大约需要10s。所以你看到的是正常的。
因此,如果您的应用空闲时间超过 15 分钟,您将看到此行为。一种解决方法是让cron 作业每 10 分钟 ping 一次您的实例(尽管我相信 google 不喜欢这样)。
更新:
您可以通过启用计费来避免这种情况,然后在 GAE 管理员中的“应用程序设置”下将 minimum
空闲实例设置设置为 1。注意:min
设置不适用于免费应用程序,仅适用于 max
。
【讨论】:
所以这和this 是一样的问题...但是webapp2
应用程序为什么不会发生这种10s
热身?
不知道。我在我的 java 测试应用程序上看到它。以上是关于GoogleAppEngine 上的 Django:性能指南的主要内容,如果未能解决你的问题,请参考以下文章
带有 jquery 的 Django 模板:现有页面上的 Ajax 更新
Google App Engine 上的 Django-nonrel,出现错误我正在使用 Django 0.96
带有 if 语句的 Google App Engine 上的 Django 模板
Django - App Engine 上的独角兽。错误:“没有名为 my_project 的模块”