日常問題解決:記一次因信號量不足引起的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM