[django] Django 프로파일 링
내 django 응용 프로그램이 프로덕션에서 고통스럽게 느려졌습니다. 아마도 복잡하거나 색인화되지 않은 쿼리 때문일 것입니다.
내 애플리케이션을 프로파일 링하는 django-ish 방법이 있습니까?
답변
Django Debug Toolbar를 사용해보십시오 . 각 페이지에서 실행되는 쿼리와 소요 시간이 표시됩니다. 정말 유용하고 강력하며 사용하기 쉬운 도구입니다.
또한 문서 에서 데이터베이스 액세스 최적화의 Django 성능에 대한 권장 사항을 읽어보십시오 .
그리고 장고 성능 정보 야곱 카플란 – 모스에 의해.
답변
Google에 “django-profiling”을 입력하면 다음과 같은 링크가 표시됩니다.
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
편집 : Konstantin이 언급 한 SQL 쿼리 http://github.com/robhudson/django-debug-toolbar 를 프로파일 링 하는 것은 좋은 일이지만 쿼리가 정말 느리다면 (아마도 수백 또는 수천 개가 있기 때문에) 브라우저에로드 될 때까지 엄청난 시간을 기다려야합니다. 그런 다음 속도가 느려서 탐색하기가 어려울 것입니다. 또한 django-debug-toolbar는 설계 상 AJAX 요청의 내부에 대한 유용한 정보를 제공 할 수 없습니다.
EDIT2 : django-extensions 에는 훌륭한 프로파일 링 명령이 내장되어 있습니다.
https://github.com/django-extensions/django-extensions/blob/master/docs/runprofileserver.rst
그냥 이렇게하고 짜잔 :
$ mkdir /tmp/my-profile-data
$ ./manage.py runprofileserver --kcachegrind --prof-path=/tmp/my-profile-data
답변
데이터 액세스를 프로파일 링하려면 (대부분 병목 현상이 발생하는) django-live-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 Debug Toolbar 는 문제가 SQL 쿼리로 인해 발생하고
pyinstrument
- django-silk 는 잘 작동하지만 하위 요청 타이밍을 원하는 스택의 각 부분에 컨텍스트 관리자 또는 데코레이터를 추가해야합니다. 또한
cProfile
타이밍 에 액세스하는 쉬운 방법을 제공하고 Ajax 타이밍을 자동으로 표시하므로 둘 다 정말 유용 할 수 있습니다. - djdt-flamegraph 는 유망 해 보였지만 페이지는 실제로 내 시스템에서 렌더링되지 않았습니다.
내가 시도한 다른 도구에 비해 pyinstrument
설치 및 사용이 훨씬 쉬웠습니다.