प्रोफाइलिंग Django


99

मेरा django एप्लिकेशन उत्पादन पर दर्दनाक रूप से धीमा हो गया है। संभवतः यह कुछ जटिल या अस्पष्ट प्रश्नों के कारण है।

क्या मेरे आवेदन को प्रोफाइल करने के लिए कोई django-ish तरीका है?

जवाबों:


79

Django डीबग टूलबार का प्रयास करें । यह आपको दिखाएगा कि प्रत्येक पृष्ठ पर कौन से प्रश्न निष्पादित किए गए हैं और उन्हें कितना समय लगता है। यह वास्तव में उपयोगी, शक्तिशाली और उपकरण का उपयोग करने में आसान है।

इसके अलावा, डेटाबेस एक्सेस ऑप्टिमाइज़ेशन में Django प्रदर्शन के बारे में सिफारिशें पढ़ें प्रलेखन से ।

और जैकब कापलान-मॉस द्वारा Django प्रदर्शन युक्तियाँ


13
Django डीबग टूलबार के लिए देखें - मैंने इसे विकास के दौरान बंद कर दिया था और पेज रेंडरिंग मेरे (कम-शक्ति वाले) लैपटॉप पर काफी तेज थी - देव सर्वर में देखें कि आप कितना डेटा डाउनलोड कर रहे हैं।
डोमिनिक रॉजर

2
django-debug-toolbar मुझे यह देखने में मदद करता है कि django-orm db को कितने क्वेरीज़ में हिट करता है, और हम यह देख सकते हैं कि कैसे select_related () फंक्शन इसे कम हिट करता है।
पंच प्यारे

11
@ डोमिस्टिक-रॉगर मुझे एहसास नहीं हुआ कि डिबग टूलबार ने कितनी धीमी गति से चीजें बनाई हैं। मेरे sql क्वेरी छोटे (30ms) थे, लेकिन cpu का समय बहुत अधिक (800ms) था। एक अन्य पृष्ठ जो मैंने ट्यूनिंग किया था, उसमें 300ms का sql काल, और 8000ms का cpu समय था - इसलिए मैं समस्या के स्रोत को खोजने का प्रयास करता रहा। Django टूलबार को बंद करने से चीजें सही हो जाती हैं। 3 साल बाद, अभी भी प्रासंगिक है।
एस्टेबन

2
@Esteban, इस टिप्पणी के लिए बहुत बहुत धन्यवाद, मैं सचमुच सीपीयू समय की हास्यास्पद उच्च मात्रा पर पागल हो रहा था, धांगो टूलबार लिया। Django प्रोफाइलिंग के साथ CPU समय लगभग 30 सेकंड था, एक बार मैंने इसे हटा दिया, यह 1.5 सेकंड के लिए नीचे आ गया !!
नोब मामा

28

Google पर "django-profiling" टाइप करें, आपको ये लिंक मिलेंगे (और अधिक):

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/

व्यक्तिगत रूप से मैं मिडिलवेयर दृष्टिकोण का उपयोग कर रहा हूं - अर्थात प्रत्येक उपयोगकर्ता एक सत्र में संग्रहीत "प्रोफाइलिंग" ध्वज को टॉगल कर सकता है, और यदि मेरा प्रोफाइलिंग मिडलवेयर नोटिस करता है कि एक ध्वज सेट किया गया है, तो वह पायथन के हॉटशॉट मॉड्यूल का उपयोग करता है :

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

संपादित करें: एसक्यूएल प्रश्नों की रूपरेखा के लिए, कोनिस्टेंटिन द्वारा उल्लिखित http://github.com/robhudson/django-debug-toolbar एक अच्छी बात है - लेकिन यदि आपके प्रश्न वास्तव में धीमे हैं (शायद इसलिए कि उनमें से सैकड़ों या हजारों हैं), तो आप जब तक यह एक ब्राउज़र में लोड नहीं हो जाता तब तक पागल समय की प्रतीक्षा कर रहा होगा - और फिर धीमेपन के कारण इसे ब्राउज़ करना मुश्किल होगा। इसके अलावा, django-debug-toolbar AJAX अनुरोधों के आंतरिक मामलों में उपयोगी जानकारी देने में असमर्थ डिजाइन द्वारा है।

EDIT2: django- एक्सटेंशन में एक महान प्रोफाइलिंग कमांड बनाया गया है:

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
code.google.com/p/django-profile एक उपयोगकर्ता प्रोफ़ाइल django एप्लिकेशन है। यह प्रोफाइलिंग django के रूप में प्रयोग नहीं किया जाता है :)
dzen

1
: @dzen: हा, अच्छा बिंदु है, यह मतलब था किया जाना है code.google.com/p/django-profiling :-)
टोमाज़ ज़िलिंस्की

