โปรไฟล์ Django


101

แอปพลิเคชัน django ของฉันทำงานช้าลงอย่างเจ็บปวด อาจเป็นเพราะคำค้นหาที่ซับซ้อนหรือไม่ได้จัดทำดัชนี

มีวิธี django-ish ในการกำหนดโปรไฟล์แอปพลิเคชันของฉันหรือไม่?

คำตอบ:


82

ลอง Django Debug Toolbar จะแสดงให้คุณเห็นว่ามีการดำเนินการสืบค้นใดในแต่ละหน้าและใช้เวลาเท่าใด เป็นเครื่องมือที่มีประโยชน์มีประสิทธิภาพและใช้งานง่าย

นอกจากนี้อ่านคำแนะนำเกี่ยวกับประสิทธิภาพของ Django ในการเพิ่มประสิทธิภาพการเข้าถึงฐานข้อมูลจากเอกสารประกอบ

และเคล็ดลับการแสดง Djangoโดย Jacob Kaplan-Moss


14
ระวัง Django Debug Toolbar - ฉันปิดมันในระหว่างการพัฒนาและการเรนเดอร์เพจเร็วขึ้นอย่างมากบนแล็ปท็อป (ที่ใช้พลังงานต่ำ) ของฉัน - ดูในเซิร์ฟเวอร์ dev เพื่อดูว่าคุณกำลังดาวน์โหลดข้อมูลมากแค่ไหน
Dominic Rodger

2
django-debug-toolbar ช่วยให้ฉันทราบว่า django-orm มีคำค้นหากี่คำที่เข้าสู่ db และเราสามารถดูได้ว่าฟังก์ชัน select_related () ทำอย่างไรให้เคล็ดลับการกดปุ่มน้อยลง
panchicore

12
@ dominic-rodger ฉันไม่ทราบว่า Debug Toolbar ทำให้กระบวนการต่างๆช้าลงแค่ไหน ข้อความค้นหา sql ของฉันมีขนาดเล็ก (30ms) แต่เวลาของ CPU สูงมาก (800ms) หน้าอื่นที่ฉันกำลังจูนมีเวลา sql 300ms และเวลา cpu 8000ms - ดังนั้นฉันจึงพยายามหาต้นตอของปัญหาต่อไป การปิด Django Toolbar เพื่อเร่งสิ่งต่างๆ 3 ปีต่อมายังคงมีความเกี่ยวข้อง
Esteban

2
@Esteban ขอบคุณมากสำหรับความคิดเห็นนี้ฉันรู้สึกแย่มากกับเวลา CPU ที่สูงอย่างน่าขันแถบเครื่องมือ dhango ใช้เวลา ด้วย django Profiling เวลา CPU อยู่ที่ประมาณ 30 วินาทีเมื่อฉันลบออกมันจะลดลงเหลือ 1.5 วินาที !!
noob Mama

28

เพียงพิมพ์ "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

7
code.google.com/p/django-profileเป็นแอปพลิเคชัน django โปรไฟล์ผู้ใช้ ไม่ได้ใช้เป็น django โปรไฟล์ :)
dzen

1
@dzen: ฮะจุดดีมันควรจะเป็น: code.google.com/p/django-profiling :-)
Tomasz Zieliński

1
ถ้าคุณสงสัยวิธีการอ่านทิ้ง Profiler หลังจากทำงานpython manage.py runprofileserver --prof-path=/path/to/dirทำตามบล็อกนี้: darkcoding.net/software/profiling-django-for-cpu-bound-apps
Neara

ใช่ฉันชอบโดยใช้ Google เพื่อค้นหาคำตอบอันดับต้น ๆ ของข้อความค้นหาคือ "เพียงแค่ Google สิ่งที่คุณจะไปถึงที่นี่"
Anna

โปรดทราบว่าhotshotได้เลิกใช้งานและนำออกใน Python 3 ดังนั้นคำตอบนี้และProfilingDjangoหน้า Wiki อาจไม่เกี่ยวข้องอีกต่อไปในปี 20202
Patryk Bratkowski

16

สำหรับโปรไฟล์การเข้าถึงข้อมูล (ซึ่งเป็นที่ที่คอขวดเป็นส่วนใหญ่ของเวลา) ตรวจสอบDjango-สด Profiler ไม่เหมือนกับ Django Debug Toolbar ที่จะรวบรวมข้อมูลจากคำขอทั้งหมดพร้อมกันและคุณสามารถเรียกใช้ในการใช้งานจริงได้โดยไม่ต้องมีค่าใช้จ่ายด้านประสิทธิภาพมากเกินไปหรือเปิดเผยแอปภายใน

ลองดูภาพหน้าจอนี้


20
ไม่รองรับ 1.6 ขึ้นไปไม่มีกิจกรรมนานกว่าหนึ่งปี
Han He

14

ปลั๊กไร้ยางอายที่นี่ แต่ฉันเพิ่งสร้างhttps://github.com/django-silk/silkเพื่อจุดประสงค์นี้ มันค่อนข้างคล้ายกับแถบเครื่องมือ django แต่มีประวัติการทำโปรไฟล์โค้ดและการควบคุมทุกอย่างที่ละเอียดยิ่งขึ้น


การรับปัญหามิดเดิลแวร์ 'ไม่พบตัวจัดการสำหรับคนตัดไม้ "silk.middleware"'
Naveen Agarwal


5

สำหรับแฟน ๆ 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:

แต่ก็มีตัวเลือกอื่นเช่นกัน:


3

เมื่อมุมมองไม่ใช่ HTML เช่น JSON ให้ใช้วิธีมิดเดิลแวร์แบบง่ายสำหรับการทำโปรไฟล์

นี่คือตัวอย่างสองสามตัวอย่าง:

https://gist.github.com/1229685 - จับการโทร sql ทั้งหมดเข้าสู่มุมมอง

https://gist.github.com/1229681 - โปรไฟล์การเรียกวิธีการทั้งหมดที่ใช้ในการสร้างมุมมอง


0

ฉันต้องการโปรไฟล์แอป Django เมื่อเร็ว ๆ นี้และลองทำตามคำแนะนำเหล่านี้มากมาย ฉันลงเอยด้วยการใช้pyinstrumentแทนซึ่งสามารถเพิ่มลงในแอป Django โดยใช้การอัปเดตรายการมิดเดิลแวร์เพียงครั้งเดียวและให้มุมมองการกำหนดเวลาตามสแต็ก

สรุปประสบการณ์ของฉันโดยย่อเกี่ยวกับเครื่องมืออื่น ๆ :

  • Django Debug Toolbarนั้นยอดเยี่ยมหากคุณปัญหาเกิดจากการสืบค้น SQL และทำงานร่วมกับไฟล์pyinstrument
  • django-silkทำงานได้ดี แต่ต้องเพิ่มตัวจัดการบริบทหรือมัณฑนากรในแต่ละส่วนของสแต็กที่คุณต้องการกำหนดเวลาคำขอย่อย นอกจากนี้ยังมีวิธีง่ายๆในการเข้าถึงการcProfileกำหนดเวลาและแสดงการกำหนดเวลาของ ajax โดยอัตโนมัติซึ่งทั้งสองอย่างนี้มีประโยชน์มาก
  • djdt-flamegraphดูดี แต่หน้าไม่เคยแสดงบนระบบของฉันเลย

เมื่อเทียบกับเครื่องมืออื่น ๆ ที่ฉันลองpyinstrumentติดตั้งและใช้งานง่ายกว่ามาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.