แอปพลิเคชัน django ของฉันทำงานช้าลงอย่างเจ็บปวด อาจเป็นเพราะคำค้นหาที่ซับซ้อนหรือไม่ได้จัดทำดัชนี
มีวิธี django-ish ในการกำหนดโปรไฟล์แอปพลิเคชันของฉันหรือไม่?
แอปพลิเคชัน django ของฉันทำงานช้าลงอย่างเจ็บปวด อาจเป็นเพราะคำค้นหาที่ซับซ้อนหรือไม่ได้จัดทำดัชนี
มีวิธี django-ish ในการกำหนดโปรไฟล์แอปพลิเคชันของฉันหรือไม่?
คำตอบ:
ลอง Django Debug Toolbar จะแสดงให้คุณเห็นว่ามีการดำเนินการสืบค้นใดในแต่ละหน้าและใช้เวลาเท่าใด เป็นเครื่องมือที่มีประโยชน์มีประสิทธิภาพและใช้งานง่าย
นอกจากนี้อ่านคำแนะนำเกี่ยวกับประสิทธิภาพของ Django ในการเพิ่มประสิทธิภาพการเข้าถึงฐานข้อมูลจากเอกสารประกอบ
และเคล็ดลับการแสดง Djangoโดย Jacob Kaplan-Moss
เพียงพิมพ์ "django-profiling" ใน Google คุณจะได้รับลิงก์เหล่านี้ (และอื่น ๆ ):
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/
โดยส่วนตัวแล้วฉันใช้วิธีมิดเดิลแวร์นั่นคือผู้ใช้แต่ละคนสามารถสลับแฟล็ก "การทำโปรไฟล์" ที่เก็บไว้ในเซสชันและหากมิดเดิลแวร์การทำโปรไฟล์ของฉันสังเกตเห็นว่ามีการตั้งค่าสถานะไว้ระบบจะใช้โมดูลฮอทช็อตของ Python ดังนี้:
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
แก้ไข: สำหรับการทำโปรไฟล์แบบสอบถาม SQL http://github.com/robhudson/django-debug-toolbar ที่ Konstantin กล่าวถึงเป็นสิ่งที่ดี - แต่ถ้าคำถามของคุณช้ามาก (อาจเป็นเพราะมีหลายร้อยหรือหลายพันข้อ) คุณ จะต้องรอเวลาที่บ้าคลั่งจนกว่าจะโหลดลงในเบราว์เซอร์ - จากนั้นจะเรียกดูได้ยากเนื่องจากความช้า นอกจากนี้ django-debug-toolbar เกิดจากการออกแบบไม่สามารถให้ข้อมูลเชิงลึกที่เป็นประโยชน์เกี่ยวกับการร้องขอภายในของ AJAX ได้
แก้ไข 2: django-extensionsมีคำสั่งสร้างโปรไฟล์ที่ยอดเยี่ยมในตัว:
https://github.com/django-extensions/django-extensions/blob/master/docs/runprofileserver.rst
เพียงแค่ทำสิ่งนี้และ 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
ทำตามบล็อกนี้: darkcoding.net/software/profiling-django-for-cpu-bound-apps
hotshot
ได้เลิกใช้งานและนำออกใน Python 3 ดังนั้นคำตอบนี้และProfilingDjango
หน้า Wiki อาจไม่เกี่ยวข้องอีกต่อไปในปี 20202
สำหรับโปรไฟล์การเข้าถึงข้อมูล (ซึ่งเป็นที่ที่คอขวดเป็นส่วนใหญ่ของเวลา) ตรวจสอบDjango-สด Profiler ไม่เหมือนกับ Django Debug Toolbar ที่จะรวบรวมข้อมูลจากคำขอทั้งหมดพร้อมกันและคุณสามารถเรียกใช้ในการใช้งานจริงได้โดยไม่ต้องมีค่าใช้จ่ายด้านประสิทธิภาพมากเกินไปหรือเปิดเผยแอปภายใน
ปลั๊กไร้ยางอายที่นี่ แต่ฉันเพิ่งสร้างhttps://github.com/django-silk/silkเพื่อจุดประสงค์นี้ มันค่อนข้างคล้ายกับแถบเครื่องมือ django แต่มีประวัติการทำโปรไฟล์โค้ดและการควบคุมทุกอย่างที่ละเอียดยิ่งขึ้น
สำหรับแฟน ๆ KCacheGrind ทุกคนฉันพบว่ามันง่ายมากที่จะใช้เชลล์ควบคู่ไปกับการทดสอบที่ยอดเยี่ยมของ Django ในการClient
สร้างบันทึกโปรไฟล์ได้ทันทีโดยเฉพาะอย่างยิ่งในการผลิต ตอนนี้ฉันใช้เทคนิคนี้หลายครั้งแล้วเพราะมันมีสัมผัสที่เบา - ไม่จำเป็นต้องมีมิดเดิลแวร์ที่น่ารำคาญหรือแอปพลิเคชัน Django ของบุคคลที่สาม
ตัวอย่างเช่นในการกำหนดโปรไฟล์มุมมองเฉพาะที่ดูเหมือนว่าจะทำงานช้าคุณสามารถแตกเปิดเชลล์และพิมพ์รหัสนี้:
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()
เพื่อให้เห็นภาพบันทึกผลลัพธ์ฉันได้ใช้ hotshot2cachegrind:
แต่ก็มีตัวเลือกอื่นเช่นกัน:
เมื่อมุมมองไม่ใช่ HTML เช่น JSON ให้ใช้วิธีมิดเดิลแวร์แบบง่ายสำหรับการทำโปรไฟล์
นี่คือตัวอย่างสองสามตัวอย่าง:
https://gist.github.com/1229685 - จับการโทร sql ทั้งหมดเข้าสู่มุมมอง
https://gist.github.com/1229681 - โปรไฟล์การเรียกวิธีการทั้งหมดที่ใช้ในการสร้างมุมมอง
ฉันต้องการโปรไฟล์แอป Django เมื่อเร็ว ๆ นี้และลองทำตามคำแนะนำเหล่านี้มากมาย ฉันลงเอยด้วยการใช้pyinstrumentแทนซึ่งสามารถเพิ่มลงในแอป Django โดยใช้การอัปเดตรายการมิดเดิลแวร์เพียงครั้งเดียวและให้มุมมองการกำหนดเวลาตามสแต็ก
สรุปประสบการณ์ของฉันโดยย่อเกี่ยวกับเครื่องมืออื่น ๆ :
pyinstrument
cProfile
กำหนดเวลาและแสดงการกำหนดเวลาของ ajax โดยอัตโนมัติซึ่งทั้งสองอย่างนี้มีประโยชน์มากเมื่อเทียบกับเครื่องมืออื่น ๆ ที่ฉันลองpyinstrument
ติดตั้งและใช้งานง่ายกว่ามาก