为什么80%的码农都做不了架构师?>>>   

作者: Desmond Chen

本篇中我们介绍一些基本的查找和加速django项目的策略.

1. 先等等

首先我们需要明白, 错误的优化不是什么好事. 如果你的项目只是小到中等规模, 并且加载速度过得去, 那么你完全没有必要进行优化.

如果你项目的用户在持续稳定的增加, 并且达到了一定的数目, 那么请往下看.

2. 加速Query查询

如果一个页面中query数太多, 或一个query得到的数据太大, 都会导致加载速度变慢. 首先你可以看一下Django官网关于数据库优化的文档: https://docs.djangoproject.com/en/1.9/topics/db/optimization/.

a. 使用django-debug-toolbar

django-debug-toolbar可以找到query的来源, 并且找到:

  • 重复的query
  • 产生大量query的ORM语句
  • 慢query

你对哪些页面载入较慢应该有个大致的了解, 所以你只需要使用django-debug-toolbar打开这些页面, 查看是哪些query拖慢了整体速度.

b. 减少query数

一旦找到了哪些页面包含过多的query数后, 我们便可以采取措施减少query数:

  • 在ORM中使用select_related()减少query数: 使用select_related()会自动扩展外键关系, 将外键中的数据提前合并到本次query. 如果使用CBV, django-braces的SelectRelatedMixin达到同样的目地. 但要小心query扩展的过深.
  • 如果同样的query发生多次, 那么将其移到view中, 在使用context将其传到template中.
  • 使用redis等caching, 然后测试.
  • 使用django.utils.functional.cached_property修饰器, 将query结果cache在内存中.

c. query提速

获取一个大的query结果同样也会影响速度, 因此我们首先需要:

  • 确保index起到了加速query的作用
  • 理解在部署服务器中index的作用, 分析理解数据库中真正发生了什么
  • 查看ORM生成的raw SQL语句
  • 开启数据库的 slow query logging功能, 并查看慢query发生的频率
  • 使用django-debug-toolbar找到慢query

然后我们便可以:

  • 重写代码, 使query获得更小的片段
  • 重写代码, 使query更好的利用index
  • 使用raw SQL语句代替ORM生成的慢SQL语句

d. ATOMIC_REQUESTS选项

大多数django项目在ATOMIC_REQUESTS=True的状况下运行都没有什么问题. 如果你的瓶颈分析显示数据库transaction导致了延迟, 那么你可以选择将ATOMIC_REQUESTS=False

3. 数据库优化

除了以上提到的query优化外, 你可以更进一步的进行数据库优化, 相信这方面的书或文章已经很多了, 我们不进行深入讨论了. 主要是以下几点:

a. 哪些不属于数据库

有两种数据不应该储存在数据库中, 一个是log信息, 另一个则是经常变化的数据. log信息在开发时看似没有什么影响, 但在正式服务器上运行时, 可能会拖慢数据库, 因此我们建议使用Splunk, Loggly这样的第三方服务或使用NoSQL数据库保存这些数据. 经常变换的数据比如django.contrib.sessions, django.contrib.messages等应尽量保存到Memcached, Redis, Riak或其他NoSQL数据库中.

b. PostgreSQL

对于postgres, 在正式服务器中一定要保证设置正确. 具体的设置方法可以自行google之. 还可以参考书 "Postgresql 9.0 high performance".

c. MySQL

MySQL容易安装和运行, 但如何优化需要长时间的经验和理解. 我们推荐书"high performance MySQL".

4. 使用Memcached或Redis进行Query Cache

你可以使用Django自带的caching系统配合Memcached或Redis, 轻松的完成整站cache的配置. 也可以使用Django的Low-level API完成复杂的设置.

重要的是, 你需要确定哪些需要cache, 哪些不需要cache. 你需要考虑, 哪些view/template包含的query最多? 哪些URL被浏览的最多? 被cache的页面何时需要失效处理?

我们也可以使用第三方package: 比如django-cache-machine, johnny-cache等.

5. 最小化HTML, CSS和JavaScript文件

当浏览器呈现网页时, 必须载入HTML, CSS, JavaScript和图片. 所有这些文件都会消耗用户的带宽, 使浏览速度下降. 虽然Django自带了GZipMiddleware和{% spaceless %} template tag, 还有WSGI的 middleware都能帮助我们减小这些文件. 但使用以上方法都会增加Django自身的系统资源占有量, 可能会导致瓶颈. 最好的方式则是将这一操作交给Apache或Nginx这些web server, 比如利用PageSpeed Module.

当然django的第三方package来压缩和最小化CSS和JavaScript文件也是可行的, 常见的插件有django-pipeline, django-compressor, django-htmlmin等.

