postgresql设置max_connections太大无法启动

在生产环境postgresql中,需要调整最大链接数,但是调整后无法启动,报错如下:

[postgres@vm1_210_3data]$FATAL:Couldnotcreatesemaphores:设备上没有空间
DETAIL:Failedsystemcallwassemget(5432064,17,03600).
HINT:Thiserrordoes*not*meanthatyouhaverunoutofdiskspace.Itoccurswheneitherthesystemlimitforthemaximumnumberofsemaphoresets(SemmNI),orthesystemwidemaximumnumberofsemaphores(SemmNS),wouldbeexceeded.Youneedtoraisetherespectivekernelparameter.Alternatively,reducePostgresql'sconsumptionofsemaphoresbyreducingitsmax_connectionsparameter.
	ThePostgresqldocumentationcontainsmoreinformationaboutconfiguringyoursystemforPostgresql.

错误的意思就是内核中信号量集和信号量的配置太小了。信号量在内核中,主要解决进程间同步、异步的锁问题,因为Postgresql的每个链接一个进程,所以需要更多的锁来使用。查看方法

[root@vm1_210_3~]#sysctl-a|grepsem
kernel.sem=250	16500	250	65

这四个数字分别是:SemmSL,SemmNS,SEMOPM,SemmNI

SemmSL:内核参数,控制每个信号量集合的最大信号数。

SemmNS:内核参数,控制系统范围内能使用的最大信号量数。

SEMOPM:semop()函数(内核函数,用来操作信号量)每次调用锁能操作的一个信号量集中的最大信号量。

SemmNI:内核中信号量集的最大数量

SemmNS=SemmSL*SemmNI

SEMOPM=SemmSL,这两个参数一般设置为相同。

对于Postgresql数据库来说:

SemmNI >=ceil((max_connections + autovacuum_max_workers + 4) / 16)

SemmSL >= 17

假设一个PG库如下设置:

max_connections=1000,autovacuum_max_workers =3,

则这几个参数的设置是:

SemmNI = ceil((1000+3+4))/16)=63,因为考虑到其他进程使用,一般设置为63+25=88

SemmSL要求大于17,保持认250

SEMOPM=SEMSL=250

SemmNS=SemmNI*MSMMSL=88*250=22000

设置命令:

sysctl-wkernel.sem="2502200025088"

如果重启也生效,在/etc/sysctl.conf文件添加

kernel.sem=250 22000 250 88

运行:sysctl -p

使配置生效

设置完成之后,如果启动数据库还是报同样的错误,那么可以重启操作系统。(具体什么原因,我也不知道,如果有哪位明白的大神,请赐教)

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...