2012-04-28 234 views
5

我一直在尝试配置PgPool来接受约150的请求。Postgres服务器被配置为只接受100个连接。超过100的任何东西都需要被PgPool汇集。我似乎不明白。我只需要PgPool排队请求,我目前的配置不这样做。从我的JMeter测试中,当我尝试连接超过100时,postgres给我一个错误,说PSQL错误:sorry, too many clients一个很好的PgPool II配置

我只已配置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 

由于我只需要PgPool到队列的额外连接的请求,在上述配置是否正确? 请告知正确的配置。

+0

您是否在应用程序中定位了pgpool实例,而不是直接连接到Postgresql? – 2012-04-28 09:09:25

+0

我通过PGPool端口9999连接到postgres服务器'jdbc:postgresql:// localhost:9999/dbname?user = username&password = passwordofuser' – 2012-04-28 09:45:56

回答

2

首先要弄清楚你想要的最大池大小。当活动连接的最大数量在((2 *内​​核数量)+有效主轴数量)附近时,PostgreSQL的性能(无论是吞吐量还是延迟)通常都是最好的。有效的主轴数量可能会非常棘手 - 例如,如果您的活动数据集完全缓存,则将其计为零。不要将超线程中的任何额外线程计算为此计算的核心。另请注意,由于网络延迟问题,您可能需要一个略大于计算数量的池来保持连接数处于活动状态。您可能需要做一些基准测试以找到适合您的硬件和工作负载的最佳位置。

您需要调整的设置是child_max_connections,其中num_init_children保持小于或等于此值。

+0

2 *内核数量+有效主轴数量??为num_init_children参数?你能举个例子吗?我不知道我的理解.. – 2012-04-30 06:25:52

+0

假设你有一个超线程四核处理器。这是四个内核,因此您可能会从多达8个活动数据库连接中受益。比方说,你有一个六驱动器RAID 10的数据。如果您完全缓存,则可能不会添加任何内容,因为驱动器未被用于大量随机读取。如果你是磁盘绑定的,那么你把它算为6,让你连接14个。如果部分缓存,有效的缓存大小可能介于两者之间。从那里开始,测试一下你的工作量稍大一点的小池。 – kgrittn 2012-04-30 12:21:34

+0

这个PgPool wiki的声明帮助我: - 总之,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' – 2012-05-01 06:14:48

4

pgpool中的'child_max_connections'不是允许连接到数据库的最大值。这是在终止和重新启动之前,池连接可以使用的次数。它在那里回收连接线程并停止内存泄漏。

max_pool x num_init_children的公式描述了pgpool对Postgresql的最大连接数。显然,这需要小于postgresql中设置的'max_connections',否则pgpool会将数据库标记为不可用的后端。如果您有一些数据库连接保留给管理员使用,则需要进一步减少pgpool连接的数量。

所以,我说的是公式中的'max_connections'是在postgresql.conf中设置的参数。在上面的注释中将'child_max_connections'设置为100只意味着pgpool连接被关闭,并且每使用100次就重新打开。