如何扩展 Django:找到瓶颈

介绍


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

事情很好,但现在你正在加载更多的数据,并且你开始有几个人同时使用它,它并不像你想的那样快。

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

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

使用真实的数据库


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

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

如果你使用的是低内存VPS,例如512MB dropplet,我建议使用MySQL. 如果你有储存内存(2GB或更多),那么我建议你考虑PostgreSQL,因为它是许多Django开发人员的喜好。

禁用 Debug 模式


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

使用调试工具栏来解决性能问题


在本地开发计算机上,而不是生产服务器上,打开 Django Debug Toolbar以找到特定问题。

您可以通过安装 django-debug-toolbar 模块来完成此操作,然后在您的 MIDDLEWARE_CLASSES 字典中添加这样的条目:

1MIDDLEWARE_CLASSES = (
2    # ...
3    'debug_toolbar.middleware.DebugToolbarMiddleware',
4    # ...
5)

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

1INTERNAL_IPS = ('127.0.0.1',)

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

1INSTALLED_APPS = (
2    # ...
3    'debug_toolbar',
4)

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

记住,不要意外地将这些变化推向生产!(如果你故意这样做,那就没关系了)。

现在你应该看到一个黑色面板出现在你的网页的侧面,当你浏览网站. 如果你喜欢统计数据和数字和各种神奇的细节,你会喜欢它。

<a href="Signals Áthaimg src="https://cdn.jsdelivr.net/gh/andsky/tutorials-images/assets/scale_django/img1.png">

建立了大量的Django应用程序,我建议您缩小面板的SQL部分,因为这通常是一个关注的领域。

Django 的一个好处/问题是执行查询时相关字段的 懒惰加载

如果您需要相关的字段,这可能会导致 SQL 查询的 n + 1 次数。例如,假设您正在创建一个替代的 Twitter 版本。您创建了一个模型,用于推文,每个模型都与用户模型有关。在您的主页上,您列出了 30 个最新推文,以及创建它们的用户的名称。

這個問題的解決方法是 select_related。這是一個非常簡單的變更,導致Django在收集資料時進行連結。

您只需修改这样的查询:

1Entry.objects.get(id=5)

要像这样看:

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

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

包装上


根据我的经验,上述问题解决了许多网站的初始性能问题,所有这些问题都很容易用最小的代码和配置更改来解决。

Submitted by: Matthew Nuzum
comments powered by Disqus