Làm thế nào để tăng kết nối tối đa trong postgres?


108

Tôi đang sử dụng Postgres DB cho sản phẩm của mình. Trong khi thực hiện chèn hàng loạt bằng slick 3, tôi nhận được thông báo lỗi:

org.postgresql.util.PSQLException: FATAL: xin lỗi, đã có quá nhiều khách hàng.

Thao tác chèn hàng loạt của tôi sẽ nhiều hơn hàng nghìn bản ghi. Kết nối tối đa cho các postgres của tôi là 100.

Làm thế nào để tăng kết nối tối đa?



Sử dụng nhóm kết nối như pgBouncer hoặc pgPool
Frank Heikens

2
1. Trước tiên, hãy kiểm tra xem phần mềm trung gian của bạn có giữ quá nhiều kết nối mở hay đang làm rò rỉ chúng hay không. 2. (có thể) tiếp theo sử dụng một bộ gộp kết nối. 3. (hầu như) không bao giờ tăng số lượng kết nối được phép đối với loại vấn đề này, trong hầu hết các trường hợp, điều này sẽ làm cho mọi thứ tồi tệ hơn. (ngoại trừ nếu bạn hoàn toàn chắc chắn)
tham gia

Câu trả lời:


220

Chỉ tăng max_connectionslà ý tưởng tồi. Bạn cần phải tăng shared_bufferskernel.shmmaxcả.


Cân nhắc

max_connectionsxác định số lượng tối đa các kết nối đồng thời đến máy chủ cơ sở dữ liệu. Mặc định thường là 100 kết nối.

Trước khi tăng số lượng kết nối, bạn có thể cần phải mở rộng quy mô triển khai của mình. Nhưng trước đó, bạn nên cân nhắc xem bạn có thực sự cần tăng giới hạn kết nối hay không.

Mỗi kết nối PostgreSQL tiêu tốn RAM để quản lý kết nối hoặc máy khách sử dụng nó. Bạn càng có nhiều kết nối, bạn sẽ càng sử dụng nhiều RAM mà thay vào đó có thể dùng để chạy cơ sở dữ liệu.

Một ứng dụng được viết tốt thường không cần nhiều kết nối. Nếu bạn có một ứng dụng cần số lượng lớn kết nối thì hãy cân nhắc sử dụng một công cụ như pg_bouncer có thể gộp các kết nối cho bạn. Vì mỗi kết nối tiêu tốn RAM, bạn nên giảm thiểu việc sử dụng chúng.


Cách tăng kết nối tối đa

1. Tăng max_connectionshared_buffers

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

thay đổi

max_connections = 100
shared_buffers = 24MB

đến

max_connections = 300
shared_buffers = 80MB

Các shared_bufferstham số cấu hình xác định có bao nhiêu bộ nhớ được dành riêng để PostgreSQL để sử dụng cho bộ nhớ đệm dữ liệu .

  • Nếu bạn có hệ thống có RAM từ 1GB trở lên, giá trị khởi đầu hợp lý cho shared_buffers là 1/4 bộ nhớ trong hệ thống của bạn.
  • không chắc bạn sẽ thấy sử dụng hơn 40% RAM để hoạt động tốt hơn so với một lượng nhỏ hơn (như 25%)
  • Lưu ý rằng nếu hệ thống hoặc bản dựng PostgreSQL của bạn là 32-bit, thì việc đặt shared_buffers trên 2 ~ 2,5GB là không thực tế.
  • Lưu ý rằng trên Windows, các giá trị lớn cho shared_buffers không hiệu quả và bạn có thể thấy kết quả tốt hơn khi giữ nó ở mức tương đối thấp và thay vào đó, sử dụng bộ nhớ đệm hệ điều hành nhiều hơn. Trên Windows, phạm vi hữu ích là 64MB đến 512MB .

2. Thay đổi kernel.shmmax

Bạn sẽ cần tăng kích thước phân đoạn tối đa của nhân để lớn hơn một chút so với shared_buffers.

Trong tệp /etc/sysctl.confthiết lập thông số như hình dưới đây. Nó sẽ có hiệu lực khi postgresqlkhởi động lại (Dòng sau làm cho nhân tối đa 96Mb)

kernel.shmmax=100663296

Người giới thiệu

Kết nối tối đa Postgres và bộ đệm được chia sẻ

Điều chỉnh máy chủ PostgreSQL của bạn


câu trả lời chính xác. một vài câu hỏi .. làm thế nào là 100663296 bằng 96MB? và tại sao chúng ta thay đổi shmmax điều đó làm gì?
Robbo_UK

3
100663296 Byte = 96 MB (ở dạng nhị phân). shmmax là kích thước tối đa của một đoạn bộ nhớ dùng chung . Bây giờ vì chúng tôi đã tăng kích thước của bộ đệm chia sẻ, chúng tôi cần thay đổi shmmax để chứa bộ nhớ tăng lên cho bộ đệm.
Ankit

1
@Robbo_UK 96 * 1024 * 1024 = 100663296
skrebbel

6
Bạn có thể sử dụng PGTune để giúp bạn xác định các thiết lập cho hệ thống của bạn
Yoan Tournade

11
Kiểm tra cài đặt kernel.shmmax hiện tại của bạn ( cat /proc/sys/kernel/shmmax) trước khi thay đổi nó. Trên các hệ thống hiện đại, nó đã được đặt rất cao và không nên thay đổi. Của tôi được đặt thành 18446744073692774399mặc định trên Ubuntu 18.04.
Carl Zulauf

30

Thêm vào câu trả lời tuyệt vời của Winnie,

Nếu bất kỳ ai không thể tìm thấy vị trí tệp postgresql.conf trong thiết lập của bạn, bạn luôn có thể hỏi chính postgres.

SHOW config_file;

Đối với tôi, chỉ riêng việc thay đổi max_connections đã tạo ra một mẹo nhỏ.


2
Cảm ơn bạn. Trong Ubuntu 18.04 thì đúng là/etc/postgresql/11/main/postgresql.conf
gies0r

1

thay đổi biến max_connections trong tệp postgresql.conf nằm trong / var / lib / pgsql / data hoặc / usr / local / pgsql / data /


2
Tại sao lại là pg_hba.conf? Nó không có bất kỳ thông số nào về số lượng kết nối, chỉ có cách kết nối. Mặt khác, postgresql.conf .... Nhưng hàng trăm kết nối là một ý tưởng tồi, đừng làm điều đó, hãy sử dụng một nhóm kết nối hoặc gặp phải các vấn đề về hiệu suất. PostgreSQL 8.3 là EOL trong nhiều năm, vui lòng sử dụng phiên bản cập nhật.
Frank Heikens
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.