打算用zabbix监控PostgreSQL服务器。数据库
装上agent以后,却发现启动不了,日志里面报错以下:服务器
zabbix_agentd [10555]: cannot create Semaphore: [28] No space left on device多线程
zabbix_agentd [10555]: unable to create mutex for log fileide
google搜索了一下,发现是信号量不足
函数
修改/etc/sysctl.confgoogle
添加以下行:spa
kernel.sem = 500 64000 64 256线程
修改以后,执行sysctl -p /etc/sysctl.conf使其生效。日志
这样就把系统默认的信号量扩大了一倍orm
启动就成功了,其余机器没有出现这种状况,多是PG太占信号量了吧
下面是搜索到的信号量的相关知识:
信号量
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们可以正确、合理的使用公共资源。
Semaphore分为单值和多值两种,前者只能被一个线程得到,后者能够被若干个线程得到。
以一个停车场是运做为例。为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时若是同时来了五辆车,看门人容许其中三辆不受阻碍的进入,而后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,若是又离开两辆,则又能够放入两辆,如此往复。
在这个停车场系统中,车位是公共资源,每辆车比如一个线程,看门人起的就是信号量的做用。
更进一步,信号量的特性以下:信号量是一个非负整数(车位数),全部经过它的线程(车辆)都会将该整数减一(经过它固然是为了使用资源),当该整数值为零时,全部试图经过它的线程都将处于等待状态。在信号量上咱们定义两种操做: Wait(等待) 和 Release(释放)。 当一个线程调用Wait(等待)操做时,它要么经过而后将信号量减一,要么一直等下去,直到信号量大于一或超时。Release(释放)其实是在信号量上执行加操做,对应于车辆离开停车场,该操做之因此叫作“释放”是由于加操做其实是释放了由信号量守护的资源。
查看kernel.sem大小
sem实际上是semaphores的缩写,查看当前设置
#cat /proc/sys/kernel/sem
250 32000 100 128
或者
#sysctl -a|grep kernel.sem
error: permission denied on key 'kernel.cad_pid'
kernel.sem = 250 32000 32 128
或者
# 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
参数含义
上面的4个数据分别对应:SEMMSL、SEMMNS、SEMOPM、SEMMNI这四个核心参数,具体含义和配置以下。
SEMMSL :用于控制每一个信号集的最大信号数量。
Oracle 建议将 SEMMSL 设置为 init.ora 文件(用于 Linux 系统中的全部数据库)中的最大 PROCESS 实例参数的设置值再加上 10 。此外, Oracle 建议将 SEMMSL 的值设置为很多于 100 。
SEMMNS:用于控制整个 Linux 系统中信号(而不是信号集)的最大数。
Oracle 建议将 SEMMNS 设置为:系统中每一个数据库的 PROCESSES 实例参数设置值的总和,加上最大 PROCESSES 值的两倍,最后根据系统中 Oracle 数据库的数量,每一个加 10 。
使用如下计算式来肯定在 Linux 系统中能够分配的信号的最大数量。它将是如下二者中较小的一个值:SEMMNS 或 (SEMMSL * SEMMNI)
SEMOPM: 内核参数用于控制每一个 semop 系统调用能够执行的信号操做的数量。semop 系统调用(函数)提供了利用一个 semop 系统调用完成多项信号操做的功能。一个信号集可以拥有每一个信号集中最大数量的SEMMSL 信号,所以建议设置 SEMOPM 等于SEMMSL 。
Oracle 建议将 SEMOPM 的值设置为很多于 100 。
SEMMNI :内核参数用于控制整个 Linux 系统中信号集的最大数量。Oracle 建议将 SEMMNI 的值设置为很多于 100 。