【问题标题】:Profiling Django: very slow performance分析 Django:性能非常慢
【发布时间】:2015-02-23 13:51:15
【问题描述】:

我开发了一个 Django 应用程序并通过管理界面添加了一些数据。在这一点上的表现完全糟糕透顶,到目前为止我从来没有遇到过这种情况。

本地(最新版 Macbook pro)和远程(Webfaction 自定义 Django 安装)速度很慢。远程它甚至在通过管理员简单地检索记录时定期丢弃请求。

我是分析新手,但我安装了 Django-Debug-Toolbar。它显示在管理员中检索一条记录需要超过 15000 毫秒,SQL 查询需要 600 毫秒,执行超过 1,100 次查询。远程应用程序不会将服务器内存推到极限(512 的 300 MB,另一个应用程序正在运行)。

看起来不可能需要 1,100 个查询。你同意这是瓶颈吗?它是否完全解释了性能:查询时间为 600 毫秒,总请求时间为 15000 毫秒?

我的项目的一些特点:

  • 没什么花哨的,主要是香草 Django 的东西
  • 添加了 Django-Rest-Framework 接口
  • 具有 52 个表的 Postgres 数据库
  • 没有海量数据,最大的表有 10,000 条记录
  • 添加更多数据后似乎会变慢。
  • 模型之间没有“奇怪”或多余的关系。至少我知道。

除了我刚才提出的问题:我应该寻找什么以及如何解决这个问题?常见错误?

【问题讨论】:

  • 是的,查询几乎肯定是罪魁祸首。您已经在使用调试工具栏:它是否显示任何重复或类似的查询?这通常表明事情可以优化。
  • 是的,现在正在调查。前几个查询是有意义的,最后几个也是如此。中间的 1000 个查询是具有不同 ID 的重复,似乎根本不需要。不知道为什么我的模型会调用它们。现在深入研究它。
  • 曾在模型的__unicode__ 方法中查看:如果这些方法正在跨关系查找数据,则可能是罪魁祸首。您可以通过适当地设置 modeladmin select_related 属性来解决此问题。
  • 但是对于您在页面上显示的每个模型,这都是 2 次查询,所以如果您要显示 100 个模型的列表,那就是 200 个查询,依此类推。再次,select_related 是你的朋友。您可能还对我几年前就这个主题提供的talk 感兴趣。
  • 不完全自信,但它可能会给你一些指示。虽然如果这是管理员编辑页面而不是列表页面,那么它可能发生在关系字段的选择框中;在这种情况下,raw_id_fields 会有所帮助。

标签: python django performance


【解决方案1】:

在这里回答以避免进一步讨论。

罪魁祸首在多个地方都是同一个。我遵循了这种模式(Python 3):

class RootFoo(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name


class Foo(models.Model):
    rootfoo = models.ForeignKey(RootFoo)
    spam = models.ForeignKey(Spam)

    def __str__(self):
        return self.rootfoo.__str__()


class SpecificFoo(models.Model):
    name = models.CharField(max_length=80)
    foo = models.ForeignKey(Foo)
    bar = models.ForeignKey(Bar)
    property = models.IntegerField()

    def __str__(self):
        return self.name

在 SpecificFoo 的管理概述中,它通过单个查询列出了 100 个实例。但是,当您打开 SpecificFoo 的实例时,它必须填充 foo 外键的选择框,并通过对每个单独的 Foo 项执行查询来实现。慢。

正如@DanielRoseman 所指出的:raw_id_field 可能是解决这个问题的一种方法。不知何故,我觉得应该有一种方法告诉 Django 用单个查询的结果填充 foo 选择字段以列出所有项目...

小更新:我已经开始接受除了使用raw_id_fields之外没有简单的方法。

【讨论】:

    猜你喜欢
    • 2021-05-24
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 2012-06-15
    相关资源
    最近更新 更多