1
यदि आपको आश्चर्य है कि रनिंग के बाद प्रोफाइलर डंप कैसे पढ़ें python manage.py runprofileserver --prof-path=/path/to/dir, तो इस ब्लॉग का अनुसरण करें: darkcoding.net/software/profiling-django-for-cpu-bound-apps
नीरा

आह हाँ, मेरे पसंदीदा, मेरी क्वेरी के लिए शीर्ष उत्तरों में से एक को खोजने के लिए Google का उपयोग कर रहा है "बस Google जिस चीज़ को पाने के लिए आपको यहाँ जाना है"
अन्ना

ध्यान दें कि hotshotपदावनत किया गया है और अजगर 3 में हटा दिया है, तो यह जवाब और ProfilingDjangoविकी पृष्ठ अब 20202. में प्रासंगिक हो सकता है
पेट्रिक Bratkowski

16

प्रोफाइलिंग डेटा एक्सेस के लिए (जो कि अड़चन सबसे ज्यादा है) django-live-profiler देखें । Django डीबग टूलबार के विपरीत, यह एक साथ सभी अनुरोधों पर डेटा एकत्र करता है और आप इसे बहुत अधिक प्रदर्शन ओवरहेड या अपने ऐप इंटर्नल को उजागर किए बिना उत्पादन में चला सकते हैं।

इस स्क्रीनशॉट को देखें


19
1.6 और उससे अधिक का समर्थन नहीं, एक वर्ष से अधिक के लिए कोई गतिविधि नहीं।
हान वह

14

बेशर्म प्लग यहाँ, लेकिन मैंने हाल ही में इस उद्देश्य के लिए https://github.com/django-silk/silk बनाया है । यह कुछ हद तक django टूलबार के समान है लेकिन इतिहास, कोड प्रोफाइलिंग और हर चीज पर अधिक महीन दाने वाले नियंत्रण के साथ।


मिडलवेयर समस्या का सामना करना 'लकड़ियों के लिए नहीं "लकड़हारा। के लिए पाया जा सकता है।"
नवीन अग्रवाल


5

आप सभी KCacheGrind प्रशंसकों के लिए, मुझे लगता है कि Django के शानदार परीक्षण के साथ मिलकर इसका उपयोग करना बहुत आसान है Client -साथ-साथ, विशेष रूप से उत्पादन में प्रोफ़ाइल लॉग बनाने के लिए । मैंने इस तकनीक का उपयोग कई मौकों पर किया है क्योंकि इसमें हल्का स्पर्श है - कोई pesky मिडलवेयर या तृतीय-पक्ष 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 का उपयोग किया है:

लेकिन अन्य विकल्प भी हैं:


3

जब दृश्य HTML नहीं होते हैं, उदाहरण के लिए JSON, प्रोफाइलिंग के लिए सरल मिडलवेयर विधियों का उपयोग करें।

यहाँ कुछ उदाहरण दिए गए हैं:

https://gist.github.com/1229685 - सभी sql कॉल्स को कैप्चर करने के दृश्य में चला गया

https://gist.github.com/1229681 - प्रोफ़ाइल सभी विधि कॉल का उपयोग दृश्य बनाने के लिए किया जाता है


0

मुझे हाल ही में एक Django ऐप को प्रोफाइल करने की आवश्यकता थी और इनमें से कई सुझावों की कोशिश की। मैंने इसके बजाय pyinstrument का उपयोग करके समाप्त कर दिया , जो कि मिडलवेयर सूची के एकल अद्यतन का उपयोग करके एक Django ऐप में जोड़ा जा सकता है और समय के स्टैक-आधारित दृश्य प्रदान करता है।

कुछ अन्य उपकरणों के साथ मेरे अनुभव का त्वरित सारांश:

  • Django डीबग टूलबार महान है यदि आप SQL प्रश्नों के कारण समस्या है और साथ संयोजन में अच्छी तरह से काम करता हैpyinstrument
  • django-Silk अच्छा काम करता है, लेकिन स्टैक के प्रत्येक भाग में एक संदर्भ प्रबंधक या डेकोरेटर जोड़ने की आवश्यकता होती है, जहाँ आप उप-अनुरोध समय चाहते हैं। यह cProfileसमय पर पहुंचने का एक आसान तरीका भी प्रदान करता है और स्वचालित रूप से अजाक्स का समय प्रदर्शित करता है, दोनों ही वास्तव में सहायक हो सकते हैं।
  • djdt- फ्लेमग्राफ आशाजनक लग रहा था, लेकिन पृष्ठ वास्तव में मेरे सिस्टम पर कभी प्रस्तुत नहीं हुआ।

मेरे द्वारा आजमाए गए अन्य साधनों की तुलना में, pyinstrumentइसे स्थापित करने और उपयोग करने के लिए नाटकीय रूप से आसान था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.