近期在kylin3.3的服务器上安装dm8,在初始化实例的时候报错“failed to create semaphore”,初始化实例失败,在经过一系列检查后,发现数据库版本,权限,系统资源都是正常的,最终发现原来linux系统中还有一个关于信号量的资源,虽然这个问题最终处理起来很简单,但在这里还是记录一下相关情况。
问题现象:
数据库使用dminit初始化实例操作报错,前台报错是“failed to create semaphore. The instance /home/dmdbms/data/DAMENG is running or check instance active failed.”数据库系统日志的提示信息也是关于os_sema2_craet_low semget failed的报错。
问题分析:
首先通过报错提示信息进行初步排查:
1.查看系统ulimit -a相关资源上限是否进行了配置,没有问题;
2.通过前台报错信息检查指定目录是否有正在运行的实例,结果并没有;
3.数据库系统日志出现了linux错误代码errno:28,代表“No space left on device”,经过检查发现服务器磁盘空间剩余很多;
经过上述确认后发现都没有问题,那只能硬着头皮去了解关于semaphore的相关信息了,后来确认的确是由于当前服务器上信号量集的资源不够导致的。
这里补充一下信号量的知识,可以很容易百度到:
信号量本质上是一个计数器,用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。在这个问题中我们只需要知道信号量也是linux系统中的一种资源,达梦在初始化实例的过程中也是需要申请信号量的。
使用命令ipcs -l可以查看信号量相关的资源限制:
或者通过命令cat /proc/sys/kernel/sem可以看到信号量的资源上限值:
第一列SEMMSL表示每个信号量set中信号量最大个数
第二列SEMMNS表示linux系统中信号量最大个数,设置值一般为SEMMSL * SEMMNI
第三列SEMOPM表示semop系统调用允许的信号量最大个数
第四列SEMMNI表示linux系统信号量set最大个数
通过命令ipcs -u可以看到当前系统中已经使用的信号量集和信号量总数:
解决方法:
在本次分析场景中我们只需要将信号量集个数增大一些即可(即第4列参数值,可以直接扩大一倍),设置方法如下:
vim /etc/sysctl.conf
修改kernel.sem =250 32000 32 256
执行sysctl -p 加载生效即可。
这时候我们发现可以正常的进行数据库初始化操作了。
文章
阅读量
获赞