一、kernel.sem 信号量

sem其实是semaphores的缩写,这个在oracle数据库配置的时候,会需要调整该值,对于一般的程序来说基本是用不到的。不过现网中也遇到过个别主机上zabbix agent信号量不够用的情况。其对应的有四个参数,具体如下:

 1# cat /proc/sys/kernel/sem
 2250     32000   32      128
 3或者
 4# ipcs -ls
 5------ Semaphore Limits --------
 6max number of arrays = 128
 7max semaphores per array = 250
 8max semaphores system wide = 32000
 9max ops per semop call = 32
10semaphore max value = 32767

关于这四个参数的解释如下:

1cat /proc/sys/kernel/sem
2250     32000   32      128
3250       SEMMSL    max semaphores per array     #信号集容纳最大信号数量
432000     SEMMNS    max semaphores system wide   #所有信号的最大数量
532        SEMOPM    max ops per semop call       #调用单个信号集中最大信号数量
6128       SEMMNI    max number of arrays         #信号集的最大值

二、查看、增加与清理

信号量不够的时候有两种处理方法,一种是通过增加信息的值,另一种方法是删除某些信号量。

1、查看信号量

查看当前使用信号量情况的方法如下:

 1# ipcs -a
 2------ Message Queues --------
 3key        msqid      owner      perms      used-bytes   messages
 4------ Shared Memory Segments --------
 5key        shmid      owner      perms      bytes      nattch     status
 60x00000000 0          zabbix     600        576        6          dest
 70x00000000 32769      zabbix     600        3577056    6          dest
 80x00000000 65538      zabbix     600        576        42         dest
 90x00000000 98307      zabbix     600        16777216   42         dest
100x00000000 131076     zabbix     600        4194304    42         dest
110x00000000 163845     zabbix     600        4194304    42         dest
120x00000000 196614     zabbix     600        8388608    42         dest
130x00000000 229383     zabbix     600        12720      42         dest
140x00000000 262152     zabbix     600        8388608    42         dest
150x011434b6 20938761   root       600        1000       7
160x011434b9 20971530   root       600        1200712    7
170x00000000 557067     root       600        524288     2          dest
180x00000000 917516     root       600        524288     2          dest
190x00000000 17301517   root       600        524288     2          dest
200x00000000 1081359    root       600        16777216   2          dest
210x00000000 18808848   root       600        524288     2          dest
220x00000000 17432606   root       600        4194304    2          dest
23------ Semaphore Arrays --------
24key        semid      owner      perms      nsems
250x002fa327 65536      root       600        2
260x00000000 3407873    apache     600        1
270x00000000 3440642    apache     600        1
280x00000000 163843     apache     600        1
290x00000000 3473412    apache     600        1
300x00000000 3506181    apache     600        1
310x00000000 3538950    apache     600        1
320x00000000 3571719    apache     600        1
330x00000000 3604488    apache     600        1

这里输出的比较多,当然也可以只用ipcs -s只看信号量信息。

2、增加信号量

修改/etc/sysctl.conf文件,增加如下内容:

1kernel.sem =5010 641280 5010 128

使用sysctl -p生效,这个会开机的时候自动生效,临时生效也可以使用如下方法:

1echo "5010 641280 5010 128" > /proc/sys/kernel/sem

3、信号量的清理

信号量的清理使用ipcrm,具体如下:

1//查看当前zabbix用户信号数量
2# ipcs -a | grep zabbix | wc -l
390
4//清理zabbix用户的所有信号量
5# ipcs -a | grep zabbix| awk '{print $2}' | xargs -n1 ipcrm -s