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:
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ı .
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
python manage.py runprofileserver --prof-path=/path/to/dir
, şu blogu izleyin: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
hotshot
Python 3'te kullanımdan kaldırıldığını ve kaldırıldığını unutmayın , bu nedenle bu yanıt ve ProfilingDjango
Wiki sayfası 20202'de artık alakalı olmayabilir.
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.
Buraya utanmaz fiş, ancak kısa süre önce bu amaç için https://github.com/django-silk/silk yaptım . Django araç çubuğuna biraz benzer, ancak geçmişe, kod profiline ve her şey üzerinde daha ince ayarlı kontrole sahiptir.
Siz KCacheGrind hayranları Client
iç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:
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
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:
pyinstrument
cProfile
zamanlamalara 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.Denediğim diğer araçlarla karşılaştırıldığında, pyinstrument
kurulumu ve kullanımı çok daha kolaydı.