จะเพิ่มการเชื่อมต่อสูงสุดใน postgres ได้อย่างไร?


109

ฉันใช้ Postgres DB สำหรับผลิตภัณฑ์ของฉัน ขณะทำการแทรกแบตช์โดยใช้ slick 3 ฉันได้รับข้อความแสดงข้อผิดพลาด:

org.postgresql.util.PSQLException: FATAL: ขออภัยมีลูกค้ามากเกินไปแล้ว

การดำเนินการแทรกแบตช์ของฉันจะมากกว่าหลายพันรายการ การเชื่อมต่อสูงสุดสำหรับ postgres ของฉันคือ 100

จะเพิ่มการเชื่อมต่อสูงสุดได้อย่างไร?



ใช้พูลการเชื่อมต่อเช่น pgBouncer หรือ
pgPool

2
1. ก่อนอื่นให้ตรวจสอบว่ามิดเดิลแวร์ของคุณไม่ได้เปิดการเชื่อมต่อไว้มากเกินไปหรือรั่วไหล 2. (อาจจะ) ถัดไปใช้ pooler การเชื่อมต่อ 3. (เกือบ) ไม่เพิ่มจำนวนการเชื่อมต่อที่อนุญาตสำหรับปัญหาประเภทนี้ในกรณีส่วนใหญ่สิ่งนี้จะทำให้สิ่งต่างๆแย่ลง (ยกเว้นว่าคุณแน่ใจจริงๆ)
joop

คำตอบ:


221

แค่เพิ่ม max_connectionsเป็นความคิดที่ไม่ดี คุณต้องเพิ่มshared_buffersและkernel.shmmaxเช่นกัน


ข้อควรพิจารณา

max_connectionsกำหนดจำนวนสูงสุดของการเชื่อมต่อพร้อมกันไปยังเซิร์ฟเวอร์ฐานข้อมูล โดยทั่วไปค่าเริ่มต้นคือ 100 การเชื่อมต่อ

ก่อนที่จะเพิ่มจำนวนการเชื่อมต่อของคุณคุณอาจต้องปรับขนาดการปรับใช้ของคุณ แต่ก่อนหน้านั้นคุณควรพิจารณาว่าคุณต้องการขีด จำกัด การเชื่อมต่อที่เพิ่มขึ้นจริงๆหรือไม่

การเชื่อมต่อ PostgreSQL แต่ละครั้งจะใช้ RAM สำหรับจัดการการเชื่อมต่อหรือไคลเอ็นต์ที่ใช้ ยิ่งคุณมีการเชื่อมต่อมากเท่าไหร่คุณก็จะยิ่งใช้ RAM มากขึ้นเท่านั้นซึ่งสามารถใช้แทนฐานข้อมูลได้

โดยทั่วไปแอปที่เขียนดีไม่จำเป็นต้องมีการเชื่อมต่อจำนวนมาก หากคุณมีแอปที่ต้องการการเชื่อมต่อจำนวนมากให้พิจารณาใช้เครื่องมือเช่นpg_bouncerซึ่งสามารถรวมการเชื่อมต่อสำหรับคุณได้ เนื่องจากการเชื่อมต่อแต่ละครั้งใช้ RAM คุณควรพยายามลดการใช้งานให้น้อยที่สุด


วิธีเพิ่มการเชื่อมต่อสูงสุด

1. เพิ่มmax_connectionและshared_buffers

ใน /var/lib/pgsql/{version_number}/data/postgresql.conf

เปลี่ยนแปลง

max_connections = 100
shared_buffers = 24MB

ถึง

max_connections = 300
shared_buffers = 80MB

