Hồ sơ Django


98

Ứng dụng django của tôi đã trở nên chậm chạp trong quá trình sản xuất. Có thể là do một số truy vấn phức tạp hoặc không được lập chỉ mục.

Có cách nào django-ish để lập hồ sơ ứng dụng của tôi không?

Câu trả lời:


77

Hãy thử Thanh công cụ gỡ lỗi Django . Nó sẽ cho bạn biết những truy vấn nào được thực hiện trên mỗi trang và chúng mất bao nhiêu thời gian. Đó là một công cụ thực sự hữu ích, mạnh mẽ và dễ sử dụng.

Ngoài ra, hãy đọc các khuyến nghị về hiệu suất Django trong tối ưu hóa truy cập Cơ sở dữ liệu từ tài liệu.

mẹo biểu diễn Django của Jacob Kaplan-Moss.


13
Hãy để ý Thanh công cụ gỡ lỗi Django - Tôi đã tắt nó trong quá trình phát triển và kết xuất trang nhanh hơn đáng kể trên máy tính xách tay (được thừa nhận là công suất thấp) của tôi - hãy xem trong máy chủ nhà phát triển để xem lượng dữ liệu bạn đang tải xuống.
Dominic Rodger

2
django-debug-toolbar giúp tôi xem có bao nhiêu truy vấn django-orm truy cập vào db và chúng ta có thể thấy hàm select_osystem () thực hiện thủ thuật này ít hơn như thế nào.
panchicore

11
@ dominic-rodger Tôi không nhận ra rằng Thanh công cụ gỡ lỗi khiến mọi thứ xử lý chậm hơn bao nhiêu. Các truy vấn sql của tôi rất nhỏ (30ms) nhưng thời gian cpu rất cao (800ms). Một trang khác mà tôi đang điều chỉnh có thời gian sql là 300ms và thời gian cpu là 8000ms - vì vậy tôi tiếp tục cố gắng tìm ra nguồn gốc của vấn đề. Tắt Thanh công cụ Django để tăng tốc mọi thứ. 3 năm sau, vẫn còn phù hợp.
Esteban

2
@Esteban, cảm ơn rất nhiều vì nhận xét này, tôi thực sự đang phát điên vì thời lượng CPU quá cao, thanh công cụ dhango đã mất. Với cấu hình django, thời gian CPU là khoảng 30 giây, khi tôi gỡ bỏ nó, nó giảm xuống còn 1,5 giây !!
noob Mama,

28

Chỉ cần gõ "django-profiling" trên google, bạn sẽ nhận được các liên kết này (và hơn thế nữa):

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/

Cá nhân tôi đang sử dụng phương pháp tiếp cận phần mềm trung gian - tức là mỗi người dùng có thể chuyển đổi cờ "hồ sơ" được lưu trữ trong một phiên và nếu phần mềm trung gian hồ sơ của tôi nhận thấy rằng một cờ đã được đặt, nó sẽ sử dụng mô-đun hotshot của Python như thế này:

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

CHỈNH SỬA: Để lập hồ sơ truy vấn SQL, http://github.com/robhudson/django-debug-toolbar được Konstantin đề cập là một điều tuyệt vời - nhưng nếu các truy vấn của bạn thực sự chậm (có thể vì có hàng trăm hoặc hàng nghìn trong số chúng), thì bạn Tôi sẽ phải đợi một khoảng thời gian điên cuồng cho đến khi nó được tải vào trình duyệt - và sau đó sẽ rất khó duyệt do chậm. Ngoài ra, thanh công cụ django-debug-do thiết kế không thể cung cấp thông tin chi tiết hữu ích về nội bộ của các yêu cầu AJAX.

EDIT2: django-extensions có một lệnh cấu hình tuyệt vời được tích hợp sẵn:

https://github.com/django-extensions/django-extensions/blob/master/docs/runprofileserver.rst

Chỉ cần làm điều này và thì đấy:

$ mkdir /tmp/my-profile-data
$ ./manage.py runprofileserver --kcachegrind --prof-path=/tmp/my-profile-data

7
code.google.com/p/django-profile là ứng dụng django Hồ sơ người dùng. nó không được sử dụng làm hồ sơ django :)
dzen

1
@dzen: Hah, điểm tốt, nó có nghĩa là: code.google.com/p/django-profiling :-)
Tomasz Zieliński

