zoukankan      html  css  js  c++  java
  • 日常问题解决:记一次因信号量不足引起的APACHE启动错误解决以及kernel.sem值优化

    一、 问题描述

    重启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
    
    
  • 相关阅读:
    牛客算法周周练2
    牛客算法周周练2
    2020年7月7日Java学习日记
    2020年7月6日Java学习日记
    练习29--if语句
    练习28--布尔练习
    练习27--记忆逻辑
    第18~19讲课后作业
    第20讲:内嵌函数和闭包
    练习25--更多更多练习
  • 原文地址:https://www.cnblogs.com/yj411511/p/13161701.html
Copyright © 2011-2022 走看看