Bagaimana cara meningkatkan koneksi maks di postgres?

109

Saya menggunakan Postgres DB untuk produk saya. Saat melakukan penyisipan batch menggunakan slick 3, saya mendapatkan pesan kesalahan:

org.postgresql.util.PSQLException: FATAL: maaf, sudah terlalu banyak klien.

Operasi penyisipan batch saya akan lebih dari ribuan catatan. Koneksi maksimum untuk postgres saya adalah 100.

Bagaimana cara meningkatkan koneksi maks?

Jet
sumber
Gunakan kumpulan koneksi seperti pgBouncer atau pgPool
Frank Heikens
2
1. Pertama, periksa apakah middleware Anda tidak membuat terlalu banyak koneksi terbuka, atau membocorkannya. 2. (mungkin) selanjutnya gunakan koneksi pooler. 3. (hampir) tidak pernah menambah jumlah koneksi yang diizinkan pada jenis masalah ini, dalam banyak kasus hal ini akan memperburuk keadaan. (kecuali jika Anda benar-benar yakin)
joop

Jawaban:

221

Meningkatkan saja max_connectionsadalah ide yang buruk. Anda perlu meningkatkan shared_buffersdan kernel.shmmaxjuga.


Pertimbangan

max_connectionsmenentukan jumlah maksimum koneksi bersamaan ke server database. Standarnya biasanya 100 koneksi.

Sebelum meningkatkan jumlah koneksi, Anda mungkin perlu meningkatkan penerapan Anda. Tetapi sebelum itu, Anda harus mempertimbangkan apakah Anda benar-benar membutuhkan peningkatan batas koneksi.

Setiap koneksi PostgreSQL menggunakan RAM untuk mengelola koneksi atau klien menggunakannya. Semakin banyak koneksi yang Anda miliki, semakin banyak RAM yang akan Anda gunakan yang dapat digunakan untuk menjalankan database.

Aplikasi yang ditulis dengan baik biasanya tidak membutuhkan banyak koneksi. Jika Anda memiliki aplikasi yang membutuhkan banyak koneksi, pertimbangkan untuk menggunakan alat seperti pg_bouncer yang dapat mengumpulkan koneksi untuk Anda. Karena setiap koneksi menggunakan RAM, Anda harus berusaha meminimalkan penggunaannya.


Cara meningkatkan koneksi maks

1. Meningkatkan max_connectiondanshared_buffers

di /var/lib/pgsql/{version_number}/data/postgresql.conf

perubahan

max_connections = 100
shared_buffers = 24MB

untuk

max_connections = 300
shared_buffers = 80MB

The shared_buffersparameter konfigurasi menentukan berapa banyak memori yang didedikasikan untuk PostgreSQL untuk digunakan untuk caching data yang .

  • Jika Anda memiliki sistem dengan RAM 1GB atau lebih, nilai awal yang wajar untuk shared_buffers adalah 1/4 dari memori di sistem Anda.
  • sepertinya Anda tidak akan menemukan menggunakan lebih dari 40% RAM untuk bekerja lebih baik daripada jumlah yang lebih kecil (seperti 25%)
  • Ketahuilah bahwa jika sistem atau build PostgreSQL Anda 32-bit, mungkin tidak praktis untuk menyetel shared_buffers di atas 2 ~ 2.5GB.
  • Perhatikan bahwa di Windows, nilai besar untuk shared_buffers tidak seefektif itu, dan Anda mungkin menemukan hasil yang lebih baik dengan menjaganya tetap rendah dan lebih sering menggunakan cache OS. Di Windows, kisaran yang berguna adalah 64MB hingga 512MB .

2. Ubah kernel.shmmax

Anda perlu meningkatkan ukuran segmen kernel maks menjadi sedikit lebih besar dari shared_buffers.

Dalam file, /etc/sysctl.confatur parameter seperti yang ditunjukkan di bawah ini. Ini akan berlaku saat postgresqlreboot (Baris berikut membuat kernel maks 96Mb)

kernel.shmmax=100663296

Referensi

Koneksi Postgres Max Dan Buffer Bersama

Menyetel Server PostgreSQL Anda

Ankit
sumber
jawaban yang bagus. beberapa pertanyaan .. bagaimana 100663296 sama dengan 96MB? dan mengapa kita mengubah shmmax, apa fungsinya?
Robbo_UK
3
100663296 Bytes = 96 MB (dalam biner). shmmax adalah ukuran maksimum segmen memori bersama . Sekarang karena kami meningkatkan ukuran buffer bersama, kami perlu mengubah shmmax untuk mengakomodasi peningkatan memori untuk caching.
Ankit
1
@Robbo_UK 96 * 1024 * 1024 = 100663296
skrebbel
6
Anda dapat menggunakan PGTune untuk membantu Anda menentukan pengaturan ini untuk sistem Anda
Yoan Tournade
11
Periksa pengaturan kernel.shmmax Anda saat ini ( cat /proc/sys/kernel/shmmax) sebelum mengubahnya. Pada sistem modern ini sudah disetel sangat tinggi dan tidak boleh diubah. Milik saya diatur 18446744073692774399secara default di Ubuntu 18.04.
Carl Zulauf
30

Menambah jawaban bagus Winnie,

Jika ada yang tidak dapat menemukan lokasi file postgresql.conf di setup Anda, Anda selalu dapat menanyakan postgres itu sendiri.

SHOW config_file;

Bagi saya, mengubah max_connections saja sudah membuat triknya.

Jinxer Albatross
sumber
2
Terima kasih. Di Ubuntu 18.04 itu/etc/postgresql/11/main/postgresql.conf
gies0r
1

ubah variabel max_connections di file postgresql.conf yang terletak di / var / lib / pgsql / data atau / usr / local / pgsql / data /

Archana
sumber
2
Mengapa pg_hba.conf? Itu tidak memiliki parameter apa pun tentang jumlah koneksi, hanya cara menghubungkan. postgresql.conf di sisi lain .... Tetapi ratusan koneksi adalah ide yang buruk, jangan lakukan itu, gunakan kumpulan koneksi atau menderita masalah kinerja. PostgreSQL 8.3 adalah EOL selama bertahun-tahun, harap gunakan versi terbaru.
Frank Heikens