1
nếu bạn tự hỏi làm thế nào để đọc kết xuất hồ sơ sau khi chạy python manage.py runprofileserver --prof-path=/path/to/dir, hãy theo dõi blog này: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
Neara

ah vâng, yêu thích của tôi, sử dụng google để tìm một trong những đầu câu trả lời cho câu hỏi của tôi là "chỉ cần google là điều bạn googled đến được đây?"
Anna

Lưu ý rằng hotshotđã không được dùng nữa và bị xóa trong Python 3, vì vậy câu trả lời này và ProfilingDjangotrang Wiki có thể không còn phù hợp vào năm 20202.
Patryk Bratkowski

16

Để truy cập dữ liệu hồ sơ (đây là nơi thường xuyên bị tắc nghẽn), hãy xem django-live-profiler . Không giống như Django Debug Toolbar, thanh công cụ này thu thập dữ liệu trên tất cả các yêu cầu đồng thời và bạn có thể chạy nó trong phiên bản sản xuất mà không cần quá nhiều chi phí về hiệu suất hoặc để lộ nội dung ứng dụng của bạn.

Kiểm tra ảnh chụp màn hình này


18
không hỗ trợ 1.6 trở lên, không có hoạt động trong hơn một năm.
Han He

14

Không biết xấu hổ cắm ở đây, nhưng gần đây tôi đã tạo https://github.com/django-silk/silk cho mục đích này. Nó hơi giống với thanh công cụ django nhưng có lịch sử, lập hồ sơ mã và kiểm soát chi tiết hơn đối với mọi thứ.


Bắt vấn đề middleware 'Không xử lý có thể được tìm thấy cho logger 'silk.middleware''
Naveen Agarwal


5

Đối với tất cả những người hâm mộ KCacheGrind, tôi thấy rất dễ dàng sử dụng shell song song với thử nghiệm tuyệt vời của Django Clientđể tạo nhật ký hồ sơ một cách nhanh chóng, đặc biệt là trong sản xuất. Bây giờ tôi đã sử dụng kỹ thuật này vài lần vì nó có một cái chạm nhẹ - không cần phần mềm trung gian khó chịu hoặc ứng dụng Django của bên thứ ba!

Ví dụ: để cấu hình một chế độ xem cụ thể có vẻ như đang chạy chậm, bạn có thể bẻ khóa trình bao và nhập mã này:

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()

Để hình dung nhật ký kết quả, tôi đã sử dụng hotshot2cachegrind:

Nhưng cũng có các tùy chọn khác:


3

Khi các dạng xem không phải là HTML, ví dụ như JSON, hãy sử dụng các phương pháp phần mềm trung gian đơn giản để lập hồ sơ.

Dưới đây là một số ví dụ:

https://gist.github.com/1229685 - thu thập tất cả các cuộc gọi sql đã được đưa vào chế độ xem

https://gist.github.com/1229681 - cấu hình tất cả các lệnh gọi phương thức được sử dụng để tạo chế độ xem


0

Gần đây, tôi cần lập hồ sơ một ứng dụng Django và đã thử nhiều đề xuất trong số này. Thay vào đó , tôi đã sử dụng pyinstrument , có thể được thêm vào ứng dụng Django bằng một bản cập nhật duy nhất cho danh sách phần mềm trung gian và cung cấp chế độ xem thời gian dựa trên ngăn xếp.

Tóm tắt nhanh về kinh nghiệm của tôi với một số công cụ khác:

  • Django Debug Toolbar thật tuyệt vời nếu bạn gặp sự cố là do các truy vấn SQL và hoạt động tốt khi kết hợp vớipyinstrument
  • django-silk hoạt động tốt, nhưng yêu cầu thêm trình quản lý ngữ cảnh hoặc trình trang trí vào từng phần của ngăn xếp mà bạn muốn định thời gian yêu cầu phụ. Nó cũng cung cấp một cách dễ dàng để truy cập cProfilethời gian và tự động hiển thị thời gian ajax, cả hai đều có thể thực sự hữu ích.
  • djdt-flamegraph trông có vẻ hứa hẹn, nhưng trang này chưa bao giờ thực sự hiển thị trên hệ thống của tôi.

So với các công cụ khác mà tôi đã thử, pyinstrumentcài đặt và sử dụng dễ dàng hơn đáng kể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.