Profilazione Django


99

La mia applicazione django è diventata dolorosamente lenta nella produzione. Probabilmente è dovuto ad alcune query complesse o non indicizzate.

Esiste un modo django per profilare la mia applicazione?

Risposte:


79

Prova la barra degli strumenti di debug di Django . Ti mostrerà quali query vengono eseguite su ciascuna pagina e quanto tempo impiegano. È uno strumento davvero utile, potente e facile da usare.

Inoltre, leggi i consigli sulle prestazioni di Django nell'ottimizzazione dell'accesso al database dalla documentazione.

E i suggerimenti per l' esecuzione di Django di Jacob Kaplan-Moss.


13
Fai attenzione alla Django Debug Toolbar: l'ho disattivata durante lo sviluppo e il rendering della pagina è stato significativamente più veloce sul mio laptop (certamente a basso consumo): guarda nel server di sviluppo per vedere quanti dati stai scaricando.
Dominic Rodger

2
django-debug-toolbar mi aiuta a vedere quante query django-orm riceve il db, e possiamo vedere come la funzione select_related () fa il trucco colpendolo meno.
panchicore

11
@ dominic-rodger Non mi ero reso conto di quanto più lenta la barra degli strumenti di debug abbia reso le cose process. Le mie query sql erano piccole (30 ms) ma il tempo della CPU era molto alto (800 ms). Un'altra pagina che stavo ottimizzando aveva tempi sql di 300 ms e tempo della CPU di 8000 ms, quindi ho continuato a cercare di trovare l'origine del problema. Disattivare Django Toolbar ha velocizzato le cose. 3 anni dopo, ancora attuale.
Esteban

2
@Esteban, grazie mille per questo commento, stavo letteralmente impazzendo per la quantità ridicolmente elevata di tempo della CPU, la barra degli strumenti di dhango ha preso. Con django profiling il tempo della CPU era di circa 30 secondi, una volta rimosso, è sceso a 1,5 secondi !!
noob Mama

28

Basta digitare "django-profiling" su google, otterrai questi link (e altro):

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/

Personalmente sto utilizzando l'approccio middleware, ovvero ogni utente può attivare o disattivare un flag di "profilazione" memorizzato in una sessione, e se il mio middleware di profilazione nota che è stato impostato un flag, utilizza il modulo hotshot di Python in questo modo:

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

EDIT: per la profilazione delle query SQL http://github.com/robhudson/django-debug-toolbar menzionata da Konstantin è una cosa carina, ma se le tue query sono molto lente (probabilmente perché ce ne sono centinaia o migliaia), allora tu Aspetterò una folle quantità di tempo prima che venga caricato in un browser, dopodiché sarà difficile navigare a causa della lentezza. Inoltre, django-debug-toolbar non è in grado di fornire informazioni utili sugli interni delle richieste AJAX.

EDIT2: django-extensions ha un ottimo comando di profilazione integrato:

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

Basta fare questo e voilà:

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

7
code.google.com/p/django-profile è un'applicazione django del profilo utente. non è usato come profiling django :)
dzen

1
@dzen: Hah, buon punto, doveva essere: code.google.com/p/django-profiling :-)
Tomasz Zieliński

1
se ti chiedi come leggere i dump del profiler dopo l'esecuzione python manage.py runprofileserver --prof-path=/path/to/dir, segui questo blog: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
Neara

ah sì, il mio preferito, usare Google per trovare una delle migliori risposte alla mia domanda è "Google solo la cosa che hai cercato su Google per arrivare qui"
Anna

Nota che hotshotè stato deprecato e rimosso in Python 3, quindi questa risposta e la ProfilingDjangopagina Wiki potrebbero non essere più rilevanti nel 20202.
Patryk Bratkowski

16

Per l'accesso ai dati di profilazione (che è dove il collo di bottiglia è la maggior parte del tempo) controlla django-live-profiler . A differenza di Django Debug Toolbar, raccoglie i dati su tutte le richieste contemporaneamente e puoi eseguirlo in produzione senza un sovraccarico eccessivo delle prestazioni o esponendo le parti interne dell'app.

Dai un'occhiata a questo screenshot


18
non supporta 1.6 e versioni successive, nessuna attività per più di un anno.
Han He


5

Per tutti voi fan di KCacheGrind, trovo che sia molto facile usare la shell in tandem con il fantastico test di Django Clientper generare al volo i log dei profili, specialmente in produzione. Ho usato questa tecnica in diverse occasioni perché ha un tocco leggero: non sono richiesti fastidiosi middleware o applicazioni Django di terze parti!

Ad esempio, per profilare una vista particolare che sembra funzionare lentamente, potresti aprire la shell e digitare questo codice:

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()

Per visualizzare il registro risultante, ho usato hotshot2cachegrind:

Ma ci sono anche altre opzioni:



0

Di recente avevo bisogno di creare il profilo di un'app Django e ho provato molti di questi suggerimenti. Ho finito per usare invece pyinstrument , che può essere aggiunto a un'app Django utilizzando un singolo aggiornamento all'elenco middleware e fornisce una visualizzazione basata sullo stack dei tempi.

Breve riepilogo della mia esperienza con altri strumenti:

  • Django Debug Toolbar è ottimo se il problema è dovuto a query SQL e funziona bene in combinazione conpyinstrument
  • django-silk funziona bene, ma richiede l'aggiunta di un gestore di contesto o di un decoratore a ciascuna parte dello stack in cui desideri i tempi delle richieste secondarie. Fornisce inoltre un modo semplice per accedere ai cProfiletempi e visualizza automaticamente i tempi ajax, entrambi i quali possono essere davvero utili.
  • djdt-flamegraph sembrava promettente, ma la pagina non è mai stata effettivamente visualizzata sul mio sistema.

Rispetto agli altri strumenti che ho provato, è pyinstrumentstato notevolmente più facile da installare e da utilizzare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.