1. 程式人生 > 實用技巧 >由於訊號量apache啟動問題

由於訊號量apache啟動問題

現象

客戶反饋執行apachectl start後無報錯資訊,但是網站無法訪問。

第一反應是防火牆遮蔽了httpd的埠或者SELinux問題。登入伺服器檢視:

[root@db ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@db 
~]# iptables -L -n -t nat Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination
[root@db ~]# grep -i selinux /etc/selinux/config 
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is
loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: SELINUXTYPE=targeted

發現防火牆和SELinux並未做限制,然後檢視httpd的啟動狀況

[root@db ~]# ps -ef|grep httpd|grep -v grep|wc -l
0
[root@db ~]# ss -lnltp|grep 80

發現httpd未啟動,這時嘗試啟動httpd,發現沒有前臺報錯,並且服務無法啟動,應該是Apache內部問題,這時檢視Apache錯誤日誌,發現有如下報錯資訊:

No space left on device : mod_rewrite : could not create rewrite_log_lock Configuration Failed

解決思路

看到報錯,感覺是磁碟空間被耗盡導致的,於是查了一下inode和磁碟空間,發現磁碟空間和inode還有很多剩餘。

由於Linux的磁碟空間由三部分組成:物理空間(block)、索引節點空間(inode)和訊號量(Semaphore)組成。

Linux系統訊號量

  Linux訊號量是一種鎖機制,用於協調系統上的程序間互斥的訪問臨界資源,確保某種共享資源不被多個程序同時訪問。有兩種實現標準,system v和POSIX,大多數系統都是使用的這兩種標準。這兩種標準系統呼叫的方式如下:

  • System v訊號量通過系統呼叫semget建立,通過Linux命令ipcs即可顯示程序間通訊system v型別訊號量和共享記憶體
  • POSIX 訊號量可用於執行緒和程序間通訊,分為有名和無名兩種。通過是否儲存在磁碟上進行區分
  1. 有名的訊號量 以檔案的形式儲存在/dev/shm,可用於不相關的程序間通訊(曾經看到過客戶將資料庫的資料目錄保存於此,牛逼!!)
  2. 無名訊號量 只能永遠忽執行緒間和父子程序間通訊

解決問題

檢視Linux系統預設訊號量的值

[root@db ~]# cat /proc/sys/kernel/sem
250    32000    32    128

含義如下:

SEMMSL: 此引數用於控制每個訊號集的最大訊號數
SEMMNS: 此引數用於控制整個Linux系統中訊號(不是訊號集)的最大數量
SEMOPM:此引數用於控制每個semop系統呼叫可以執行的訊號運算元
SEMMNI:此核心引數用於控制整個Linux系統中訊號集的最大數量

通過ipcs檢視httpd程序佔用了多少訊號量

[root@db ~]# ipcs -s|grep daemon