今天遇到这个事,系统里的apache相关进程突然就没了,由于这台服务器以前都是开发管理的,我这就登录上看了眼。很简单的httpd start后发现日志报错,说是空间不足,No space left on device: Couldn't create accept lock。想来很简单嘛,df一看无论是硬盘空间还是inode都还有大把剩余,所以g了一下,才发现是共享内存方面的问题。
ipcs -s后会发现很多的信号量,如下。
------ Semaphore Arrays --------
key semid owner perms nsems
0x00000000 0 daemon 600 1
0x00000000 65537 daemon 600 1
0x00000000 98306 daemon 600 1
............
如果apache非正常关闭,这些东西是不会自动清除的,所以就会导致日志说的那堆错误信息。
没别的办法了,先手动删除一下
for semid in `ipcs -s | grep daemon | cut -f2 -d" "`;do ipcrm -s $semid; done
然后重启apache即可。
当然这问题已经解决了,但这只是解决表面现象,所以我们需要再找找根本原因。
接着找,会发现还有会设置kernel.msgmni这个值来解决这个问题的说法。
它指定消息队列标识的最大数目,即系统范围内最大多少个消息队列。
缺省设置值是16,不过肯定不够,所以先加到32试下。
以为这就完了?理论上应该是,但既然有关系统共享内存方面的,我就顺便看了眼共享内存的设置。
kernel.shmall = 2073742
kernel.shmmax = 152516352
这2个,这里要提醒的,这两个值要根据系统物理内存大小来设置,如果过大就不生效了。
sysctl -a | grep shm
vm.hugetlb_shm_group = 0
kernel.shmmni = 4096
kernel.shmall = 2073742
kernel.shmmax = 152516352
shmall 是全部允许使用的共享内存大小
shmmax 是单个段允许使用的大小
这两个可以设置为内存的 90%。
例如 16G 内存,16*1024*1024*1024*90% = 15461882265
shmall 的大小为 15461882265/4k = 3774873。
阅读(7328) | 评论(0) | 转发(0) |