Mengoptimalkan kinerja Keycloak lewat tuning JVM, database pool, dan cache, lalu memantau dengan metrik Prometheus, dashboard Grafana, JMX, hingga perencanaan kapasitas untuk pertumbuhan pengguna.

Di episode 27 kalian membangun cluster yang tahan gagal. Episode 28 ini membuatnya cepat dan terukur: performance tuning agar Keycloak melayani banyak login tanpa membengkak, dan monitoring agar kalian tahu kapan harus bertindak sebelum pengguna mengeluh. Tuning tanpa metrik adalah menebak; metrik tanpa tuning adalah menonton.
Keycloak berjalan di atas JVM, dan memori adalah pengaturan pertama yang harus diperhatikan:
KC_HEAP. Heap yang terlalu kecil memicu GC terus-menerus; terlalu besar menyia-nyiakan RAM dan memperlama GC.KC_HEAP=2g \
KC_DB_POOL_MIN_SIZE=5 \
KC_DB_POOL_MAX_SIZE=50 \
kc.sh startKC_HEAP=2g menetapkan batas memori; KC_DB_POOL_MIN_SIZE dan KC_DB_POOL_MAX_SIZE mengatur jumlah koneksi database. Untuk instance kecil mulai dari 2 GB heap; untuk beban enterprise dengan ribuan login bersamaan, naikkan bertahap sambil mengamati metrik. Setiap penambahan node cluster (episode 27) juga berarti menambah permintaan ke database — sesuaikan pool di kedua sisi.
Sebagai aturan praktis: ubah satu variabel pada satu waktu, lalu amati dampaknya terhadap response time dan GC. Mengubah heap, pool, dan cache sekaligus membuat kalian tidak tahu perubahan mana yang sebenarnya berpengaruh.
Sebagian besar kecepatan Keycloak berasal dari cache Infinispan. Cache yang relevan:
| Cache | Isi | Efek kalau terlalu kecil |
|---|---|---|
realms | konfigurasi realm | login lambat, sering reload config |
users | profil user ter-cache | query user lebih banyak ke database |
authorization | resource, policy, permission | evaluasi otorisasi melambat |
sessions | sesi aktif | user sering ter-logout, sesi hilang |
offlineSessions | sesi offline | token offline sering gagal |
Ukuran cache harus cukup untuk menampung populasi user aktif, tapi jangan boros memori. Cache invalidation dikelola Keycloak secara otomatis saat data berubah; dalam cluster, perubahan di satu node disebarkan lewat JGroups sehingga cache tetap konsisten. Untuk beban sangat besar, session store bisa dipindahkan ke database agar memori tidak penuh — trade-off antara kecepatan dan skala yang harus kalian putuskan berdasarkan pengukuran, bukan perasaan.
Tanpa pengamatan, tuning tidak ada arahnya. Aktifkan metrik Keycloak:
KC_METRICS_ENABLED=true kc.sh start --optimizedDengan KC_METRICS_ENABLED=true, Keycloak memaparkan metrik Prometheus di endpoint /metrics. Prometheus lalu menariknya secara berkala:
scrape_configs:
- job_name: keycloak
metrics_path: /metrics
static_configs:
- targets: ["sso.example.com:8080"]Data metrik kemudian divisualkan dengan dashboard Grafana — banyak dashboard Keycloak community yang siap pakai. Untuk detail internal JVM, gunakan JMX (misalnya lewat JConsole atau ekspor ke Prometheus dengan JMX exporter). Log terpusat memakai ELK atau Loki membantu korelasi antar node; APM (Application Performance Monitoring) memberi jejak permintaan dari load balancer sampai database.
Setelah metrik masuk, susun alerting: alarm login rate yang turun, error rate yang naik, dan cache hit ratio yang turun adalah tiga pemicu yang paling sering menyelamatkan tim dari insiden. Grafana bisa dihubungkan ke Alertmanager atau notifikasi lain, sehingga respons tidak bergantung pada siapa yang kebetulan membuka dashboard.
Inilah metrik yang sebaiknya selalu kalian pantau:
| Metrik | Arti | Tanda Bahaya |
|---|---|---|
| Login throughput | jumlah login per detik | Turun mendadak saat beban naik |
| Token generation rate | token yang diterbitkan per detik | Melonjak tanpa sebab |
| Response times | latensi endpoint login dan token | Naik terus = ada bottleneck |
| Error rates | persentase request gagal | 5xx meningkat = gangguan |
| Cache hit ratios | proporsi akses yang terpenuhi dari cache | Turun = sizing cache salah |
| DB connection pool | pemakaian pool database | Habis = request mengantre |
| JVM memory | heap terpakai dan frekuensi GC | Heap mendekati batas |
Selain metrik Prometheus, manfaatkan endpoint health yang sudah dipakai di episode 27: /health/live untuk kelayakan proses, /health/ready untuk kesiapan melayani, dan /health/started untuk status startup. Alarm kesehatan inilah yang memberi tahu load balancer dan tim on-call kalian.
Monitoring menjawab "apa yang terjadi sekarang"; capacity planning menjawab "apa yang terjadi bulan depan":
Proses yang disarankan untuk capacity planning:
Tip
Simpan baseline saat beban normal. Saat terjadi insiden, membandingkan metrik dengan baseline jauh lebih informatif daripada melihat angka absolut — misalnya "cache hit ratio turun dari 98 persen menjadi 80 persen" langsung menunjukkan masalah sizing cache.
Episode 28 melengkapi cluster kalian dengan kecepatan dan penglihatan: tuning JVM lewat KC_HEAP, pool database, dan cache; metrik Prometheus lewat KC_METRICS_ENABLED=true; visualisasi Grafana; pengamatan JMX dan log terpusat; metrik-metrik kunci; serta capacity planning berbasis tren.
Inti yang harus dibawa pulang:
realms, users, sessions.live, ready, started memberi sinyal ke load balancer dan alerting.Di episode 29 berikutnya, kalian melindungi semua kerja keras ini: backup, disaster recovery & upgrades — dari backup database dan konfigurasi, RTO dan RPO, sampai upgrade versi yang aman.