shared_buffersกำหนดค่าพารามิเตอร์ที่กำหนดเท่าใดหน่วยความจำที่จะทุ่มเทให้กับ PostgreSQL การใช้งานสำหรับการแคชข้อมูล

  • หากคุณมีระบบที่มี RAM 1GB ขึ้นไปค่าเริ่มต้นที่เหมาะสมสำหรับ shared_buffers คือ 1/4 ของหน่วยความจำในระบบของคุณ
  • ไม่น่าเป็นไปได้ที่คุณจะใช้ RAM มากกว่า 40% เพื่อให้ทำงานได้ดีกว่าจำนวนที่น้อยกว่า (เช่น 25%)
  • โปรดทราบว่าหากระบบหรือบิวด์ PostgreSQL ของคุณเป็นแบบ 32 บิตการตั้งค่า shared_buffers สูงกว่า 2 ~ 2.5GB อาจไม่เป็นประโยชน์
  • โปรดทราบว่าใน Windows ค่าขนาดใหญ่สำหรับ shared_buffers จะไม่ได้ผลเท่าที่ควรและคุณอาจพบว่าผลลัพธ์ที่ดีกว่าทำให้มันค่อนข้างต่ำและใช้แคชของระบบปฏิบัติการแทน หน้าต่างช่วงที่มีประโยชน์คือ 64 ถึง 512MB

2. เปลี่ยน kernel.shmmax

คุณจะต้องเพิ่มขนาดเซ็กเมนต์สูงสุดของเคอร์เนลให้ใหญ่ กว่าไฟล์shared_buffers.

ในไฟล์/etc/sysctl.confตั้งค่าพารามิเตอร์ดังที่แสดงด้านล่าง จะมีผลเมื่อpostgresqlรีบูต (บรรทัดต่อไปนี้ทำให้เคอร์เนลสูงสุดเป็น96Mb)

kernel.shmmax=100663296

อ้างอิง

Postgres Max Connections และ Shared Buffers

ปรับแต่งเซิร์ฟเวอร์ PostgreSQL ของคุณ


คำตอบที่ดี สองสามคำถาม .. 100663296 เท่ากับ 96MB ได้อย่างไร แล้วทำไมเราเปลี่ยน shmmax มันทำอะไร?
Robbo_UK

3
100663296 ไบต์ = 96 MB (เป็นไบนารี) shmmax คือขนาดสูงสุดของเซ็กเมนต์หน่วยความจำแบบแบ่งใช้ ตอนนี้เนื่องจากเราเพิ่มขนาดของบัฟเฟอร์ที่ใช้ร่วมกันเราจึงจำเป็นต้องเปลี่ยน shmmax เพื่อรองรับหน่วยความจำที่เพิ่มขึ้นสำหรับการแคช
Ankit

1
@Robbo_UK 96 * 1024 * 1024 = 100663296
skrebbel

6
คุณอาจใช้PGTuneเพื่อช่วยกำหนดการตั้งค่าเหล่านี้สำหรับระบบของคุณ
Yoan Tournade

11
ตรวจสอบการตั้งค่า kernel.shmmax ปัจจุบันของคุณcat /proc/sys/kernel/shmmaxก่อนที่จะเปลี่ยนแปลง ในระบบสมัยใหม่ได้ตั้งค่าไว้สูงแล้วและไม่ควรเปลี่ยนแปลง Mine ถูกตั้งค่าเป็นค่า18446744073692774399เริ่มต้นบน Ubuntu 18.04
Carl Zulauf

30

เพิ่มคำตอบที่ยอดเยี่ยมของวินนี่

หากใครไม่พบตำแหน่งไฟล์ postgresql.conf ในการตั้งค่าของคุณคุณสามารถถาม postgres ได้ตลอดเวลา

SHOW config_file;

สำหรับฉันการเปลี่ยน max_connections เพียงอย่างเดียวทำให้เคล็ดลับ


2
ขอบคุณ. ใน Ubuntu 18.04 คือ/etc/postgresql/11/main/postgresql.conf
gies0r

1

เปลี่ยนตัวแปร max_connections ในไฟล์ postgresql.conf ที่อยู่ใน / var / lib / pgsql / data หรือ / usr / local / pgsql / data /


2
ทำไมต้อง pg_hba.conf? ไม่มีพารามิเตอร์เกี่ยวกับจำนวนการเชื่อมต่อมีเพียงวิธีการเชื่อมต่อเท่านั้น postgresql.conf ในทางกลับกัน .... แต่การเชื่อมต่อหลายร้อยรายการเป็นความคิดที่ไม่ดีอย่าทำใช้พูลการเชื่อมต่อหรือประสบปัญหาด้านประสิทธิภาพ PostgreSQL 8.3 เป็น EOL มาหลายปีแล้วโปรดใช้เวอร์ชันล่าสุด
Frank Heikens
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.