在生产环境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()函数(内核函数,用来操作信号量)每次调用锁能操作的一个信号量集中的最大信号量。
SEMOPM=SemmSL,这两个参数一般设置为相同。
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
SEMOPM=SEMSL=250
SemmNS=SemmNI*MSMMSL=88*250=22000
设置命令:
sysctl-wkernel.sem="2502200025088"
如果重启也生效,在/etc/sysctl.conf文件中添加:
kernel.sem=250 22000 250 88
运行:sysctl -p
使配置生效
设置完成之后,如果启动数据库还是报同样的错误,那么可以重启操作系统。(具体什么原因,我也不知道,如果有哪位明白的大神,请赐教)
原文地址:https://www.jb51.cc/postgresql/194763.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。