Silk 설명
Django Silk는 라이브되고 있는 서버의 부하 지점을 알아낼 수 있는 프로파일링 툴이다.
Django를 활용하면서 Query문의 성능을 확인하여야 할 경우가 있다. Query문을 튜닝한다던가? 혹은 병목을 확인하기
위해서 활용될 경우인데 이 경우에 활용될 수 있는 툴이 2가지 방식이 있다
1. Django-debug-toolbar
2. Silk
그러나 Django-debug-toolbar(이하 DJDT라고함) 같은 경우는 로컬에서만 가능하기 때문에 실제 서비스중인 서버에선 활용하지 못한다는 단점이 있다.
그렇기 때문에 Silk를 활용하여, 라이브로 활용하여 처리 하였다.
아래는 설치방법을 정리해두었다.
기본적으로 큰 흐름은 아래와 같다.
내 프로젝트에 접목은 아래와 같이 진행하였다.
Django silk를 설치해준다.
pip install django-silk
다음은 미들웨어에 skil를 추가해준다.
'silk.middleware.SilkyMiddleware',
미들웨어에 추가한 후, installed_app에 silk를 추가해준다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
"""
중략
"""
#위와 같이 추가해준다.
'silk',
]
마지막으로 내 프로젝트 최상단?에 URL을 추가해준다.
다른건 중요하지 않고, (다른 URL은 내 프로젝트이다..) 3번쨰 줄에 silk만 추가해주면 된다.
마지막으로 makemigraions, migrate 명령어로 DB에 알려준다.
이제 내가 원하는 View내부 쿼리의 성능을 시험해 볼 수 있다.
아래는 실제 내 프로젝트의 기능중 하나이므로 사람마다 구조는 다를 수 있다.
# Silk_profile 추가!!!
from silk.profiling.profiler import silk_profile
class HomeView(ListView):
model = Cafe
paginate_by = 12
paginate_orphans = 5
ordering = ['created']
context_object_name = 'cafes'
# 아래와 같이 내가 체크하고자 하는 함수에 데코레이터를 활용하여 Silk를 활용한다.
@silk_profile()
def get_context_data(self, **kwargs):
cafe = Cafe.objects.all()
if isinstance(cafe, QuerySet):
print('Query Set 스타트')
print(cafe.query)
# print(City.continent.objects.all())
context = super().get_context_data(**kwargs)
context["cityList"] = City.objects.all()
return context
이제 URL에 지정한 경로로 들어가면 위와 같은 페이지를 확인 할 수 있고,
데코레이터를 붙인 Url에 대해서 응답이 오기까지 걸린 시간과 쿼리 총 갯수, 쿼리 시간을 다 확인할 수 있다.
이제 내가 확인해보고 싶은 url을 들어간 후 좌측 상단에 SQL을 클릭하면, 아래와 같은 목록을 확인 할 수 있다.
실제 내가 사용하는 쿼리문들의 상세를 확인할 수 있다 맨 왼쪽은 걸린시간이다.
저 중에서 내가 확인해보고자 하는 부분(내가 보고자하는 데이터베이스의 쿼리를 보면??) 설명하기가 좀 어려운거같다...
하튼 눌러보면 아래와 같은 목록들이 나온다.(원래 더 나오는데 필요없는 부분이라 중략했다.)
이렇게 내가 불러오는 쿼리문의 요청시간을 확인 할 수 있다.
해당 정보들의 원래 좌표는 아래와 같다
https://www.youtube.com/watch?v=HpMYWk566OA
'프로그래밍 > Django' 카테고리의 다른 글
[Django] 멀티 DB 라우터설정 및 연동하기 (0) | 2022.05.11 |
---|---|
[Django][에러노트]raise ValueError, "No frame marked with %s." % fname (0) | 2022.05.07 |
[Django][Python]QuerySet N+1 prblem 해결하기 (0) | 2022.04.06 |
[Django][Python]QuerySet 캐싱을 통해 문제 해결하기 (0) | 2022.04.06 |
[Django][Python]QuerySet을 통해 알아보는 ORM의 특징 (0) | 2022.04.06 |