如何增加PostgreSQL的最大连接数?

215

我正在使用Postgres数据库开发我的产品。在使用Slick 3进行批量插入时,出现以下错误信息:

org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.

我的批量插入操作将超过成千上万条记录。我的Postgres最大连接数是100。

如何增加最大连接数?


https://dev59.com/5mkw5IYBdhLWcg3wkLb2 - user_0
使用连接池,例如pgBouncer或pgPool。 - Frank Heikens
2
  1. 首先检查您的中间件是否没有保持太多连接打开,或者是否泄漏了它们。
  2. (也许)接下来使用连接池。
  3. (几乎)从不增加允许的连接数以解决此类问题,在大多数情况下,这会使情况变得更糟。(除非您绝对确定)
- joop
另外,您还可以参考 https://dev59.com/p1oV5IYBdhLWcg3wkvd1#58373811,该选项使用 SQL 命令而非配置。 - Jethro
@FrankHeikens,在 Windows Server 中,PostgreSQL 的首选连接池是什么? - Sajeev
7个回答

417

仅仅增加 max_connections 是不够的,还需要同时增加 shared_bufferskernel.shmmax


注意事项

max_connections 确定了数据库服务器的最大并发连接数,通常默认值为 100。

在增加连接数之前,您可能需要扩展您的部署。但在此之前,您应该考虑是否真的需要增加连接限制。

每个 PostgreSQL 连接都会消耗 RAM 来管理连接或使用它的客户端。您拥有的连接越多,使用的 RAM 就越多,而这些 RAM 可以用于运行数据库。

一个良好编写的应用程序通常不需要大量的连接。如果您有一个确实需要大量连接的应用程序,则考虑使用像 pg_bouncer 这样的工具,它可以为您汇集连接。因为每个连接都会消耗 RAM,所以您应该尽量减少它们的使用。


如何增加 max connections

1. 增加 max_connectionshared_buffers

/var/lib/pgsql/{version_number}/data/postgresql.conf 中修改。

更改

max_connections = 100
shared_buffers = 24MB
max_connections = 300
shared_buffers = 80MB

shared_buffers配置参数决定了为了缓存数据,PostgreSQL使用的内存量。

  • 如果您的系统有1GB或更多的RAM,则共享缓冲区的合理起始值为系统中内存的1/4。
  • 使用超过40%的RAM可能不比使用较小数量(如25%)更好。
  • 请注意,如果您的系统或PostgreSQL构建是32位,则将shared_buffers设置为2~2.5GB以上可能不切实际。
  • 请注意,在Windows上,对于shared_buffers的大量值效果不佳,您可能会发现最好将其保持相对较低并更多地使用操作系统缓存。 在Windows上,有用的范围是64MB到512MB

2. 更改kernel.shmmax

您需要将内核最大段大小增加到略大于shared_buffers

在文件/etc/sysctl.conf中设置以下参数。 它将在postgresql重新启动时生效(以下行使内核最大值为96Mb)。

kernel.shmmax=100663296

参考资料

Postgres最大连接数和共享缓冲区

调整您的PostgreSQL服务器


3
100663296字节=96 MB(二进制)。shmmax是共享内存段的最大大小。现在,因为我们增加了共享缓冲区的大小,我们需要改变shmmax以容纳增加的用于缓存的内存。 - Ankit
2
@Robbo_UK 96 * 1024 * 1024 = 100663296 - skrebbel
20
您可以使用 PGTune 来帮助确定您系统的这些设置。 - Yoan Tournade
42
在更改kernel.shmmax之前,请检查当前的设置(cat /proc/sys/kernel/shmmax)。在现代系统中,它已经被设定得非常高,不应进行更改。在我的Ubuntu 18.04上,默认设置为18446744073692774399 - Carl Zulauf
2
从链接的文章中可以得知:"通常情况下,好的硬件上的PostgreSQL可以支持几百个连接"。你的陈述"A well-written app typically doesn't need a large number of connections"仅适用于低流量应用程序。如果每个会话在数据库上需要0.05秒,则最多可以为2000个客户端提供服务。即使使用pgbouncer(你一定要使用它!),也无法解决这个问题。如果您需要为5000个客户端/秒提供服务,则需要250个连接,以此类推。否则,您将从pgbouncer看到"query_wait_timeout"。如果您拥有>=16G RAM和足够的CPU核心(8+),那绝对没有问题。 - dr fu manchu
显示剩余5条评论

98

在Winnie的精彩回答基础上,

如果任何人在您的设置中无法找到postgresql.conf文件位置,您可以随时向Postgres本身询问。

SHOW config_file;

对我来说,仅仅改变max_connections就解决了问题。

编辑: 来自@gies0r的提示:在Ubuntu 18.04中,它在

/etc/postgresql/11/main/postgresql.conf

7
谢谢。在Ubuntu 18.04中,该文件路径为/etc/postgresql/11/main/postgresql.conf - gies0r
3
您还可以查询 pg_settingsSELECT name, setting FROM pg_settings; - howMuchCheeseIsTooMuchCheese
在Windows中,它是C:\Program Files\PostgreSQL\12\data\postgresql.conf。 - mrhotroad

13
如果您的Postgres实例由Amazon RDS托管,Amazon会根据可用内存为您配置最大连接数。他们的文档指出,每1GB内存可获得112个连接(无论您有多少内存,限制为5000个连接),但我们发现在只有1GB内存的实例中,接近80个连接就开始出现错误消息。将内存增加到2GB使我们能够使用110个连接而没有问题(可能还可以更多,但这是我们迄今为止尝试过的最多的)。我们很容易就可以将现有实例的内存从1GB增加到2GB。以下是相关的Amazon文档链接:https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html#RDS_Limits.MaxConnections

1
  1. 通过以下命令找到postgresql.conf文件

locate postgresql.conf

  1. 通过以下命令编辑postgresql.conf文件

sudo nano /etc/postgresql/14/main/postgresql.conf

  1. max_connections = 100 shared_buffers = 24MB

修改为

max_connections = 300
shared_buffers = 80MB

1

在/var/lib/pgsql/data或/usr/local/pgsql/data/中的postgresql.conf文件中更改max_connections变量。


2
为什么要使用pg_hba.conf?它没有任何关于连接数量的参数,只有如何连接。另一方面,postgresql.conf……但是,数百个连接是一个坏主意,请不要这样做,使用连接池或遭受性能问题。PostgreSQL 8.3已经多年停止维护,请使用最新版本。 - Frank Heikens

0
对于在Docker/Kubernetes中运行的Postgres 13,路径为: /var/lib/postgresql/data/postgressql.conf 更新max_connections = 300并重新启动容器/ Pod

已经回答。 - Saravanakumar Arumugam

0
对于Mac M1用户

/opt/homebrew/var/postgresql@14/postgresql.conf


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接