2010-03-02 71 views
85

我的Django應用程序在生產中變得非常緩慢。這是由於一些複雜或未索引的查詢而引起的。分析Django

是否有任何django-ish的方式來分析我的應用程序?

回答

68

嘗試Django Debug Toolbar。它會顯示在每個頁面上執行的查詢以及它們佔用了多少時間。這是一個非常有用,功能強大且易於使用的工具。

此外,請從文檔中閱讀有關Django性能的建議,內容爲Database access optimization

Django performance tips作者: Jacob Kaplan-Moss。

+11

當心Django的調試工具欄 - 我在開發過程中把它關掉,頁面渲染是顯著快上我的(當然低功耗)筆記本 - 看在開發服務器,看看你有多少數據下載。 – 2010-03-02 13:32:58

+2

Django的調試工具欄裏幫我看看有多少查詢Django的ORM打分貝,我們可以看到select_related()函數做的伎倆擊中它少。 – panchicore 2010-03-02 14:20:47

+9

@ dominic-rodger我沒有意識到調試工具欄讓事情變得緩慢多少。我的SQL查詢很小(30毫秒),但CPU時間非常高(800毫秒)。我正在調整的另一個頁面的sql時間爲300ms,CPU時間爲8000ms - 所以我一直試圖找到問題的根源。將Django Toolbar關閉正確。 3年後,仍然有關。 – Esteban 2013-01-30 18:59:39

28

只需鍵入 「Django的分析」 谷歌,你會得到這些鏈接(及以上):

http://code.djangoproject.com/wiki/ProfilingDjango

http://code.google.com/p/django-profiling/

http://www.rkblog.rk.edu.pl/w/p/django-profiling-hotshot-and-kcachegrind/

個人我使用中間件方法 - 即每個用戶都可以切換會話中存儲的「分析」標誌,如果我的分析中間件注意到已經設置了標誌,則它使用Python的hotshot模塊E本:

def process_view(self, request, view_func, view_args, view_kwargs): 

    # setup things here, along with: settings.DEBUG=True 
    # to get a SQL dump in connection.queries 

    profiler = hotshot.Profile(fname) 
    response = profiler.runcall(view_func, request, *view_args, **view_kwargs) 
    profiler.close() 

    # process results 

    return response 

編輯:對於剖析SQL查詢康斯坦丁提到http://github.com/robhudson/django-debug-toolbar是一個很好的事情 - 但如果你的查詢都是很慢的(可能是因爲有他們的幾百或幾千個),那麼你會等待瘋狂的時間,直到它被加載到瀏覽器 - 然後由於緩慢將很難瀏覽。另外,django-debug-toolbar在設計上無法提供有用的洞察AJAX請求的內部。

EDIT2:django-extensions有很大的剖析命令內置:

https://github.com/django-extensions/django-extensions/blob/master/docs/runprofileserver.rst

只要做到這一點,瞧:

$ mkdir /tmp/my-profile-data 
$ ./manage.py runprofileserver --kcachegrind --prof-path=/tmp/my-profile-data 
+7

http://code.google.com/p/django-profile/是一個用戶配置文件django應用程序。它不是用來作爲分析的Django :) – dzen 2011-03-14 16:52:09

+1

@dzen:哈,好點的,它的意思是:http://code.google.com/p/django-profiling/ :-) – 2011-03-14 18:17:53

+1

如果你想知道如何閱讀運行後探查轉儲'蟒蛇manage.py runprofileserver --prof路徑= /路徑/到/ dir',按照此博客:http://www.darkcoding.net/software/profiling-django-for-cpu-bound-應用/。 – Neara 2014-03-20 10:16:18

15

對於分析數據訪問的所有方法調用(這是那裏的瓶頸在大多數時候)請查看django-live-profiler。與Django調試工具欄不同,它可以同時收集所有請求中的數據,並且可以在生產環境中運行它,而無需太多的性能開銷或公開應用內部信息。

Check out this screenshot

+14

不支持1.6及以上,超過一年沒有活動。 – 2014-06-07 02:47:27

4

爲您KCacheGrind迷們,我覺得這是非常容易使用Django的夢幻般的測試Client串聯外殼上即時生成配置文件登錄,尤其是在生產。我現在已經多次使用這種技術,因爲它具有輕觸感 - 不需要討厭的中間件或第三方Django應用程序!

例如,個人資料,這似乎是運行緩慢的特定視圖,你可以破解打開外殼並鍵入此代碼:

from django.test import Client 
import hotshot 

c = Client() 
profiler = hotshot.Profile("yourprofile.prof") # saves a logfile to your pwd 
profiler.runcall(c.get, "/pattern/matching/your/view/") 
profiler.close() 

形象化生成的日誌,我用hotshot2cachegrind:

但也有其他選擇:

10

無恥的插頭插在此處,但我最近爲此目的而https://github.com/django-silk/silk。它有點類似於Django的工具欄,但有歷史,代碼分析和對一切的更細緻的控制。

+0

獲取中間件問題'沒有處理程序可以找到記錄器「silk.middleware」' – 2017-08-09 10:20:13