排除瓶颈和加速django项目
為什么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项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从杂技表演到日剧BGM(r12笔记第23
- 下一篇: CSS页面布局