Apache: No space left on device: Couldn’t create accept lock

昨天启动内部服务器的apache时,没启动成功,看了下/var/log/httpd/error_log,有如下错误:
“[Mon Aug 06 09:32:20 2012] [emerg] (28)No space left on device: Couldn't create accept lock (/etc/httpd/logs/accept.lock.6399) (5)”

开始根据提示去找磁盘空间不足,发现磁盘空间充足,所以这里的“no space”不是指磁盘空间。

后来发现原因是一些IPC的资源占用问题,先用"ipcs"命令查一下当前用于已经使用了的信号量集合(semaphore sets),再用“sysctl”命令查询一下每个用户最多可使用的信号量,发现基本上占用完了,不能给新的apache进程使用了(尽管没有完全占满,但是httpd.conf文件中写了已开始启动8个server进程的,确实不够分配)。

我已经确定apache这个账号下的semaphores是不用了(除了给我的HTTPD服务器),所以只需要用“ipcrm -s”命令kill掉这些semaphore array即可,做了一个小脚本如下:

另外,也可以设置更改每个用户的semaphore array的最大数量,先查询后更改如下。

当然如果想让此更改永久生效,可以编辑“/etc/sysctl.conf”配置文件加上设置“sysctl kernel.sem = 250 256000 32 1024”,然后执行"sysctl -p"命令加载配置文件即可。

一些简单的知识和命令记录一下。

而其中kernel.sem参数的四个值分别表示:Parameters meaning:
SEMMSL - semaphores per ID
SEMMNS - (SEMMNI*SEMMSL) max semaphores in system
SEMOPM - max operations per semop call
SEMMNI - max semaphore identifiers
关于msgmni解释如下:
The parameter "msgmni" is the number of message queue ids available to the system. Each message queue requires one id. msgget() gives the error ENOSPC if all the ids have been used up.
而ipcs和ipcrm的用途如下:
ipcs - report XSI interprocess communication facilities status
ipcrm - remove an XSI message queue, semaphore set, or shared memory segment identifier

后记:
好记性不如烂笔头!
后来才发现,2010年时我也处理过类似问题的,当时用了别人的一个脚本来处理的,更多信息可参考如下的博客链接。
Linux IPC资源清理 : http://www.51testing.com/?uid-225738-action-viewspace-itemid-222385

master

Stay hungry, stay foolish.

发表评论

邮箱地址不会被公开。 必填项已用*标注

*