【问题标题】:A good PgPool II configuration一个好的 PgPool II 配置
【发布时间】:2012-05-08 20:59:31
【问题描述】:

我一直在尝试将 PgPool 配置为接受大约 150 个请求。Postgres 服务器配置为仅接受 100 个连接。超过 100 的任何东西都需要由 PgPool 池化。我似乎不明白这一点。我只需要 PgPool 对请求进行排队,我当前的配置不这样做。在我的 JMeter 测试中,当我尝试连接超过 100 个时,postgres 给我一个错误提示 PSQL 错误:sorry, too many clients

我只用以下参数配置了 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 来排队额外的连接请求,那么上面的配置是否正确? 请告知正确的配置。

【问题讨论】:

  • 您是在应用程序中定位 pgpool 实例而不是直接连接到 Postgresql 吗?
  • 我正在通过 PGPool 端口 9999 jdbc:postgresql://localhost:9999/dbname?user=username&password=passwordofuser 连接到 postgres 服务器

标签: postgresql pgpool


【解决方案1】:

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 次就会关闭并重新打开。

【讨论】:

    【解决方案2】:

    首先要弄清楚您想要的最大池大小。当最大活动连接数大约为((2 * 核心数)+ 有效主轴计数)时,PostgreSQL 性能(在吞吐量和延迟方面)通常是最好的。计算有效的主轴计数可能很棘手——例如,如果您的活动数据集已完全缓存,则将其计为零。不要将来自超线程的任何额外线程算作此计算的核心。另请注意,由于网络延迟问题,您可能需要一个比计算出的数量略大的池来保持该数量的连接活动。您可能需要进行一些基准测试才能找到适合您的硬件和工作负载的最佳位置。

    你需要调整的设置是child_max_connectionsnum_init_children保持小于或等于那个。

    【讨论】:

    • 2*核心数+有效主轴数 ??对于 num_init_children 参数?你能举个例子吗?我不确定我是否理解..
    • 假设您有一个带超线程的四核处理器。那是四个核心,因此您可能可以从多达八个活动数据库连接中受益。假设您有一个用于数据的六驱动器 RAID 10。如果您已完全缓存,则可能不会添加任何内容,因为驱动器并未用于大量随机读取。如果您是磁盘绑定的,那么您将其计为 6 个,从而获得 14 个连接。如果您被部分缓存,则有效缓存大小可能介于两者之间。从那里开始,根据您的工作负载测试更大或更小的池。
    • 好吧,来自 PgPool wiki 的这条语句帮助了我: - 总之,max_pool、num_init_children、max_connections、superuser_reserved_connections 必须满足以下公式:max_pool*num_init_children listen_address = 'localhost' port = 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
    • 这应该可以防止错误。然而,它比 PostgreSQL 可以有效使用的连接多。如果您减少数据库连接的数量,您将能够以更好的吞吐量和更快的响应时间为更多的客户端提供服务。有些人觉得这违反直觉;我建议你尽可能用不同的尺寸测试你的实际组合。
    • 我也在研究 PgBouncer。你会推荐哪一个?以及如何配置多个数据库。?
    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2018-07-13
    相关资源
    最近更新 更多