Aplikasi django saya menjadi sangat lambat dalam produksi. Mungkin ini karena beberapa kueri yang kompleks atau tidak terindeks.
Apakah ada cara django-ish untuk membuat profil aplikasi saya?
Jawaban:
Coba Bilah Alat Debug Django . Ini akan menunjukkan kepada Anda kueri apa yang dieksekusi pada setiap halaman dan berapa banyak waktu yang mereka butuhkan. Ini adalah alat yang sangat berguna, kuat, dan mudah digunakan.
Juga, baca rekomendasi tentang kinerja Django dalam pengoptimalan akses Basis data dari dokumentasi.
Dan tip kinerja Django oleh Jacob Kaplan-Moss.
Cukup ketik "django-profiling" di google, Anda akan mendapatkan tautan ini (dan lainnya):
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/
Secara pribadi saya menggunakan pendekatan middleware - yaitu setiap pengguna dapat mengaktifkan flag "profiling" yang disimpan dalam sebuah sesi, dan jika middleware profiling saya mengetahui bahwa sebuah flag telah disetel, ia menggunakan modul hotshot Python seperti ini:
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: Untuk membuat profil kueri SQL http://github.com/robhudson/django-debug-toolbar yang disebutkan oleh Konstantin adalah hal yang menyenangkan - tetapi jika kueri Anda sangat lambat (mungkin karena jumlahnya ratusan atau ribuan), maka Anda Akan menunggu waktu yang tidak masuk akal hingga dimuat ke browser - dan kemudian akan sulit untuk menjelajah karena kelambatan. Juga, django-debug-toolbar dengan desain tidak dapat memberikan wawasan yang berguna ke internal permintaan AJAX.
EDIT2: django-extensions memiliki perintah pembuatan profil yang bagus di dalamnya:
https://github.com/django-extensions/django-extensions/blob/master/docs/runprofileserver.rst
Lakukan saja ini dan voila:
$ mkdir /tmp/my-profile-data
$ ./manage.py runprofileserver --kcachegrind --prof-path=/tmp/my-profile-data
python manage.py runprofileserver --prof-path=/path/to/dir
, ikuti blog ini: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
hotshot
sudah tidak digunakan lagi dan dihapus dengan Python 3, jadi jawaban ini dan ProfilingDjango
halaman Wiki mungkin tidak lagi relevan pada tahun 20202.
Untuk akses data pembuatan profil (yang sering menjadi penyebab kemacetan) periksa django-live-profiler . Tidak seperti Django Debug Toolbar ia mengumpulkan data di semua permintaan secara bersamaan dan Anda dapat menjalankannya dalam produksi tanpa terlalu banyak overhead kinerja atau mengekspos internal aplikasi Anda.
Pasang tanpa malu di sini, tetapi saya baru-baru ini membuat https://github.com/django-silk/silk untuk tujuan ini. Ini agak mirip dengan toolbar django tetapi dengan sejarah, pembuatan profil kode dan kontrol lebih halus atas semuanya.
Untuk semua Anda penggemar KCacheGrind, saya merasa sangat mudah menggunakan shell bersama-sama dengan pengujian luar biasa Django Client
untuk menghasilkan log profil secara on-the-fly, terutama dalam produksi. Saya telah menggunakan teknik ini sekarang pada beberapa kesempatan karena memiliki sentuhan ringan - tidak diperlukan middleware atau aplikasi pihak ketiga yang mengganggu Django!
Misalnya, untuk membuat profil tampilan tertentu yang tampaknya berjalan lambat, Anda dapat membuka shell dan mengetik kode ini:
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()
Untuk memvisualisasikan log yang dihasilkan, saya telah menggunakan hotshot2cachegrind:
Tetapi ada opsi lain juga:
Jika tampilan bukan HTML, misalnya JSON, gunakan metode middleware sederhana untuk membuat profil.
Berikut ini beberapa contoh:
https://gist.github.com/1229685 - tangkap semua panggilan sql masuk ke tampilan
https://gist.github.com/1229681 - membuat profil semua panggilan metode yang digunakan untuk membuat tampilan
Saya perlu membuat profil aplikasi Django baru-baru ini dan mencoba banyak dari saran ini. Saya akhirnya menggunakan pyinstrument sebagai gantinya , yang dapat ditambahkan ke aplikasi Django menggunakan pembaruan tunggal ke daftar middleware dan menyediakan tampilan pengaturan waktu berbasis tumpukan.
Ringkasan singkat dari pengalaman saya dengan beberapa alat lain:
pyinstrument
cProfile
pengaturan waktu dan secara otomatis menampilkan pengaturan waktu ajax, yang keduanya dapat sangat membantu.Dibandingkan dengan alat lain yang saya coba, pyinstrument
secara dramatis lebih mudah untuk menginstal dan digunakan.