2012-04-28 8 views
5

나는 약 150의 요청을 받아들이도록 PgPool을 설정하려고 시도 해왔다. Postgres 서버는 단지 100 개의 연결만을 허용하도록 설정되었다. 100을 넘는 모든 것이 PgPool에 의해 풀링 될 필요가 있습니다. 나는 그것을 얻는 것 같지 않습니다. PgPool에 요청 대기열 만 있으면됩니다. 현재 구성에서는 그렇게하지 않습니다. 내 JMeter 테스트에서 100을 넘어서 연결을 시도 할 때 postgres에서 PSQL 오류 : sorry, too many clients을 말하는 오류가 발생합니다.좋은 PgPool II 설정

는 다음 매개 변수 PGPool를 구성한 I :

listen_address = 'localhost' 
port = 9999 
backend_hostname0 = 'localhost' 
backend_port0 = 5432 
num_init_children = 100 
max_pool = 4 
child_life_time =120 
child_max_connections = 0 
connections_life_tome = 120 
client_idle_limit = 0 

난 단지 PgPool 여분의 연결 요청을 대기열에 필요하기 때문에, 위의 구성이 정확한지? 올바른 구성을 알려주십시오.

+0

Postgresql에 직접 연결하는 대신 응용 프로그램에서 pgpool 인스턴스를 대상으로합니까? –

+0

PGPool 포트 9999를 통해 postgres 서버에 연결합니다. 'jdbc : postgresql : // localhost : 9999/dbname? user = username & password = passwordofuser' –

답변

2

가장 먼저 알아야 할 것이 최대 풀 크기입니다. PostgreSQL 성능 (처리량과 대기 시간면에서)은 일반적으로 최대 활성 연결 수가 (2 * 코어 수) + 유효 스핀들 수 (effective spindle number) 인 경우 가장 좋습니다. 효과적인 스핀들 수를 계산하는 것은 까다로울 수 있습니다. 활성 데이터 세트가 완전히 캐시 된 경우 예를 들어 0으로 계산하십시오. 이 계산을 위해 코어로 하이퍼 스레딩에서 추가 스레드를 계산하지 마십시오. 또한 네트워크 대기 시간 문제로 인해 연결된 수를 유지하려면 계산 된 숫자보다 약간 큰 풀이 필요합니다. . 하드웨어 및 워크로드에 적합한 지점을 찾으려면 몇 가지 벤치 마크를 수행해야 할 수도 있습니다.

조정해야하는 설정은 child_max_connections이며, num_init_children은 그보다 작거나 같습니다.

+0

2 * 코어 수 + 유효 스핀들 수? num_init_children 매개 변수의 경우? 예를 들어 줄 수 있니? 내가 이해하고 있는지 잘 모르겠다. –

+0

하이퍼 스레딩 기능을 갖춘 쿼드 코어 프로세서가 있다고 가정 해 봅시다. 4 개의 코어가 있으므로 최대 8 개의 활성 데이터베이스 연결을 활용할 수 있습니다. 데이터에 대해 6 개의 드라이브가있는 RAID 10이라고 가정 해 봅시다. 캐시가 완전히 캐시 된 경우 드라이브에 임의의 읽기가 많이 사용되지 않으므로 아무 것도 추가하지 않을 것입니다. 만약 당신이 디스크에 묶여 있다면, 당신은 6으로 계산하여 14 개의 연결을 갖게됩니다. 부분적으로 캐시 된 경우 유효 캐시 크기가 중간에있는 것 같습니다. 거기서 시작하여 작업량에 따라 약간 더 크고 작은 풀을 테스트하십시오. – kgrittn

+0

PgPool 위키의이 문장은 다음과 같이 도와주었습니다. - 요약하면 max_pool, num_init_children, max_connections, superuser_reserved_connections은 다음 공식을 만족해야합니다. max_pool * num_init_children <= (max_connections - superuser_reserved_connections) (쿼리 취소 필요 없음). 난 '로컬 호스트'= listen_address '내 구성을 변경 포트 = 9999 backend_hostname0 ='로컬 호스트 ' backend_port0 = 5432 num_init_children = 25 max_pool = 4 child_life_time = 120 child_max_connections = 100 connections_life_tome = 120 client_idle_limit = 25' –

4

pgpool의 'child_max_connections'는 DB에 허용되는 최대 연결이 아닙니다. 풀링 된 연결을 종료하고 다시 시작하기 전에 사용할 수있는 횟수입니다. 연결 스레드를 재활용하고 메모리 누수를 막을 수 있습니다.

max_pool x num_init_children의 공식은 pgpool이 Postgresql에 허용하는 최대 연결 수를 나타냅니다. 물론 이것은 postgresql의 'max_connections'보다 작아야합니다. 그렇지 않으면 pgpool은 DB를 사용할 수없는 백엔드로 표시합니다. 관리자 용 DB 연결이 예약되어있는 경우 pgpool 연결 수를 줄여야합니다.

그래서 내가 말한 것은 공식에서 'max_connections'가 postgresql.conf에 설정된 매개 변수라는 것입니다. 위의 주석에서 'child_max_connections'를 100으로 설정하면 pgpool 연결이 닫히고 다시 100 번 사용된다는 의미입니다.

관련 문제