如何扩展Django:找到瓶颈

来自菜鸟教程
跳转至:导航、​搜索

介绍


Django 是一个优秀的基于 Python 的平台,用于构建现代 Web 应用程序。 它最大的优势之一是它可以帮助开发人员更快地工作。

您已经构建了出色的应用程序并进行了部署。 事情很好,但是现在您正在加载大量数据并且您开始有几个人同时使用它,它并没有您想要的那么快。

这是一个常见的问题。 幸运的是,我们有一些工具可以帮助缓解这些问题。

首先,让我们检查一些更明显的问题:

使用真实数据库


在本地开发过程中,很难击败 SQLite3。 除非您很小心,否则您也可能会在虚拟服务器上使用它。

SQLite3 不能像 MySQL 和 PostgreSQL 这样扩展到多个同时用户,特别是对于执行许多写入操作的操作(如果您使用会话,那么您正在写入数据库)。

如果您使用的是低内存 VPS,例如 512MB 的 droplet,我建议使用 MySQL。 如果您有多余的内存(2GB 或更多),那么我建议您考虑使用 PostgreSQL,因为它是许多 Django 开发人员的首选。

禁用调试模式


在进行本地开发时,调试模式是绝对必要的,但它会减慢生产服务器的速度。 查看虚拟服务器的 settings.py 并检查以确保 DEBUG 设置为 False。 还要确认 TEMPLATE_DEBUG 也设置为 False 或设置为 DEBUG。

使用调试工具栏确定性能问题


在您的本地开发计算机上,而不是您的生产服务器上,打开 Django 调试工具栏 以定位具体问题。

为此,您可以安装 django-debug-toolbar 模块,然后向 MIDDLEWARE_CLASSES 字典添加一个条目,如下所示:

MIDDLEWARE_CLASSES = (
    # ...
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    # ...
)

您还需要创建一个 INTERNAL_IPS 变量并添加您的 IP 地址。 如果你在本地开发,你的 IP 地址可能是 127.0.0.1,所以你需要在 settings.py 中添加这样的一行:

INTERNAL_IPS = ('127.0.0.1',)

最后,添加 debug_toolbar 作为 INSTALLED_APPS 中的最后一项,如下所示:

INSTALLED_APPS = (
    # ...
    'debug_toolbar',
)

安装文档 包含一些您可能需要考虑的更详细信息和可选配置选项。

请记住,不要将这些更改推送到生产环境中! (如果你是故意这样做的,那很好)。

现在,当您浏览网站时,您应该会在网页的一侧看到一个黑色面板。 如果您喜欢统计数据和数字以及各种令人讨厌的细节,您会喜欢的。 您还将很快明白为什么您不希望在生产服务器上使用它!

[[“Signals”|[[File:“%3Ca]]]] https://assets.digitalocean.com/articles/scale_django/img1.png ”>

在构建了许多 Django 应用程序之后,我建议您缩小面板的 SQL 部分,因为这通常是一个值得关注的领域。

Django 的一个好处/问题是在执行查询时 延迟加载 相关字段。 这意味着 Django 宁愿不进行连接。 如果您最终需要相关字段,则每次需要相关字段时都会执行额外的查询。

如果确实需要相关字段,这可能会导致 n+1 个 SQL 查询。 例如,假设您要制作 Twitter 的替代版本。 您为推文创建一个模型,每个模型都与用户模型相关。 在您的主页上,您列出了 30 条最新推文以及创建它们的用户的姓名。 这可能会导致您至少执行 31 个 SQL 查询。 一个查询用于获取推文列表,一个查询用于每个用户名查找。

这个问题的解决方案是select_related。 这是对导致 Django 在获取数据时进行连接的查询的非常简单的修改。 您应该在您知道需要相关字段的任何查找中使用它。

您只需像这样修改查询:

Entry.objects.get(id=5)

看起来像这样:

Entry.objects.select_related().get(id=5)

阅读此功能的文档并仅在必要时使用它。

包起来


以我的经验,上述问题解决了许多站点的初始性能问题,并且都非常容易通过最少的代码和配置更改来解决。

提交人: [[“%3Ca|http]] ://www.bearfruit.org/ [[“%3C/a|”>马修·努祖姆]]