目录
一、 问题描述
重启apache失败,刷新页面无法反应,查看apache报错日志,如下:
[Fri Jun 19 08:09:20.596555 2020] [core:emerg] [pid 29740:tid 139882613802816] (28)No space left on device: AH00023: Couldn't create the proxy mutex
[Fri Jun 19 08:09:20.596753 2020] [proxy:crit] [pid 29740:tid 139882613802816] (28)No space left on device: AH02478: failed to create proxy mutex
AH00016: Configuration Failed
[Fri Jun 19 08:09:42.692149 2020] [core:emerg] [pid 29800:tid 140199718229824] (28)No space left on device: AH00023: Couldn't create the proxy mutex
[Fri Jun 19 08:09:42.692320 2020] [proxy:crit] [pid 29800:tid 140199718229824] (28)No space left on device: AH02478: failed to create proxy mutex
二、定位排除故障
2.1 初步故障
根据报错信息No space left on device
,初步判断是磁盘空间满无法生成锁文件造成,查看磁盘空间
df -ah
发现磁盘空间充足
进一步怀疑是由于文件系统inode满造成的,使用df -ai
进行查看
发现同样剩余充足
2.2 继续定位
google发现,Apache起不来,报No space left on device: Couldn't create accept lock这个错,有可能是由于信号量不足引起的
ipcs -s|grep scrm
发现大量ipc使用
-bash-4.1$ipcs -s | grep scrm
0x00000000 1212419 scrm 600 1
0x00000000 1245188 scrm 600 1
0x00000000 1277957 scrm 600 1
0x00000000 18579474 scrm 600 1
0x00000000 18612243 scrm 600 1
0x00000000 18645012 scrm 600 1
0x00000000 53444632 scrm 600 1
0x00000000 53477401 scrm 600 1
0x00000000 53510170 scrm 600 1
0x00000000 19890215 scrm 600 1
0x00000000 19922984 scrm 600 1
0x00000000 19955753 scrm 600 1
0x00000000 21692458 scrm 600 1
0x00000000 21725227 scrm 600 1
0x00000000 21757996 scrm 600 1
0x00000000 22347824 scrm 600 1
0x00000000 22380593 scrm 600 1
0x00000000 22413362 scrm 600 1
0x00000000 25296950 scrm 600 1
0x00000000 25329719 scrm 600 1
0x00000000 25362488 scrm 600 1
0x00000000 38895685 scrm 600 1
0x00000000 38928454 scrm 600 1
0x00000000 38961223 scrm 600 1
0x00000000 36438091 scrm 600 1
0x00000000 36470860 scrm 600 1
0x00000000 36503629 scrm 600 1
0x00000000 29720660 scrm 600 1
0x00000000 29753429 scrm 600 1
0x00000000 29786198 scrm 600 1
0x00000000 29884503 scrm 600 1
0x00000000 29917272 scrm 600 1
0x00000000 29950041 scrm 600 1
0x00000000 30539866 scrm 600 1
0x00000000 30572635 scrm 600 1
0x00000000 30605404 scrm 600 1
0x00000000 39059564 scrm 600 1
0x00000000 39092333 scrm 600 1
0x00000000 39125102 scrm 600 1
0x00000000 40697970 scrm 600 1
0x00000000 40730739 scrm 600 1
0x00000000 40763508 scrm 600 1
2.3 排除故障
清除大量ipc
使用命令
for semid in `ipcs -s | grep scrm | cut -f2 -d" "`;
do ipcrm -s $semid;
done
再次使用ipcs -s | grep scrm
查看,发现已经没有了,直接重启APACHE,故障解决。
三、优化系统信号量参数
经过本次故障,发现系统信号量参数值过过小,需要优化
3.1 kernel.sem 信号量说明
sem其实是semaphores的缩写,一般是服务器在用作oracle数据库配置的时候,会需要调整该值,对于一般的程序来说基本是用不到的。但是对于处理大量进程的服务器以需要调整该值。其对应的有四个参数,具体如下:
[root@VM-APP ~]# cat /proc/sys/kernel/sem
250 32000 32 128
或者
[VM-APP ~]# 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
这四个参数的解释如下:
- cat /proc/sys/kernel/sem
- 250 32000 32 128
- 250 SEMMSL max semaphores per array #信号集容纳最大信号数量
- 32000 SEMMNS max semaphores system wide #所有信号的最大数量
- 32 SEMOPM max ops per semop call #调用单个信号集中最大信号数量
- 128 SEMMNI max number of arrays #信号集的最大值
3.2 查看信号量、优化参数和清理
信号量不够的时候有两种处理方法,一种是通过增加信息的值,另一种方法是删除某些信号量。
3.2.1 查看当前使用信号量。
查看当前使用信号量情况的方法如下:ipcs -a
3.2.2 修改系统参数增加信号量
修改/etc/sysctl.conf文件,在文件末尾增加如下内容:
kernel.sem =5010 641280 5010 128
使用sysctl -p
生效,这个会开机的时候自动生效,再次查看
-bash-4.1$ cat /proc/sys/kernel/sem
5010 641280 5010 128
发现已经生效
3.3.3 信号量的清理
命令如下:
##查看view用户下的所有信号量
-bash-4.1$ ipcs -a | grep view | wc -l
2
##清除view用户下的所有信号
-bash-4.1$ ipcs -a | grep view| awk '{print $2}' | xargs -n1 ipcrm -s