Solusi Permasalahan Sorry Too Many Clients Already pada PostgreSQL

Masalah "batas koneksi tercapai" terjadi saat jumlah koneksi ke PostgreSQL melebihi nilai yang ditentukan oleh parameter max_connections. Artikel ini akan membahas penyebab, langkah pengecekan, dan solusi untuk memperbesar kapasitas koneksi.



Contoh Kasus

Saat aplikasi mencoba terhubung ke PostgreSQL, muncul pesan kesalahan seperti berikut:

FATAL: sorry, too many clients already

Pesan ini menunjukkan bahwa jumlah koneksi ke server telah mencapai batas maksimal (max_connections).


Penyebab Umum

  • Parameter max_connections terlalu kecil: Nilai default PostgreSQL adalah 100 koneksi.
  • Koneksi Tidak Dikelola dengan Baik: Koneksi tidak ditutup setelah digunakan.
  • Tidak Menggunakan Connection Pooling: Semua koneksi dibuat langsung tanpa pooling.
  • Lonjakan Beban Aplikasi: Aplikasi tiba-tiba meningkatkan jumlah permintaan koneksi.


Langkah-langkah Perbaikan


1. Periksa Nilai max_connections

Login ke PostgreSQL sebagai user admin:

sudo -u postgres psql


Lihat nilai max_connections saat ini:

SHOW max_connections;

Contoh output:

max_connections  

----------------  

100  


2. Perbesar Nilai max_connections

Buka file konfigurasi PostgreSQL (postgresql.conf):

sudo nano /etc/postgresql/<version>/main/postgresql.conf


Cari parameter max_connections dan ubah nilainya:

max_connections = 200

Simpan file dan keluar.


Restart PostgreSQL untuk menerapkan perubahan:

sudo systemctl restart postgresql


Verifikasi perubahan:

SHOW max_connections;


3. Periksa dan Sesuaikan Shared Memory

Meningkatkan max_connections membutuhkan penyesuaian shared memory PostgreSQL.


Periksa nilai shared memory saat ini:

SHOW shared_buffers;

Sesuaikan parameter shared memory di postgresql.conf:

shared_buffers = 128MB

Jika max_connections ditingkatkan secara signifikan, Anda mungkin perlu mengubah pengaturan kernel shared memory:


Edit file /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

Tambahkan atau ubah nilai berikut:

kernel.shmmax=268435456  # Adjust size as needed

kernel.shmall=2097152


Terapkan perubahan:

sudo sysctl -p


4. Gunakan Connection Pooling

Connection pooling memungkinkan penggunaan ulang koneksi untuk mengurangi beban server.


Instal PgBouncer, alat pooling populer:

sudo apt-get install pgbouncer

Konfigurasikan PgBouncer untuk aplikasi Anda:

Buka file konfigurasi PgBouncer (pgbouncer.ini):

sudo nano /etc/pgbouncer/pgbouncer.ini


Tambahkan atau ubah pengaturan berikut:

[databases]

mydb = host=127.0.0.1 port=5432 dbname=mydb


[pgbouncer]

listen_port = 6432

listen_addr = 0.0.0.0

pool_mode = session

max_client_conn = 1000

default_pool_size = 20


Restart PgBouncer:

sudo systemctl restart pgbouncer

Arahkan aplikasi untuk terhubung melalui PgBouncer (port 6432).


5. Periksa dan Tutup Koneksi Tidak Aktif

Periksa koneksi aktif:

SELECT * FROM pg_stat_activity;

Tutup koneksi idle atau tidak aktif:

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle' AND pid <> pg_backend_pid();


Tips Pencegahan

  • Gunakan connection pooling untuk meningkatkan efisiensi.
  • Pantau penggunaan koneksi secara berkala dengan query pg_stat_activity.
  • Dokumentasikan pengaturan dan perubahan konfigurasi untuk memudahkan debugging.
  • Skalakan server PostgreSQL jika beban aplikasi terus meningkat.


Pesan kesalahan "Batas Koneksi Tercapai" dapat diatasi dengan menyesuaikan max_connections, menggunakan connection pooling, dan memastikan manajemen koneksi yang baik. Dengan langkah-langkah di atas, dapat menjaga performa dan ketersediaan PostgreSQL untuk aplikasi, semoga bermanfaat mohon maaf jika ada informasi yang tidak sesuai.

Comments

Popular posts from this blog

Integrating PHP with Message Queues RabbitMQ Kafka

FastAPI and UVLoop: The Perfect Pair for Asynchronous API Development

Konfigurasi dan Instalasi PostgreSQL Secara Lengkap di Windows Linux dan MacOS