Serverless, Next.js ve mikroservis mimarilerinde 'too many clients already' ve RAM tüketimi kaynaklı OOM çökmelerini engelleyin; optimal PostgreSQL havuz boyutunu ve pgbouncer.ini kurallarını üretin.
PostgreSQL süreç başına ~12 MB bellek ayırır. 500 bağlantıyı doğrudan PostgreSQL'e açmak yaklaşık 5.9 GB bellek tüketir ve OOM Killer'ı tetikler. PgBouncer ile bu yük yalnızca ~205 MB seviyesine indirilmektedir.
PostgreSQL'e giden gerçek süreç sayısı ((vCPU * 2) + Disk)
PgBouncer'ın epoll ile aynı anda kabul ettiği istemci sayısı
5.7 GB fiziksel bellek tasarrufu
İşlem bazlı multiplexing
; /etc/pgbouncer/pgbouncer.ini ; PostgreSQL Yüksek Performanslı Bağlantı Havuzlayıcı Yapılandırması [databases] * = host=127.0.0.1 port=5432 auth_user=postgres [pgbouncer] logfile = /var/log/postgresql/pgbouncer.log pidfile = /var/run/postgresql/pgbouncer.pid listen_addr = 127.0.0.1 listen_port = 6432 auth_type = scram-sha-256 auth_file = /etc/pgbouncer/userlist.txt ; Havuzlama Modu ve Kapasite Sınırları pool_mode = transaction max_client_conn = 500 default_pool_size = 12 min_pool_size = 4 reserve_pool_size = 2 reserve_pool_timeout = 5 max_db_connections = 17 ; Zaman Aşımı ve Ağ Optimizasyonu server_idle_timeout = 600 client_idle_timeout = 0 client_login_timeout = 15 query_timeout = 0 server_connect_timeout = 15 server_login_retry = 15 ; TCP Keep-Alive tcp_keepalive = 1 tcp_keepidle = 300 tcp_keepinterval = 75
MySQL veya modern HTTP sunucularının aksine PostgreSQL, gelen her bir istemci bağlantısı için işletim sistemi düzeyinde tamamen ayrı bir alt süreç (fork edilmiş OS process) başlatır. Her bir PostgreSQL süreci boşta (idle) dahi olsa ortalama 8-12 MB fiziksel RAM işgal eder. Serverless fonksiyonların (Vercel, AWS Lambda) veya mikroservislerin anlık olarak 500-1.000 bağlantı açması, PostgreSQL'in gigabaytlarca belleği kilitlenmiş bağlantılara feda etmesine ve sunucunun kilitlenmesine yol açar.
PostgreSQL ekibi ve veritabanı mühendislerinin yıllarca süren kıyaslama testleri (benchmarks) göstermiştir ki, arka uçta çalışan gerçek PostgreSQL süreç sayısı donanım çekirdeği sınırını aştığında CPU bağlam değiştirme (context switching) maliyeti performansı çökertir. 4 çekirdekli bir NVMe sunucu için en yüksek verim yalnızca 12 ila 16 gerçek bağlantı ile elde edilir.
PgBouncer, son derece hafif bir C uygulaması olup epoll mimarisiyle 1.000 istemci için yalnızca ~2 MB RAM harcar.pool_mode = transaction seçildiğinde, uygulamanız bağlantıyı açık tutsa dahi PgBouncer arka uçtaki gerçek PostgreSQL bağlantısını yalnızca bir sorgu veya işlem (BEGIN ... COMMIT) çalışırken tahsis eder. İşlem tamamlandığı mikrosaniyede bağlantıyı diğer bekleyen istemciye devreder. Bu sayede 10.000 web kullanıcısı arka planda yalnızca 20-30 gerçek PostgreSQL bağlantısı ile sıfır gecikmeyle servis edilir.