Back to blog

Django Silk: Cara Debug & Profiling Query Django Biar Gak Lemot

Django Silk: Cara Debug & Profiling Query Django Biar Gak Lemot

djangopythonperformanceprofilingbackenddjango-silk

Django Silk: Cara Debug & Profiling Query Django Biar Gak Lemot

Kalau lu develop backend pakai Django, ada satu fase yang pasti bakal kejadian:

“Kok endpoint ini makin lama makin lambat ya?”

Awalnya API masih ngebut.

User dikit → aman.

Data dikit → aman.

Tapi pas data mulai banyak…

  • query N+1 muncul
  • response time naik
  • CPU naik
  • endpoint random jadi 2–3 detik
  • pagination mulai berat

Nah, di titik itu biasanya kita butuh tool profiling.

Dan salah satu tool paling enak buat Django menurut gw adalah:

Apa Itu Django Silk?

Django Silk adalah profiling tool buat Django yang bisa bantu lu:

  • lihat query SQL
  • cek endpoint paling lambat
  • profiling function
  • lihat duplicate query
  • cek request/response
  • profiling time per request
  • inspect headers/body
  • cek bottleneck aplikasi

Kurang lebih mirip mini APM buat local development.

Install Django Silk

Install dulu:

pip install django-silk

Tambahin ke INSTALLED_APPS:

INSTALLED_APPS = [ ... "silk", ]

Tambahin middleware:

MIDDLEWARE = [ ... "silk.middleware.SilkyMiddleware", ]

Tambahin URL:

urlpatterns = [ ... path("silk/", include("silk.urls", namespace="silk")), ]

Migration:

python manage.py migrate

Run server:

python manage.py runserver

Buka:

http://localhost:8000/silk/

Done 🔥

Yang Bisa Dilihat di Django Silk

Begitu buka dashboard-nya, lu bakal lihat:

  • daftar request
  • response time
  • jumlah query
  • duplicate query
  • profiling detail
  • body request
  • headers
  • SQL query lengkap

Dan ini super membantu buat nemuin bottleneck.

Contoh Kasus Query N+1

Misalnya lu punya model:

class Author(models.Model): name = models.CharField(max_length=255)

class Book(models.Model): author = models.ForeignKey( Author, on_delete=models.CASCADE )

title = models.CharField(max\_length=255)

Terus lu bikin endpoint:

books = Book.objects.all()

for book in books: print(book.author.name)

Kelihatannya normal.

Padahal…

  • 1 query buat books
  • N query buat author

Kalau ada 100 books?

Jadi 101 query 😭

Nah Silk bakal langsung nunjukin duplicate query itu.

Solusi: select_related

Optimasi gampangnya:

books = Book.objects.select_related("author")

Sekarang cuma jadi:

SELECT ... FROM book JOIN author ...

1 query doang 🔥

Dan Silk bakal nunjukin response time turun drastis.

Cek Endpoint Paling Lambat

Silk juga enak buat ngecek endpoint mana yang paling berat.

Biasanya pattern-nya:

EndpointProblem/api/hometerlalu banyak query/api/profileserializer nested kebanyakan/api/feedpagination berat/api/searchquery LIKE liar/api/dashboardaggregasi kebanyakan

Lu bisa lihat:

  • total query
  • waktu SQL
  • waktu rendering
  • total response time

Jadi gampang pinpoint masalah.

Profiling Function

Silk juga support profiling function.

Contoh:

from silk.profiling.profiler import silk_profile

@silk_profile(name="generate report") def generate_report(): ...

Nanti function itu muncul di dashboard profiling.

Enak banget buat:

  • cron job
  • ETL
  • export CSV
  • aggregation
  • background processing

Silk vs Django Debug Toolbar

Orang sering compare Silk sama Django Debug Toolbar.

Menurut gw:

ToolCocok BuatDjango Debug Toolbarfrontend template debuggingDjango SilkAPI & performance profiling

Kalau backend-heavy project, Silk biasanya lebih kepake.

Hati-Hati Pakai di Production

Silk nyimpen request + query ke database.

Kalau dipasang di production tanpa limit:

  • DB bisa bengkak
  • storage naik
  • request makin berat

Biasanya solusi:

SILKY_MAX_RECORDED_REQUESTS = 100

Atau aktifin cuma di development:

if DEBUG: INSTALLED_APPS += ["silk"]

Tips Biar Django Tetep Ngebut

Selain pakai Silk, biasanya gw juga:

  • pakai select_related
  • pakai prefetch_related
  • hindari serializer nested terlalu dalam
  • cache query berat
  • pagination wajib
  • hindari .all() tanpa limit
  • cek indexing PostgreSQL
  • jangan looping query di serializer

Karena mayoritas performance issue Django itu sebenarnya:

bukan framework-nya lambat, tapi query-nya 😭

Penutup

Django Silk menurut gw salah satu tool wajib kalau lu develop backend Django serius.

Terutama pas:

  • traffic mulai naik
  • endpoint makin banyak
  • query makin kompleks
  • latency mulai aneh

Kadang optimasi kecil kayak:

  • select_related
  • cache
  • indexing

bisa nurunin response time dari:

  • 2 detik → 200ms

Dan Silk bikin proses nyari bottleneck jadi jauh lebih gampang.

Happy profiling 🔥