提供: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
本文介绍如何通过使用合适的数据库、禁用Debug模式以及利用Debug工具栏等手段提高Django应用程序的性能。
2536

被折叠的 条评论
为什么被折叠?



