Bagaimana cara menghitung max_connections untuk PostgreSQL dan default_pool_size untuk pgbouncer?

17

Apakah ada aturan atau sesuatu yang dapat saya gunakan untuk menghitung angka yang bagus untuk max_connections, default_pool_sizedan max_client_conn?

Defaultnya aneh. Default PostgreSQL ke max_connections = 100 sementara pgbouncer default ke default_pool_size = 20. Tidakkah seharusnya default_pool_size selalu lebih tinggi dari max_connections? Kalau tidak, apa gunanya? Saya pikir pgbouncer dimaksudkan untuk membiarkan kami menangani lebih banyak koneksi dengan menurunkan overhead mereka (dengan menggunakan kembali koneksi PostgreSQL). Saya bingung.

Saya mencari saran yang mirip dengan yang ditemukan di wiki PostgreSQL , seperti "parameter ini seharusnya ~ 50% dari memori Anda".

Saya ingat ada spreadsheet untuk MySQL yang memungkinkan Anda menghitung parameter semacam ini. Akan luar biasa memiliki sesuatu seperti itu untuk PostgreSQL / pgbouncer.

ChocoDeveloper
sumber

Jawaban:

12

Pertama, harap baca pertanyaan kanonik kami tentang Perencanaan Kapasitas .
Saran spesifik yang Anda minta adalah saran perencanaan kapasitas, dan Anda harus mengerjakannya sendiri, untuk lingkungan khusus Anda.

Kedua, Anda melihat ini salah.
Jumlah memori (atau sumber daya lainnya) yang Anda miliki tidak menentukan jumlah koneksi yang Anda tentukan, jumlah koneksi yang Anda butuhkan menentukan seberapa besar server yang harus Anda beli.
Persyaratan sumber daya per-koneksi diberikan dalam manual ini dengan sangat rinci, serta dibahas pada Wiki yang Anda tautkan. Cari tahu apa yang dibutuhkan oleh lingkungan Anda (atau tebak dengan cerdas) dan pastikan perangkat keras yang akan Anda jalankan dapat menangani apa yang akan Anda berikan.


Khususnya: batas koneksi dan ukuran kumpulan, Anda harus memiliki koneksi "cukup" untuk memenuhi persyaratan aplikasi Anda - baik di server tunggal atau melalui pool / bouncer.

"Cukup" adalah angka relatif: Aplikasi yang membuat (dan terus-menerus menggunakan kembali) satu koneksi hanya membutuhkan satu koneksi. Aplikasi yang membuat koneksi untuk setiap pengguna akhir yang log in membutuhkan koneksi DB sebanyak yang dimiliki pengguna.

Nilai default untuk Postgres dan pgbouncermasuk akal sebagai default :

  • 100 koneksi basis data banyak bagi orang biasa yang melempar Postgres ke suatu lingkungan.
    Pengembang mungkin tidak akan membutuhkan lebih dari 10. Orang lain akan cukup tahu untuk menambah jumlahnya.

  • 20 koneksi dari pgbouncerper DB pool berarti Anda bisa mendapatkan 4 pool yang menunjuk pada satu server dan tidak melebihi batas koneksi Postgres default.
    Dimungkinkan untuk memiliki banyak sumber daya yang terkumpul dalam pgbouncermenunjuk pada satu database back-end, dan Anda selalu menginginkan beberapa koneksi yang tersedia di server back-end Anda.

Jika standarnya tidak sesuai untuk lingkungan Anda, Anda diharapkan mengubahnya.

Ingat bahwa koneksi yang terkumpul tidak berarti "selalu ikat setiap koneksi basis data yang tersedia".
Maksud dari pgbouncerseperti yang Anda perhatikan adalah menggunakan kembali koneksi. Keuntungan efisiensi di sini tidak mengharuskan Anda mengikat setiap koneksi yang tersedia, hanya bahwa Anda tidak memutuskan, menghubungkan kembali, menegosiasikan ulang SSL, mengautentikasi ulang ke database, dan menjalankan kembali permintaan pengaturan koneksi Anda setiap kali.

voretaq7
sumber
8
Saya tidak melihat titik membeli lebih banyak perangkat keras sebelum mengkonfigurasi hal-hal dengan benar. "Orang lain akan cukup tahu untuk menambah jumlahnya" . Nah, di mana saya bisa belajar cukup banyak? Saya tidak menemukan banyak materi tentang koneksi. Apakah ini hanya trial and error? Spreadsheet yang saya sebutkan untuk MySQL digunakan untuk bekerja seperti pesona. Menggunakan lebih banyak koneksi daripada yang ditunjukkan olehnya akan menyebabkan server kehabisan memori. Saat ini saya memiliki 4GB, saya berharap harus meningkatkan standarnya. Juga, 20x4 = 80, untuk apa 20 lainnya?
ChocoDeveloper
1
@ChocoDeveloper Harap baca kembali jawaban saya secara keseluruhan (Anda menanyakan beberapa hal yang sudah saya bahas), dan menghabiskan beberapa menit dengan dokumentasi yang saya tautkan. Anda masih melihat ke belakang ini (lihat paragraf pertama dari jawaban saya). Ingatlah bahwa Postgres BUKAN MySQL: Anda harus melupakan semua yang Anda tahu dari pengalaman penyetelan MySQL Anda. Postgres lebih seperti Oracle. Pelajari manual ini , dan lanjutkan sesuai dengan instruksi yang diberikannya kepada Anda.
voretaq7
1

Perhatikan definisi dokumentasi tentangdefault_pool_size

Berapa banyak koneksi server yang diperbolehkan per pasangan pengguna / basis data.

Jadi jika konfigurasi default adalah ukuran kumpulan 20, dari total 100 koneksi, ini berarti 5 pasangan pengguna / basis data yang berbeda harus masing-masing memaksimalkan ukuran kumpulan mereka sebelum mencapai batas keseluruhan. Sebaliknya, jika misalnya Anda menggunakan pgbouncer untuk merutekan ke satu database melalui satu pengguna, batas koneksi efektif Anda adalah 20, bukan 100, jadi Anda harus mengatur ukuran kumpulan untuk case use yang sesuai. YMMV.

Josip Rodin
sumber