【问题标题】:Slow Django database operations on Google App EngineGoogle App Engine 上的 Django 数据库操作缓慢
【发布时间】:2011-09-19 13:20:06
【问题描述】:

我正在使用免费配额测试 Google App Engine 和 Django-nonrel。在我看来,对 Datastore 的数据库操作非常缓慢。

以这个处理请求的简化函数为例,它接收 XML blob 的 multipart/form-data,解析它们并将它们插入数据库:

def post(request):
    fields = cgi.FieldStorage(request)
    with transaction.commit_on_success():
        for xmlblob in fields.getlist('xmlblob'):
            blob_object = parse_xml(xmlblob)
            blob_object.save()

Blob_object 有五个字段,它们都是 CharField 类型。

仅约。 30 个 blob(总共大约 1 kB 的 XML),该函数需要 5 秒才能返回,并使用超过 30000 api_cpu_ms。 CPU 时间应该相当于 1.2 GHz 英特尔 x86 处理器在这段时间内可以完成的工作量,但我很确定将 30 行插入到任何可用 x86 处理器的数据库中不会花费 30 秒。

无需将对象保存到数据库(即仅解析 XML 并丢弃结果),请求只需几毫秒。

那么 Google App Engine 真的应该这么慢,以至于我无法在正常请求中将几十个实体保存到数据存储区,还是我在这里遗漏了什么?当然,即使我会在某些后端或使用任务队列中进行插入,它的成本仍然是看起来可以接受的数百倍。

编辑: 我发现,默认情况下,GAE 为每个实体的每个属性执行两次索引写入。这些属性中的大多数不应该被索引,所以问题是:如何在 Django-nonrel 上设置未索引的属性?

尽管如此,我仍然觉得,即使使用索引写入,数据库操作也会花费大量时间。

【问题讨论】:

  • 每个实体需要写多少个索引?批处理你的 put 可能也有帮助......
  • 只有一个索引需要更新。在 Django-nonrel 中仍然不支持批处理 put,但它的建议补丁承诺只切断大约 50 毫秒的 API CPU 使用,我认为这实际上只是操作之间的随机变化。
  • 我怀疑您低估了索引,因为其中一些索引会自动发生,除非您采取明确的步骤来禁用它们。 1.5.4 SDK 中的 Datastore 查看器将显示保存实体所需的写入次数。
  • 你是对的。即使有 1 个索引只有一个属性可供排序,每个 put 也会执行 10 次索引写入。我更新了问题。

标签: python google-app-engine google-cloud-datastore django-nonrel


【解决方案1】:

在没有批处理操作的情况下,您无法减少挂钟时间。批处理操作对于减少 App Engine(或任何具有 RPC 的分布式平台,真的)上的挂钟时间非常重要。

在当前计费模式下,数据存储报告的 CPU 毫秒数反映的是操作成本,而不是实际花费的时间,是一种对资源计费的方式。在新的计费模式下,这些将被明确计为数据存储操作。

【讨论】:

    【解决方案2】:

    我还没有找到真正的答案,但我对成本做了一些计算。目前,每个索引属性字段的成本约为每 10k 插入 0.20 到 0.30 美元。使用即将推出的计费模型 (Pricing FAQ),成本将恰好是每 100k 操作 0.1 美元,或每 100k 插入每个索引字段 0.2 美元,每次插入有 2 个索引写入操作。

    因此,由于价格似乎下降了十倍,观察到的缓慢确实是出乎意料的行为。由于免费配额足以满足我的测试运行需求,而且新的定价模式即将推出,我不会让它在这个时候打扰我。

    【讨论】:

      猜你喜欢
      • 2020-08-13
      • 2010-11-03
      • 1970-01-01
      • 2012-08-15
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多