以前的某次重启apache时,就遇到过这个问题,并解决了


没想到,昨天又碰到了此问题,第一反映还是用df查看空间


结果各个区的空间都正常,没有满


实在想不起来是怎么处理的了,于是又Google了一把如下:


系统的信号量可能用完了,造成apache启动时无法获取相应的信号量


貌似apache是使用信号量同它的子进程通信的


使用如下命令查看当前的系统已经使用的信号量



折叠复制代码




  1. ipcs -s

  2. ------ Semaphore Arrays --------

  3. key semid owner perms nsems

  4. 0x00000000 6684672 daemon 600 1

  5. 0x00000000 6750209 daemon 600 1

  6. 0x00000000 6782978 daemon 600 1

  7. ......




使用如下命令来查看当前内核支持的最大信号量



折叠复制代码




  1. ipcs -l

  2. ------ Semaphore Limits --------

  3. max number ofarrays=128

  4. max semaphores perarray=250

  5. max semaphores systemwide=32000

  6. max ops per semopcall=32

  7. semaphore maxvalue=32767




如下脚本来清除当前被占用的信号量,其中daemon是apache启动时对应的owner



折叠复制代码




  1. for i in `ipcs -s | awk '/daemon/ {print $2}'`; do (ipcrm -s $i); done




然后,再重启apache就可以了


通过编辑/etc/sysctl.conf文件,可以修改系统的信号量



折叠复制代码




  1. kernel.msgmni=1024

  2. kernel.sem=2503200032 128




其中,250为每个信号集中的最大信号量数目,32000为系统范围内的最大信号量总数目


32为每个信号发生时的最大系统操作数目,128为系统范围内的最大信号集总数目


然后,使用sysctl -p命令来使修改的参数生效