postgresql设置max_connections太大无法启动

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

[postgres@vm1_210_3 data]$ FATAL:  could not create semaphores: 设备上没有空间
DETAIL:  Failed system call was semget(5432064, 17, 03600).
HINT:  This error does *not* mean that you have run out of disk space.  It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded.  You need to raise the respective kernel parameter.  Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its max_connections parameter.
	The PostgreSQL documentation contains more information about configuring your system for PostgreSQL.

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

[root@vm1_210_3 ~]# sysctl -a|grep sem
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 -w kernel.sem="250 22000 250 88"

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

kernel.sem=250  22000 250  88

运行:sytctl -p    

使配置生效

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





你可能感兴趣的:(postgresql设置max_connections太大无法启动)