Tuning PgBouncer di VPS Sederhana untuk Beban Bursty
Konfigurasi PgBouncer yang berhasil menahan trafik POS bursty di VPS 2 vCPU. Pilihan mode pooling, max_client_conn, dan default_pool_size.
Wafik Ulinnuha
Backend Developer
Saat trafik POS Gatsu mulai meningkat, gejala pertama bukan CPU yang tinggi, melainkan koneksi yang menggantung. PostgreSQL kami sebenarnya idle, tapi klien tidak bisa mendapatkan slot. Solusinya: pasang PgBouncer dengan baik.
Mode pooling: transaction hampir selalu
Untuk web app yang stateless seperti POS, transaction pooling memberikan rasio multiplexing terbaik. Yang perlu disesuaikan:
- Hindari
SET SESSIONdi kode aplikasi — gunakanSET LOCALdi dalam transaksi. - Cursor server-side (
DECLARE CURSOR) tidak akan bekerja; pakai cursor client-side atau pagination biasa. - Prepared statement: gunakan
server_reset_query_always = 1dan pastikan ORM kamu tidak mengandalkan plan cache lintas transaksi.
Angka yang saya pakai untuk VPS 2 vCPU / 4 GB
[databases]
gatsu = host=127.0.0.1 dbname=gatsu_prod
[pgbouncer]
pool_mode = transaction
max_client_conn = 600
default_pool_size = 25
reserve_pool_size = 5
reserve_pool_timeout = 3
server_lifetime = 1200
server_idle_timeout = 60
query_wait_timeout = 30
ignore_startup_parameters = extra_float_digits
Beberapa catatan:
default_pool_size = 25berarti maksimal 25 koneksi nyata ke PostgreSQL per database. Sesuaikan denganmax_connectionsdi Postgres dan jumlah pool yang kamu punya. Rumus kasar:max_connections ≥ Σ pool_size + superuser_reserve + 10.max_client_conn = 600berarti hingga 600 klien bisa "merasa" terkoneksi sekaligus. Cocok dengan keep-alive HTTP yang panjang.reserve_pool_sizekecil tapi krusial saat trafik bursty: ia memberi nafas saat antrian sudah penuh.
Memantau dengan benar
Saya selalu pasang dashboard sederhana untuk metrik berikut:
SHOW POOLS— apakahcl_waitingsering > 0? Itu sinyal pool size kurang.SHOW STATS—avg_query_timeper database. Lompatan tiba-tiba di sini biasanya bukan masalah PgBouncer, tapi query yang tidak ber-index.- p95 latency dari sisi aplikasi. PgBouncer dapat menyembunyikan masalah Postgres jika hanya melihat dari satu sisi.
Hal yang ingin saya ketahui lebih awal
PgBouncer adalah komponen kritikal yang sering diperlakukan sebagai konfigurasi sekali pasang. Kenyataannya, angka-angka di atas akan berubah seiring pertumbuhan trafik. Buat alarm proaktif untuk cl_waiting sebelum pengguna melapor.
Bacaan lanjutan
Bacaan lanjutan
Membawa Elysia.js + Bun ke Produksi: Yang Tidak Tertulis di Docs
Bun cepat dan Elysia ergonomis. Tapi pindah dari demo ke produksi memerlukan keputusan operasional yang tidak dibahas di README.
Mendesain SaaS Multi-Tenant di PostgreSQL Tanpa Menyesal
Pemilihan strategi multi-tenant menentukan biaya operasional, keamanan, dan kemudahan migrasi sekian tahun ke depan. Inilah panduan jujur dari pengalaman membangun Gatsu.