Membuat profil Django

100

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?

sharjeel
sumber

Jawaban:

81

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.

Cahaya Perak
sumber
13
Hati-hati dengan Django Debug Toolbar - Saya mematikannya selama pengembangan dan rendering halaman secara signifikan lebih cepat di laptop saya (memang berdaya rendah) - lihat di server dev untuk melihat berapa banyak data yang Anda unduh.
Dominic Rodger
2
django-debug-toolbar membantu saya untuk melihat berapa banyak query django-orm mengenai db, dan kita dapat melihat bagaimana fungsi select_related () melakukan trik memukulnya lebih sedikit.
panchicore
11
@ dominic-rodger Saya tidak menyadari betapa lambatnya proses Debug Toolbar. Permintaan sql saya kecil (30ms) tetapi waktu cpu sangat tinggi (800ms). Halaman lain yang saya tuning memiliki waktu sql 300ms, dan waktu cpu 8000ms - jadi saya terus mencoba menemukan sumber masalahnya. Mematikan Django Toolbar mempercepat segalanya. 3 tahun kemudian, masih relevan.
Esteban
2
@Esteban, terima kasih banyak atas komentar ini, saya benar-benar menjadi gila karena jumlah waktu CPU yang sangat tinggi, membutuhkan toolbar dhango. Dengan pembuatan profil django waktu CPU sekitar 30 detik, setelah saya menghapusnya, turun menjadi 1,5 detik !!
noob Mama
28

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
Tomasz Zieliński
sumber
7
code.google.com/p/django-profile adalah aplikasi django Profil Pengguna. ini tidak digunakan sebagai pembuatan profil django :)
dzen
1
@dzen: Hah, bagus, itu dimaksudkan untuk menjadi: code.google.com/p/django-profiling :-)
Tomasz Zieliński
1
jika Anda bertanya-tanya bagaimana cara membaca dump profiler setelah berjalan python manage.py runprofileserver --prof-path=/path/to/dir, ikuti blog ini: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
Neara
ah ya, favorit saya, menggunakan google untuk menemukan salah satu jawaban teratas atas pertanyaan saya adalah "hanya google, hal yang Anda cari di Google untuk sampai di sini"
Anna
Perhatikan bahwa hotshotsudah tidak digunakan lagi dan dihapus dengan Python 3, jadi jawaban ini dan ProfilingDjangohalaman Wiki mungkin tidak lagi relevan pada tahun 20202.
Patryk Bratkowski
16

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.

Lihat tangkapan layar ini

atereshkin
sumber
19
tidak mendukung 1.6 ke atas, tidak ada aktivitas selama lebih dari satu tahun.
Han He
14

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.

Michael
sumber
Mendapatkan masalah middleware 'Tidak ada penangan yang dapat ditemukan untuk penebang "silk.middleware"'
Naveen Agarwal
5

Untuk semua Anda penggemar KCacheGrind, saya merasa sangat mudah menggunakan shell bersama-sama dengan pengujian luar biasa Django Clientuntuk 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:

Joshua Pokotilow
sumber
3

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

Evgeny
sumber
0

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:

  • Django Debug Toolbar bagus jika Anda masalahnya adalah karena kueri SQL dan bekerja dengan baik dalam kombinasi denganpyinstrument
  • django-silk bekerja dengan baik, tetapi membutuhkan penambahan manajer konteks atau dekorator ke setiap bagian dari tumpukan di mana Anda ingin pengaturan waktu sub-permintaan. Ini juga menyediakan cara mudah untuk mengakses cProfilepengaturan waktu dan secara otomatis menampilkan pengaturan waktu ajax, yang keduanya dapat sangat membantu.
  • djdt-flamegraph tampak menjanjikan, tetapi halaman tersebut tidak pernah benar-benar ditampilkan di sistem saya.

Dibandingkan dengan alat lain yang saya coba, pyinstrumentsecara dramatis lebih mudah untuk menginstal dan digunakan.

Tony S Yu
sumber