postgresql数据库信号量问题排查

信号量本质上是一个计数器(不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作),用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享,以保证它们能够正确、合理的使用公共资源。Semaphore就像可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来,有时被称为信号灯。

linux系统信号量设置与etc/sysctl.conf中的kernel.sem值有关,具体如下:
kernel.sem=500 5120000 2500 9000
第一列,SEMMSL,表示每个信号集中的最大信号量数目。
第二列,SEMMNS,表示系统范围内的最大信号量总数目。
第三列,SEMOPM,表示每个信号发生时允许的最大系统操作数。
第四列,SEMMNI,表示系统范围内的最大信号集总数目。
(SEMMNS = SEMMSL * SEMMNI)

如果信号量不足,可能会出现部份segment无法启动的问题,数据库日志中会报如下错误:
在这里插入图片描述
可以通过以下命令排查信号量问题:

  1. 查看当前系统信号量情况:
ipcs -l

在这里插入图片描述或者cat /proc/sys/kernel/sem

在这里插入图片描述

  1. 查看当前系统信号量具体使用情况
ipcs -s

在这里插入图片描述信号量在创建时分信号量集和信号量的概念,该命令的查询结果中,Semaphore Arrays下面每一行代表一个信号量集,其中perms对应信号量集的权限,nsems对应信号量集中信号量的个数。

  1. 查看信号集总数
ipcs -s |sed '1,3'd |sed '$d' |wc -l

在这里插入图片描述该值应小于SEMMNI

  1. 查看信号量总数
ipcs -s |sed '1,3'd |sed '$d' |awk '{print $5}' |xargs |sed 's/ /+/g' |bc

在这里插入图片描述
该值应小于SEMMNS

修改了/etc/sysctl.conf中的配置后需要执行sysctl -p命令来生效,执行后可以使用ipcs -l或者cat /proc/sys/kernel/sem命令来检查是否生效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值