系统内核参数有问题导致postgresql数据库无法启动

PostgreSQL之日常维护 专栏收录该内容
197 篇文章 8 订阅

 作者:瀚高PG实验室 (Highgo PG Lab)- 天蝎座

Inter-Process Communication   --进程间通信

进程间通信主要包括管道, 系统IPC(包括消息队列,信号,共享内存), 套接字(SOCKET).
PostgreSQL要求操作系统提供进程间通信(IPC)功能,特别是共享内存和信号量。

贝尔实验室基于内核对进程之间的通信手段进行了改进,形成了“System V IPC“。   
POSIX则是IEEE制定的标准,目的是为运行在不同操作系统上的软件提供统一的接口。

System V 效率稍差,可靠性高,应用更加广泛,因为可能有小部分操作系统没有实现POSIX标准,但是考虑到可移植性POSIX必然是一个趋势

共享内存方面,POSIX实现尚未完善,system V仍为主流。


pg数据库启动时:经常会遇到”Illegal system call“错误。这种情况下,只能修改内核配置,别无他法。
在启动服务器时,PostgreSQL通常会分配极少量的System V共享内存,以及大量的POSIX(mmap)共享内存。
另外,在服务器启动时会创建大量信号量(可以是System V或POSIX类型)。目前,POSIX信号量用于Linux和
FreeBSD系统,而其他平台则使用System V信号量。

在PostgreSQL 9.3之前,只使用了System V共享内存,因此启动服务器所需的System V共享内存量要大得多。

 System V IPC功能通常受到系统范围分配限制的限制。 当PostgreSQL超过这些限制之一,服务器将拒绝启动,
但是会留下一个指导性的错误信息描述的问题,以及如何做。 相关的内核参数在不同的系统中被一致地命名;
下表中给出了一个概述。
 
 System V IPC Parameters

Name	Description									Values needed to run one PostgreSQL instance

SHMMAX	共享内存段的最大大小(字节)				SHMMAX >=1 默认值更高
SHMMIN	共享内存段的最小大小(字节)				SHMMIN =1
SHMALL	可用共享内存总量(字节或页面)				SHMALL 按照bytes算(=SHMMAX),如果按照页算(SHMMAX/PAGE_SIZE)。还要加上其他应用的空间
SHMSEG	每个进程的最大共享内存段数					SHMSEG =1 默认值更高
SHMMNI	系统范围内共享内存段的最大数量				SHMMNI =SHMSEG + 其他应用
SEMMNI	信号量标识符的最大数目(即,集合)			SEMMNI =(max_connections+16)/16 
SEMMNS	系统范围内的最大信号量						SEMMNS = SEMMSL*SEMMNI
SEMMSL	每个信号集的最大信号量						SEMMSL >=17 
SEMMAP	信号图中的条目数							SEMMAP >SEMMNS
SEMVMX	信号量的最大值								SEMVMX >=1000 默认为32767。除非必要,否则不要修改。

Linux:

默认最大段大小为32 MB,默认最大总大小为2097152页。一个页面几乎总是4096字节,除非配置了“huge pages”
(使用getconf PAGE_SIZE来验证)。

共享内存大小设置可以通过sysctl接口进行更改。例如,要允许16 GB:

$ sysctl -w kernel.shmmax = 17179869184
$ sysctl -w kernel.shmall = 4194304
另外这些设置可以在重启之前保存在/etc/sysctl.conf文件中。强烈建议这样做。

早期发行版可能没有sysctl程序,但可以通过操作/ proc文件系统进行等效的更改:

$ echo 17179869184>/proc/sys/kernel/shmmax
$ echo 4194304> /proc/sys/kernel/shmall
其余的默认值非常大,通常不需要修改。


当内核参数配置有问题时,可能会出现postgres服务无法启动。

以下是两个案例:

FATAL:  could not create shared memory segment: Invalid argument
DETAIL:  Failed system call was shmget(key=5440001, size=4011376640, 03600).

这可能意味着你的内核对共享内存大小的限制比PostgreSQL试图创建的工作区域小(本例中为4011376640字节)。 
或者这可能意味着你根本没有在你的内核中配置支持System V类型的共享内存。
作为临时解决方法,您可以尝试使用小于正常数量的缓冲区(shared_buffers)启动服务器。
您最终将要重新配置您的内核以增加允许的共享内存大小。 如果尝试在同一台计算机上启动多个服务
器(如果请求的总空间超出内核限制),也可能会看到此消息。





FATAL:  could not create semaphores: No space left on device
DETAIL:  Failed system call was semget(5440126, 17, 03600).

上述错误并不意味着您的磁盘空间不足。 这意味着你的内核对System V信号量的限制
比PostgreSQL想要创建的数量要小。 如上所述,您可能可以通过减少允许的连接数(max_connections)
来启动服务器来解决问题,但是最终还是希望增加内核限制。

如果你得到一个“非法系统调用”的错误,你的内核可能根本不支持共享内存或信号量。 
在这种情况下,唯一的选择是重新配置内核来启用这些功能。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值