CentOS内核信号量

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生效

        

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。