如何计算PostgreSQL的max_connections和pgbouncer的default_pool_size?


17

是否有一个规则或东西,我可以用它来计算出一个良好的数量max_connectionsdefault_pool_sizemax_client_conn

默认值是奇数。PostgreSQL默认为max_connections = 100,而pgbouncer默认为default_pool_size = 20。default_pool_size不应总是大于max_connections吗?否则,有什么意义呢?我认为pgbouncer的目的是让我们通过减少开销(通过重用PostgreSQL的连接)来处理更多的连接。我很困惑。

我正在寻找与PostgreSQL Wiki中类似的建议,例如“此参数应该是您内存的〜50%”。

我记得有一个用于MySQL的电子表格,可以让您计算这类参数。对于PostgreSQL / pgbouncer拥有类似的功能真是太棒了。

Answers:


12

首先,请阅读有关容量规划的规范问题
您需要的特定建议是容量规划建议,您将必须针对特定环境自行解决。

其次,您正在看这个错误。
您拥有的内存量(或任何其他资源)并不决定您设置的连接数,所需的连接数决定必须购买的服务器的性能。手册中详细介绍了
每个连接的资源要求,并在链接到的Wiki上进行了讨论。弄清您的环境需要(或进行有根据的猜测),并确保要运行的硬件可以处理要扔给它的东西。


特别是关于:连接限制和池大小,您应该具有“足够”的连接以满足应用程序的需求-在单个服务器上或通过池/保镖。

“足够”是一个相对数:建立(并不断重用)一个连接的应用程序仅需要一个连接。为每个登录的最终用户建立连接的应用程序需要与用户数量一样多的数据库连接。

Postgres和的默认值pgbouncer都是明智的默认值

  • 对于通常将Postgres放入环境的人来说,有100个数据库连接是很多的。
    开发人员可能不需要超过10个。其他任何人都会知道足够增加这个数目。

  • pgbouncer每个数据库池有20个连接,这意味着您可以在一个服务器上获得4个池,而不会超出默认的Postgres连接限制。指向一个后端数据库时
    可能有多个池化资源pgbouncer,并且您始终希望后端服务器上有一些可用的连接。

如果默认值不适合您的环境,则应更改它们。

请记住,池化连接并不意味着“总是占用每个可用的数据库连接”。正如您所指出
的,要点pgbouncer重用连接。这里的效率提高不需要您捆绑每个可用的连接,仅是您不断开连接,重新连接,重新协商SSL,重新认证数据库以及每次都重新运行连接设置查询。


8
在正确配置之前,我看不出购买更多硬件的意义。“其他任何人都知道足够增加这个数字”。好吧,我在哪里可以学到足够的知识?我没有找到有关连接的大量材料。只是反复试验吗?我提到的用于MySQL的电子表格过去一直很吸引人。如果使用的连接数超出指示的数量,将导致服务器内存不足。现在我有4GB,我期望必须增加默认值。另外,20x4 = 80,另外20个又是什么?
ChocoDeveloper

1
@ChocoDeveloper请完整地重读我的答案(您要问的是我已经解决的一些问题),并花一些时间处理链接到的文档。您仍在反向看(请参阅我的答案的第一段)。请记住,Postgres不是MySQL:您需要忘记从MySQL调整经验中了解到的所有知识。Postgres更像Oracle。阅读手册,并按照手册中的说明进行操作。
voretaq7 2013年

1

注意文档的定义default_pool_size

每个用户/数据库对允许多少个服务器连接。

因此,如果默认配置的池大小为20(总共100个连接中),则这意味着5个不同的用户/数据库对在达到整体限制之前必须各自最大化其池大小。相反,例如,如果您使用pgbouncer通过单个用户路由到单个数据库,则您的有效连接限制为20,而不是100,因此您必须相应地为该用例设置池大小。YMMV。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.