1)前言
最近在启动数据库的时候遇到了一个报错,大概就是信号量不足的报错,入职这么久还是这一次遇到这个问题,所以查了一些资料,记录一下。
2)什么是信号量
信号量类似于一个计数器,主要用于控制多个进程对共享资源的访问,以防止进程访问特定的资源。网上看到一个比较容易理解的例子:停车场。如果停车场只能停三辆车,那么信号量就相当于3,进去一辆信号量就减1,出去一辆就加1,当为0时,就等待。每辆车就好比一个线程,停车场就是公共资源,信号量就是一个非负整数。在信号量上有两种操作,wait和release,当wait时,要么通过并将信号量减1,要么等待知道信号量值为大于1或者超时。当为release时,对应的就是车离开停车场,释放了公共资源,信号量加1。
3)如何查看kernel.sem大小
第一种方法:执行 cat /proc/sys/kernel/sem
执行结果:250 32000 100 128
注:kernel.sem = SEMMSL SEMMNS SEMOPM SEMMNI,其参数含义:
SEMMSL :用于控制每个信号集的最大信号数量。
SEMMNS:用于控制整个 Linux 系统中信号(而不是信号集)的最大数。
SEMOPM: 内核参数用于控制每个 semop 系统调用可以执行的信号操作的数量。semop 系统调用(函 数)提供了利用一个 semop 系统调用完成多项信号操作的功能。一个信号集能够拥有每个信号集中最大数 量的SEMMSL 信号,因此建议设置 SEMOPM 等于SEMMSL 。
SEMMNI:内核参数用于控制整个 Linux 系统中信号集的最大数量。
第二种方法:执行ipcs -ls
执行结果:
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
第三种方法:执行sys_ctl -a | grep kernel.sem
kernel.sem = 250 32000 32 128
4)如何修改kernel.sem
第一种方法:动态设置内核参数
sysctl -w kernel.sem="250 32000 32 256"
第二种方法:永久生效,修改sysctl.conf文件
echo "kernel.sem = 250 32000 32 256" >> /etc/sysctl.conf
执行sysctl -p生效