개발을 진행하다보면 어느 순간에는 성능 문제를 겪기 마련입니다. 이전까지 잘 작동하던 코드가 트래픽이 많아짐에 따라서 문제가 될 수도 있고, 쌓이는 데이터의 양이 많아짐에 따라 문제가 될 수도 있습니다. 이 때 Django의 silk 프로파일러를 활용한다면 좀 더 쉽게 병목 구간을 찾을 수 있습니다.
https://github.com/jazzband/django-silk
silk 설치
pip install django-silk
MIDDLEWARE 추가
# Use this variable in list of middleware
MIDDLEWARE = [
...
'silk.middleware.SilkyMiddleware',
...
]
silk를 사용하기 위해 MIDDLEWARE에 class를 추가하여 줍니다.
urls.py 추가
urlpatterns += [url(r'^silk/', include('silk.urls', namespace='silk'))]
silk에 접속하기 위한 url을 설정합니다.
Migrate
python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic
silk를 사용하기 위해 migrate 및 UI를 위한 collectstatic을 합니다. 여기까지 했다면 사용을 위한 준비는 끝입니다.
silk 사용방법
위에서 설정한 url에 접속해보면 다음과 같은 페이지를 볼 수 있습니다. 요청했던 request를 누르면 다양한 정보들을 확인할 수 있습니다.
Profilling 이용하기
SILKY_PYTHON_PROFILER = True
settings.py에 위와 같은 옵션을 추가하여 주면 프로파일링 기능을 이용할 수 있습니다.
from silk.profiling.profiler import silk_profile
# 원하는 곳에 profile decorator 설정
@silk_profile(name='View Blog Post')
def post(request, post_id):
p = Post.objects.get(pk=post_id)
return render_to_response('post.html', {
'post': p
})
프로파일을 원하는 곳에 데코레이터를 적어주면, silk 페이지에서 좀 더 자세한 정보를 확인할 수 있습니다. (python의 cProfile을 활용한 데이터가 보여집니다)
이 페이지에서 실행 시간등을 유심히 살펴본다면 소스코드의 어느 곳에서 병목이 생기는지 명확히 파악할 수 있습니다.
이렇게 파악한 곳을 토대로 리팩토링을 하여 성능문제를 개선해 나가면 됩니다. 다만, 이 프로파일러 도구 하나에 의존하기보다는 Django debug toolbar, query_inspect, DB log와 같은 것들을 같이 활용하는 것이 좋습니다.
'SW개발 > Django' 카테고리의 다른 글
[Django]GenericForeignKey의 문제점 (feat. 안티패턴의 지름길) (0) | 2021.11.23 |
---|---|
[Django]1.11에서 3.2로 버전 업그레이드 방법 (마이그레이션) (0) | 2021.11.23 |
[Django]setUp() vs setUpTestData() 차이점 (0) | 2021.08.16 |
[Django]get_object() 란? (0) | 2021.08.13 |
[Django]GenericForeignKey, ContentType로 여러 모델과의 관계 맺기 (0) | 2021.08.06 |