Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1365624
  • 博文数量: 185
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2664
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-01 13:46
个人简介

鸟在笼中,恨关羽不能张飞;Survival of the fittest

文章分类

全部博文(185)

分类: LINUX

2015-08-12 14:46:30



今天遇到这个事,系统里的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。








阅读(7052) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~