6. 使用Upstream caching或CDN

使用Varnish等upstream caching也能加快系统的载入速度. 当然我们还可以AWS等云服务部署自己的CDN, 为全球的用户提供快速的图片, 视频, CSS文件和JavaScript的载入.

原文链接: http://www.weiguda.com/blog/33/

转载于:https://my.oschina.net/sukai/blog/873076

排除瓶颈和加速django项目相关推荐

  1. 使用pytest对django项目单元测试

    2019独角兽企业重金招聘Python工程师标准>>> 背景 使用django开发了个人博客,欲单元测试,后遍寻网络,然相关资料甚少,遂成此文,望对汝有所助 环境 pytest py ...

  2. Django项目知识点(四)

    https://mp.weixin.qq.com/s/8yznCfBdbgzy8ZN7tiRTEw 本来今天不想发文的,昨天没发,怪不好意思的 django view URL是Web服务的入口,用户通 ...

  3. Django项目开发——001如何学习django

    参考地址: https://code.ziqiangxuetang.com/django/django-tutorial.html https://www.django.cn/article/show ...

  4. 服务器上django项目配置负载均衡

    服务器正常需要的nginx和uwsgi的配置就不多说了,前面讲过了,直接开始主题. 负载均衡,说白了,所有请求发给A服务器,然后它转发到其它服务器中实现负载均衡 Nginx的反向代理 反向代理指以代理 ...

  5. django项目学习

    socket编程 scocket 协议位于服务端和客户端之间,b/s架构之间的通信步骤如下图所示.我们web开发做的就是socket服务端的时,通过客户端发来的数据,返回给客户端想要的数据. 简单使用 ...

  6. ubuntu18.04 -- 创建第一个Django项目

    step1: 安装虚拟环境: sudo pip3 install virtualenv # 安装虚拟环境sudo pip3 install virtualenvwrapper # 安装虚拟环境扩展包# ...

  7. Django项目配合sentry实现浅析

    Django项目日志配合sentry概述 本文环境python3.5.2,Django版本1.10.2 Django项目中日志配合sentry的实现 sentry是一个错误跟踪网站,可以收集获取运行中 ...

  8. Django项目日志概述

    Django项目日志概述 本文环境python3.5.2,Django版本1.10.2 Django项目中日志的实现 Django项目中使用的日志,使用了Python标准库中的logging模块进行实 ...

  9. Django项目test中的mock概述

    Django项目test中的mock概述 本文环境python3.5.2 test中的mock实现 接口示例代码如下: ...# 路由配置('^api/business_application/?$' ...

最新文章

  1. 机器学习研究的七个迷思
  2. 蚂蚁金服AAAI收录论文曝光,动态网络剪枝方法、无语预训练的网络剪枝技术有重大突破...
  3. 基于epoll实现简单的web服务器
  4. 【机器学习】算法模型自动超参数优化方法
  5. 用redis实现分布式锁
  6. Spring Boot基础学习笔记13:路径扫描整合Servlet三大组件
  7. struts2的动态方法调用(DMI)和通配符映射
  8. 开源啦:连DeepMind也捉急的游戏,OpenAI给你攻破第一关的高分算法
  9. ionic 网站放在服务器,Ionic4 服务器插件-服务器Httpd - Ionic Native
  10. 5.stm32L476在freeRTOS下使用低功耗
  11. java ee与j2ee_JavaEE/J2EE与J2SE/JDK版本的相关性
  12. Download a file from Google Drive
  13. 形容词记忆(二):ful,ous,ant后缀常用词
  14. Excel如何将文本中间的数值提取出来
  15. 单声道蓝牙实现音乐播放
  16. TCP报文( tcp dup ack 、TCP Retransmission)
  17. Vue.js 入门 :去哪儿网APP案例 学习记录
  18. VMware tool 和window共享文件夹,被坑了许久!!!
  19. 数学建模常用模型05 :多元回归模型
  20. matlab中滤波器设计与实现,基于MATLAB的IIR滤波器设计与实现

热门文章

  1. ViewRoot:处理消息+WMS交互+控制DecorView
  2. mac 下启动Android Studio 时出现 Android Studio was unable to find a valid Jvm
  3. 重要接口—NavigableSet接口
  4. (三)用docker-compose部署postgres+ postgis
  5. Windows 2012 下Redmine安装和环境搭建
  6. openstack havana块存储Cinder磁盘加密方法研究
  7. NOIP2008 普及组T1 ISBN号码 解题报告-S.B.S.
  8. CodeIgniter模型
  9. Centos Another app is currently holding the yum lock
  10. Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.