Postgres에서 최대 연결을 늘리는 방법은 무엇입니까?


108

내 제품에 Postgres DB를 사용하고 있습니다. 매끄러운 3을 사용하여 일괄 삽입을 수행하는 동안 오류 메시지가 나타납니다.

org.postgresql.util.PSQLException : FATAL : 죄송합니다. 이미 클라이언트가 너무 많습니다.

내 일괄 삽입 작업은 수천 개 이상의 레코드가 될 것입니다. 내 postgres의 최대 연결은 100입니다.

최대 연결을 늘리는 방법은 무엇입니까?



pgBouncer 또는 pgPool과 같은 연결 풀 사용
Frank Heikens 2015 년

2
1. 먼저 미들웨어가 너무 많은 연결을 열어 두지 않거나 유출하고 있는지 확인하십시오. 2. (아마도) 다음에 연결 풀러를 사용합니다. 3. (거의) 이러한 유형의 문제에서 허용되는 연결 수를 늘리지 마십시오. 대부분의 경우 상황이 악화됩니다. (당신이 절대적으로 확신하는 경우 제외)
joop

답변:


220

단지 증가시키는 max_connections것은 나쁜 생각입니다. 당신은 증가시켜야 shared_buffers하고 kernel.shmmax뿐만 아니라.


고려 사항

max_connections데이터베이스 서버에 대한 최대 동시 연결 수를 결정합니다. 기본값은 일반적으로 100 개의 연결입니다.

연결 수를 늘리기 전에 배포를 확장해야 할 수 있습니다. 그러나 그 전에 연결 제한을 늘려야하는지 여부를 고려해야합니다.

각 PostgreSQL 연결은 연결 또는이를 사용하는 클라이언트를 관리하기 위해 RAM을 사용합니다. 연결이 많을수록 데이터베이스를 실행하는 데 사용할 수있는 RAM이 더 많이 사용됩니다.

잘 작성된 앱은 일반적으로 많은 수의 연결이 필요하지 않습니다. 많은 수의 연결이 필요한 앱이있는 경우 연결을 풀링 할 수있는 pg_bouncer 와 같은 도구를 사용하는 것이 좋습니다. 각 연결이 RAM을 소비하므로 사용을 최소화해야합니다.


최대 연결을 늘리는 방법

1. 증가 max_connectionshared_buffers

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

변화

max_connections = 100
shared_buffers = 24MB

max_connections = 300
shared_buffers = 80MB

shared_buffers구성 파라미터는 얼마나 판정 기억 되는 전용 에 사용하는 PostgreSQL 데이터를 캐싱 .

  • 1GB 이상의 RAM이있는 시스템이있는 경우 shared_buffers의 적절한 시작 값은 시스템 메모리의 1/4입니다.
  • 적은 양 (예 : 25 %)보다 더 잘 작동하기 위해 40 % 이상의 RAM을 사용하는 경우는 거의 없습니다.
  • 시스템 또는 PostgreSQL 빌드가 32 비트 인 경우 shared_buffers를 2 ~ 2.5GB 이상으로 설정하는 것이 실용적이지 않을 수 있습니다.
  • Windows에서는 shared_buffers 값이 크면 효과적이지 않으며 상대적으로 낮게 유지하고 대신 OS 캐시를 더 많이 사용하는 것이 더 나은 결과를 찾을 수 있습니다. Windows에서 유용한 범위는 64MB ~ 512MB 입니다.

2. kernel.shmmax 변경

당신은 할 커널 최대 세그먼트 크기를 증가 할 필요가 약간 큰shared_buffers.

파일에서 /etc/sysctl.conf아래와 같이 매개 변수를 설정합니다. postgresql재부팅 할 때 적용 됩니다 (다음 줄은 커널을 최대로 만듭니다 96Mb).

kernel.shmmax=100663296

참고 문헌

Postgres Max 연결 및 공유 버퍼

PostgreSQL 서버 조정


좋은 대답입니다. 몇 가지 질문 .. 100663296은 (는) 96MB와 (과) 어떻게 같습니까? 그리고 우리는 왜 shmmax를 변경합니까?
Robbo_UK

3
100663296 바이트 = 96MB (이진). shmmax는 공유 메모리 세그먼트의 최대 크기입니다 . 이제 공유 버퍼의 크기를 늘 렸기 때문에 캐싱을 위해 늘어난 메모리를 수용하도록 shmmax를 변경해야합니다.
Ankit

1
@Robbo_UK 96 * 1024 * 1024 = 100663296
skrebbel

6
PGTune 을 사용 하여 시스템에 대한 이러한 설정을 결정할 수 있습니다
Yoan Tournade

11
cat /proc/sys/kernel/shmmax변경하기 전에 현재 kernel.shmmax 설정 ( )을 확인하십시오 . 현대 시스템에서는 이미 엄청나게 높게 설정되어 있으므로 변경해서는 안됩니다. Mine은 18446744073692774399Ubuntu 18.04에서 기본적으로 설정됩니다 .
칼 Zulauf

30

위니의 훌륭한 대답에 덧붙여,

누군가 설정에서 postgresql.conf 파일 위치를 찾을 수없는 경우 언제든지 postgres 자체에 요청할 수 있습니다.

SHOW config_file;

나를 위해 max_connections를 변경하는 것만으로도 트릭을 만들었습니다.


2
감사합니다. Ubuntu 18.04에서는/etc/postgresql/11/main/postgresql.conf
gies0r

1

/ var / lib / pgsql / data 또는 / usr / local / pgsql / data /에있는 postgresql.conf 파일의 max_connections 변수를 변경합니다.


2
왜 pg_hba.conf인가? 연결 수에 대한 매개 변수가 없으며 연결 방법 만 있습니다. 반면에 postgresql.conf ....하지만 수백 개의 연결은 나쁜 생각입니다. 그렇게하지 말고 연결 풀을 사용하거나 성능 문제를 겪습니다. PostgreSQL 8.3은 수년 동안 EOL이므로 최신 버전을 사용하십시오.
Frank Heikens 2015 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.