如何实现Django规模化:寻找瓶颈

本文介绍如何通过使用合适的数据库、禁用Debug模式以及利用Debug工具栏等手段提高Django应用程序的性能。

提供:ZStack云计算

系列教程

本教程为Django规模化系列三篇中的第一篇。

内容介绍

Django是一套基于Python的出色平台,专门用于构建现代Web应用。其最大优势之一在于帮助开发人员更快完成工作。

大家可能已经构建起自己的应用并进行部署,但接下来需要向其中加载大量数量并同时接受众多用户的接入。在这种情况下,其速度无疑将受到严重影响。

这是一类常见难题,幸运的是,我们拥有多种工具能够加以应对。

首先,让我们看看几个比较明显的问题:

使用真正的数据库

在本地开发工作中,我们很难绕开SQLite3。除非大家小心谨慎,否则很可能会在虚拟服务器中用到这款数据库。

SQLite3并不像MySQL以及PostgreSQL等多用户曲发数据库那样拥有极强的扩展性,特别是在应对大量写入操作时(如果大家正在使用会话,则意味着正向数据库内进行写入)。

如果大家使用的是内存容量较低的VPS,例如只有512 MB的Droplet,那我建议大家使用MySQL。如果大家的内存比较充裕(超过2 GB),则应当使用PostgreSQL,因为其更为大多数Django开发者所熟悉。

禁用Debug模式

Debug模式在进行本地开发时当然非常重要,不过它也会拖慢生产服务器的运行速度。大家可以审视自己虚拟服务器的settings.py文件并确保其中的DEBUG选项被设定为False。另外,确认TEMPLATE_DEBUG同样被设为Fales,否则它会启用DEBUG功能。

使用Debug工具栏以解决性能问题

在本地开发计算机上(而非生产服务器上),启用Django Debug工具栏以查找具体问题。

要启用此工具栏,大家首先需要安装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',
)

请参阅安装说明文档以了解更多与配置相关的细节信息与可选荐。

请记住,千万不要在生产环境下应用这些变更!(除非有明确的理由。)

现在大家应该能够在浏览站点时从网页周边找到黑色的面板。如果大家乐于查看与各项细节相关的状态与数字,那么其将帮上大忙。

在构建了几款Django应用之后,我建议大家多多关注面板中的SQL部分,因为这里往往是问题多发区域。

Django的优势/问题之一在于执行查询时,其相关字段往往存在延迟加载状况。这意味着Django往往不愿主动执行join。如果大家最终仍然需要相关字段,Django会再进行一次额外查询以满足要求。

如果大家确实需要相关字段,这可能导致SQL查询数量变为n+1。例如,假定大家打算替换Twitter的某个版本。我们创建一套推文模式,且每种模式都与用户模式相关联。在主页上,我们能够列出最新30条推文及其创建者。在这种情况下,Django需要进行至少31次SQL查询。其中1次获取推文列表,另外每次查询完成1次用户名检索。

这种解决办法的问题在于select_related。这是一种非常简单的查询修改机制,会导致Django在获取数据时执行join。大家应当利用它以查找任何已知相关字段。

将查询简单修改如下:

Entry.objects.get(id=5)

修改为:

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

请阅读说明文档并保证只在必要时使用这一机制。

总结

根据我的经验,以上方式能够解决大多数站点性能问题,而且只需稍微进行代码调整及配置变更即可完成。

本文来源自DigitalOcean Community。英文原文:How To Scale Django: Finding the Bottleneck By Matthew Nuzum

翻译:diradw

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值