Django'da Profil Oluşturma


101

Django uygulamam üretim sırasında acı verici bir şekilde yavaşladı. Muhtemelen bazı karmaşık veya dizine eklenmemiş sorgulardan kaynaklanmaktadır.

Başvuruma profil oluşturmanın django-ish yolu var mı?

Yanıtlar:


82

Django Debug Toolbar'ı deneyin . Her sayfada hangi sorguların yürütüldüğünü ve ne kadar zaman aldığını size gösterecektir. Gerçekten kullanışlı, güçlü ve kullanımı kolay bir araçtır.

Ayrıca, belgelerdeki Veritabanı erişim optimizasyonundaki Django performansı hakkındaki önerileri okuyun .

Ve Jacob Kaplan-Moss'tan Django performans ipuçları .


14
Django Hata Ayıklama Araç Çubuğu'na dikkat edin - Geliştirme sırasında kapattım ve sayfa oluşturma (kuşkusuz düşük güçlü) dizüstü bilgisayarımda önemli ölçüde daha hızlıydı - ne kadar veri indirdiğinizi görmek için geliştirici sunucusuna bakın.
Dominic Rodger

2
django-debug-toolbar django-orm'un db'ye kaç sorgu isabet ettiğini görmeme yardımcı oluyor ve select_related () işlevinin ona daha az isabet ederek nasıl hile yaptığını görebiliyoruz.
panchicore

12
@ dominic-rodger Hata Ayıklama Araç Çubuğunun işleri ne kadar yavaşlattığını fark etmemiştim. Sql sorgularım küçüktü (30ms) ancak cpu süresi çok yüksekti (800ms). Ayarladığım başka bir sayfanın sql kez 300ms ve cpu süresi 8000ms vardı - bu yüzden sorunun kaynağını bulmaya çalıştım. Django Araç Çubuğu'nu kapatmak işleri hızlandırdı. 3 yıl sonra, hala geçerli.
Esteban

2
@Esteban, bu yorum için çok teşekkürler, tam anlamıyla gülünç derecede yüksek CPU süresi için deliriyordum, dhango araç çubuğu aldı. Django profilleme ile CPU süresi yaklaşık 30 saniyeydi, bir kez kaldırdığımda 1.5 saniyeye düştü !!
noob Mama

28

Google'a "django-profiling" yazmanız yeterlidir, şu bağlantıları (ve daha fazlasını) alacaksınız:

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/

Şahsen ara yazılım yaklaşımını kullanıyorum - yani her kullanıcı bir oturumda saklanan bir "profil oluşturma" bayrağını değiştirebilir ve profil oluşturma ara yazılımım bir bayrağın ayarlandığını fark ederse, Python'un şu şekilde hotshot modülünü kullanır :

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

DÜZENLEME: Konstantin'in bahsettiği http://github.com/robhudson/django-debug-toolbar SQL sorgularının profilini çıkarmak için güzel bir şey - ancak sorgularınız gerçekten yavaşsa (muhtemelen yüzlerce veya binlerce olduğu için), o zaman siz Bir tarayıcıya yüklenene kadar çılgınca bir süre bekleyecek - ve sonra yavaşlık nedeniyle göz atmak zor olacak. Ayrıca, django-debug-toolbar, tasarım gereği AJAX isteklerinin dahili özellikleri hakkında yararlı bilgiler sağlayamaz.

EDIT2: django-extensions yerleşik harika bir profil oluşturma komutuna sahiptir:

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

Sadece şunu yap ve işte:

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

7
code.google.com/p/django-profile , Kullanıcı Profili django uygulamasıdır. django profilleme olarak kullanılmıyor :)
dzen

1
@dzen: Hah, iyi nokta, bunun anlamı: code.google.com/p/django-profiling :-)
Tomasz Zieliński

1
Profil oluşturucu dökümlerini çalıştırdıktan sonra nasıl okuyacağınızı merak ediyorsanız python manage.py runprofileserver --prof-path=/path/to/dir, şu blogu izleyin: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
Neara

ah evet, benim favorim, sorguma verilen en iyi yanıtlardan birini bulmak için google'ı kullanmak "sadece buraya gelmek için Google'da aradığın şeyi google'da bul"
Anna

hotshotPython 3'te kullanımdan kaldırıldığını ve kaldırıldığını unutmayın , bu nedenle bu yanıt ve ProfilingDjangoWiki sayfası 20202'de artık alakalı olmayabilir.
Patryk Bratkowski

16

Veri erişimi profilleme için (darboğazın çoğu zaman olduğu yerdir) django-live-profiler'a bakın . Django Hata Ayıklama Araç Çubuğu'nun aksine, tüm isteklerden eşzamanlı olarak veri toplar ve bunu üretimde çok fazla performans yükü olmadan veya uygulamanızın dahili özelliklerini açığa çıkarmadan çalıştırabilirsiniz.

Bu ekran görüntüsüne bakın


20
1.6 ve üzerini desteklemiyor, bir yıldan fazla bir süredir etkinlik yok.
Han He


5

Siz KCacheGrind hayranları Clientiçin, özellikle üretimde, Django'nun anında profil günlükleri oluşturmaya yönelik harika testiyle birlikte kabuğu kullanmanın çok kolay olduğunu düşünüyorum . Bu tekniği şimdi birkaç kez kullandım çünkü hafif bir dokunuşu var - sinir bozucu ara yazılım veya üçüncü taraf Django uygulamalarına gerek yok!

Örneğin, yavaş çalışıyor gibi görünen belirli bir görünümü profillemek için kabuğu kırabilir ve şu kodu yazabilirsiniz:

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

Ortaya çıkan günlüğü görselleştirmek için hotshot2cachegrind kullandım:

Ancak başka seçenekler de var:


3

Görünümler HTML olmadığında, örneğin JSON, profil oluşturma için basit ara yazılım yöntemlerini kullanın.

İşte birkaç örnek:

https://gist.github.com/1229685 - görünüme giden tüm sql çağrılarını yakalayın

https://gist.github.com/1229681 - görünümü oluşturmak için kullanılan tüm yöntem çağrılarının profilini çıkarın


0

Yakın zamanda bir Django uygulamasının profilini çıkarmam gerekiyordu ve bu önerilerin çoğunu denedim. Bunun yerine , ara yazılım listesine tek bir güncelleme kullanılarak bir Django uygulamasına eklenebilen ve zamanlamaların yığın tabanlı bir görünümünü sağlayan pyinstrument'i kullandım .

Diğer bazı araçlarla deneyimimin hızlı bir özeti:

  • Django Hata Ayıklama Araç Çubuğu , sorun SQL sorgularından kaynaklanıyorsa ve aşağıdakilerle birlikte iyi çalışıyorsa harikadır:pyinstrument
  • django-silk iyi çalışır, ancak alt talep zamanlamalarını istediğiniz yığının her bölümüne bir bağlam yöneticisi veya dekoratör eklemeyi gerektirir. Ayrıca, cProfilezamanlamalara erişmek için kolay bir yol sağlar ve otomatik olarak ajax zamanlamalarını görüntüler, her ikisi de gerçekten yardımcı olabilir.
  • djdt-flamegraph umut verici görünüyordu, ancak sayfa aslında sistemimde hiçbir zaman görüntülenmedi.

Denediğim diğer araçlarla karşılaştırıldığında, pyinstrumentkurulumu ve kullanımı çok daha kolaydı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.