I can do it(Feat. DEV)

[Django Silk]로 성능 최적화 및 분석 시작하기! 본문

개발자 모드/응용

[Django Silk]로 성능 최적화 및 분석 시작하기!

까짓거 해보자 개발자 2025. 3. 12. 16:55
728x90
포스팅 계기

 

최근 Django DRF를 사용해 API를 개발하면서 요청-응답 속도가 매우 느리게 나오는 이슈를 경험함. 이를 해결하기 위해 여러 방법을 시도했는데, 그중에서도 모든 데이터를 쿼리해오는 것이 아니라 상황에 맞는 데이터만 최대한 가져오는 방식으로 쿼리셋을 최적화하는 등 여러 가지 개선을 해봤음. 하지만 이 과정에서 여전히 불편한 점이 많았음.

 

그 중 하나가 바로 기존에 사용하고 있던 Django Debug Toolbar 라이브러리였음. 이 툴은 swagger에서 요청-응답 속도를 확인할 수 없어서, 따로 서버에서 디버그 모드로 수동으로 확인하며 성능을 체크해야 했음. 이런 방식이 시간이 많이 걸리고 비효율적이라 느꼈고, 응답 속도뿐만 아니라 성능 최적화에 도움이 되는 다른 라이브러리가 필요하다고 생각함.

 

이런 고민을 해결할 수 있는 라이브러리로 Django Silk를 알게 되었고, 이번 포스팅에서는 Django Silk가 무엇인지, 어떻게 사용하는지 알아보겠음.😋(매우 간단한 건 안 비밀~🤫)

 

https://github.com/jazzband/django-silk

 

GitHub - jazzband/django-silk: Silky smooth profiling for Django

Silky smooth profiling for Django. Contribute to jazzband/django-silk development by creating an account on GitHub.

github.com

 


※ Django Silk란?
Django Silk는 Django 애플리케이션의 성능을 분석하고 최적화하는 데 도움을 주는 프로파일링 도구임. Silk는 요청-응답 주기의 성능을 실시간으로 모니터링하고, 데이터베이스 쿼리의 실행 시간과 빈도를 분석하여 애플리케이션의 성능 병목 지점을 식별할 수 있게 도와줌.

Django Silk 설치 및 설정 방법

 

1. Django Silk 설치

pip install django-silk

 

2. INSTALLED_APPS에 추가

 

settings.py 파일에서 INSTALLED_APPS에 'silk'를 추가함

INSTALLED_APPS = [
    # 기존 앱들...
    'silk',
]

 

 

3. MIDDLEWARE에 추가

 

MIDDLEWARE에 SilkyMiddleware를 추가함

 

MIDDLEWARE = [
    # 기존 미들웨어들...
    'silk.middleware.SilkyMiddleware',
]

 

주의: SilkyMiddleware는 일반적으로 세션 미들웨어와 인증 미들웨어 사이에 배치하는 것이 좋음.

 

4. urls.py에 Silk URL 패턴 추가

 

urls.py에 Silk의 URL 패턴을 추가하여 대시보드에 접근할 수 있도록 설정함:

 

from django.urls import path, include

urlpatterns = [
    # 기존 URL 패턴들...
    path('silk/', include('silk.urls', namespace='silk')),
]

 

5. 데이터베이스 마이그레이션 및 정적 파일 수집(DB에 반영)

python manage.py migrate
python manage.py collectstatic

 


 

Django Silk 사용법

프로파일링 활성화

 

settings.py에 다음 설정을 추가하여 프로파일링 기능을 활성화함

SILKY_PYTHON_PROFILER = True

 

해당 기능을 추가하지 않으면 모든 요청이 프로파일링됨

 

또한 운영 환경에서 성능 부하를 줄이기 위해, 예를 들어, 특정 요청에 대해서만 프로파일링을 적용할 수 있음. 이를 위해 SILKY_INTERCEPT_PERCENT를 사용해 몇 퍼센트의 요청에 대해서만 프로파일링을 할지 결정할 수 있음.

SILKY_INTERCEPT_PERCENT = 5  # 5%의 요청만 프로파일링

 

 

특정 뷰에 프로파일링 적용

 

프로파일링을 원하는 뷰에 @silk_profile 데코레이터를 추가하여 성능 데이터를 수집함

from silk.profiling.profiler import silk_profile

@silk_profile(name='View Blog Post')
def post(request, post_id):
    p = Post.objects.get(pk=post_id)
    return render(request, 'post.html', {'post': p})

 

이렇게 설정하면 해당 뷰에 대한 성능 데이터가 Silk 대시보드에 표시됨.

 


실무 경험을 바탕으로 한 장단점

장점:

  • 상세한 성능 분석: Silk를 통해 각 요청에 대한 처리 시간, 데이터베이스 쿼리 실행 시간, 쿼리 빈도 등을 상세하게 분석할 수 있었음. 이를 통해 성능 병목이 발생하는 지점을 명확히 파악하고 최적화할 수 있었음.
  • 실시간 모니터링: Silk는 실시간으로 성능 데이터를 시각화해 주므로, 즉각적인 피드백을 제공하고 필요한 부분을 신속하게 최적화할 수 있었음.

단점:

  • 운영 환경에서의 데이터베이스 부하: Silk는 모든 요청과 응답 데이터를 데이터베이스에 저장함. 이로 인해 운영 환경에서 사용할 때 데이터베이스 부하가 증가할 수 있음. 이를 해결하려면, 프로파일링을 일부 트래픽에 대해서만 적용하도록 설정하는 것이 좋음.
  • 보안 및 개인정보 보호: Silk는 요청 및 응답 본문을 기록하는데, 이로 인해 민감한 정보가 노출될 수 있음. 이를 방지하기 위해 Silk의 설정을 통해 민감한 데이터를 마스킹하거나 제외하는 보안 조치가 필요함.

결론

Django Silk는 애플리케이션의 성능 분석과 최적화에 유용한 도구로, 개발 및 운영 환경에서 성능 모니터링을 쉽게 할 수 있게 도와줌. 다만 운영 환경에서의 데이터베이스 부하보안 문제를 고려하여 신중하게 사용해야 하며, 필요한 설정을 조정하여 최적의 성능을 유지하는 것이 중요할 듯.

 

Django Silk를 활용하여 애플리케이션의 성능을 정확하게 분석하고 최적화할 수 있었던 경험을 바탕으로, 앞으로의 프로젝트에도 큰 도움이 되지 않을까.. 생각함!! 그럼 다음에 또 찾아오겠음!🙂

 

 

728x90