“django silk”는 데이터베이스 쿼리를 포함하여 요청-응답 주기를 기록하고 분석하는 Django 애플리케이션용 프로파일링 도구입니다.
상세한 프로파일링 정보와 시각화를 제공하여 N+1 쿼리를 포함한 성능 병목 현상을 식별할 수 있습니다.
특히 ORM을 통해 장고 내부적으로 사용하는 쿼리를 바로 확인 할 수도 있습니다.
이를 사용하여 최적화가 필요한 코드 영역을 찾아낼 수 있습니다.
django silk 설치 및 설정
우선 pip로 django-silk를 설치 합니다.
pip install django-silk
settings.py 설정 추가
settings.py 에 다음을 추가합니다.
note :
- silk는 middleware의 순서에 굉장히 민감합니다.
- process_request을 반환하는 middleware가 있다면 이 보다 위에 두어야합니다.
MIDDLEWARE = [
...
'silk.middleware.SilkyMiddleware',
...
]
INSTALLED_APPS = (
...
'silk'
)
urls.py 패턴 추가
장고 silk에 대한 UI에 접근하기 위해서 urls.py를 다음을 추가해줍니다.
urlpatterns += [path('silk/', include('silk.urls', namespace='silk'))]
migration
migrate 하기 전에 다음 명령어를 실행합니다.
python manage.py migrate
이제 설치 및 설정은 완료 되었습니다.
runserver를 하고 요청을 하게 되면 localhost:8000/silk/에서 어떤 요청이 있었고 어떤 쿼리를 사용했으며 몇 초가 걸렸는지 등을 대시보드에서 확인 할 수 있습니다.
django silk 에서 제공해주는 데이터
Summary
summary에서는 다음과 같은 정보를 보여줍니다.
- 전체적으로 가장 시간이 많이 소요된 요청
- DB에서 가장 시간이 많이 소요된 요청
- DB에서 가장 많이 발생된 쿼리
해당 정보를 가지고 어떤 요청들이 있었고 서버에 부하가 걸리는 요청은 무엇이었는지 확인 할 수 있습니다.
Request
좌상단 메뉴에서 Request를 클릭해서 들어갈 수 있습니다.
해당 프로젝트에서 발생된 모든 요청들을 해당 페이지에서 확인 할 수 있습니다.
페이지 당 몇개의 요청을 볼 것인지 설정 할 수 있으며 정렬, 필터를 통해 관리자가 관심있는 요청들을 찾아 볼 수 있습니다.
SQL
장고에서 ORM으로 DB에 쿼리를 요청하더라도 실제 돌아가는 쿼리문이 무엇인지 확인 할 수 있습니다.
SQL 메뉴에 들어가면 확인 할 수 있습니다.
Profiling
Python의 내장 cProfile 프로파일러를 사용하려면 SILKY_PYTHON_PROFILER 설정을 켜야 합니다.
각 요청은 별도로 프로파일링되며 프로파일러의 출력은 Silk UI의 요청 프로파일링 페이지에서 사용할 수 있습니다.
NOTE:
Python 3.12부터 cProfile은 동시에 실행할 수 없으므로 Python 3.12 이상에서 django-silk는 다른 프로필이 실행 중인 경우(다른 스레드에 있는 자체 프로필러라도) 프로필을 작성하지 않습니다.
SILKY_PYTHON_PROFILER = True
SILKY_PYTHON_PROFILER_BINARY = True
SILKY_PYTHON_PROFILER
이 활성화되면 gprof2dot 및 viz.js를 사용하여 생성된 그래프 시각화가 프로필 세부 정보 페이지에 표시됩니다.
django silk 기록 수 제한
Silky Garbage가 오래된 요청/응답 데이터를 수집하도록 하기 위해 구성 변수가 저장하는 요청/응답 행 수를 제한하도록 설정할 수 있습니다.
SILKY_MAX_RECORDED_REQUESTS = 10**4
쿼리 분석
DBMS에서 지원하는 경우 쿼리 분석을 활성화하려면 분석 기능을 사용할 수 있습니다.
SILKY_ANALYZE_QUERIES = True
WARNING: 이 설정을 사용하면 백엔드에 따라 데이터베이스가 동일한 쿼리를 두 번 실행할 수 있습니다. 예를 들어 Postgres의 EXPLAIN ANALYZE는 실제로 쿼리를 실행하므로 예기치 않은 데이터 업데이트가 발생할 수 있습니다. 주의해서 True로 설정해주세요.
민감한 정보 마스킹
기본적으로 Silk는 다음 키를 포함하는 값을 필터링합니다(대소문자를 구분하지 않음).
SILKY_SENSITIVE_KEYS = {'username', 'api', 'token', 'key', 'secret', 'password', 'signature'}
추가로 마스킹하고 싶은 정보는 해당 변수에 추가하면 됩니다.
django silk 로그 데이터 삭제
다음 명령어는 기록된 모든 데이터를 삭제합니다.
python manage.py silk_clear_request_log