2012-04-28 13 views
5

私は約150の要求を受け入れるようにPgPoolを設定しようとしています.Postgresサーバは100の接続しか受け付けないように設定されています。 100を超えるものはPgPoolによってプールされる必要があります。私はそれを得るようではありません。私はPgPoolが要求をキューに入れることだけを必要とします、私の現在の設定はそれをしません。私のJMeterテストから、100を越える接続をしようとすると、PostgresはPSQLエラー:sorry, too many clientsというエラーメッセージを表示します。良いPgPool IIの設定

私は次のパラメータではpgpoolを設定している:私は、余分な接続要求をキューにはpgpoolを必要とするので

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 

、正しい上記の構成でありますか? 正しい設定について助言してください。

+0

Postgresqlに直接接続するのではなく、アプリケーションのpgpoolインスタンスをターゲットにしていますか? –

+0

私はPGPoolポート9999を介してpostgresサーバに接続しています。 'jdbc:postgresql:// localhost:9999/dbname?user = username&password = passwordofuser' –

答えて

2

最初に、最大プールサイズとして何を求めているかを調べることです。 PostgreSQLのパフォーマンス(スループットとレイテンシの両方)は、通常、アクティブな接続の最大数が(2 *コア数+有効スピンドル数)前後のどこかにある場合に最適です。実効データ数が完全にキャッシュされている場合は、たとえば、ゼロとしてカウントします。ハイパースレッディングの余分なスレッドをこの計算のコアとしてカウントしないでください。また、ネットワークレイテンシの問題のため、接続数をに設定すると、計算された数よりも若干大きなプールが必要になる場合があります。ハードウェアとワークロードのスイートスポットを見つけるには、ベンチマークを行う必要があります。

調整する必要がある設定はchild_max_connectionsで、num_init_childrenはそれ以下に保たれています。

+0

2 *コア数+有効スピンドルカウント? num_init_childrenパラメータの場合は?あなたは例を挙げることができますか?私は理解しているか分からない。 –

+0

ハイパースレッディング付きのクアッドコアプロセッサがあるとしよう。それは4つのコアなので、おそらく最大8つのアクティブなデータベース接続から利益を得ることができます。たとえば、データ用に6ドライブのRAID 10があるとします。完全にキャッシュされている場合は、何も追加しないでください。これは、ドライブが多数のランダムな読み込みに使用されていないためです。ディスクにバインドされている場合は、その数を6としてカウントし、14の接続に接続します。あなたが部分的にキャッシュされている場合、有効なキャッシュサイズはおそらくその中間にあります。そこから作業を開始し、ワークロードを少し大きくして小さなプールをテストします。 – kgrittn

+0

PgPool wikiのこの文は私を助けました: - 要約すると、max_pool、num_init_children、max_connections、superuser_reserved_connectionsは次の式を満たさなければなりません: max_pool * num_init_children <=(max_connections - superuser_reserved_connections) i 'はローカルホスト' = listen_address 'に自分の設定を変更 ポート= 9999 backend_hostname0の= 'localhostの' 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の式は、PostgreSQLになりますpgpoolの接続の最大数を記載しています。明らかに、これはpostgresqlで設定された 'max_connections'より小さくする必要があります。そうでなければ、pgpoolはDBを使用不可能なバックエンドとしてマークします。 admin用に予約されたDB接続がある場合は、さらにpgpool接続の数を減らす必要があります。

だから、私は何を言っていることは式の「MAX_CONNECTIONS」はpostgresql.conf内で設定されるパラメータであるということです。上記のコメントで 'child_max_connections'を100に設定すると、pgpool接続が閉じられ、100回使用されるたびに再び開きます。

関連する問題