今天公司網站伺服器突然不能上,登上伺服器發現httpd服務不能shutdown,報如下錯誤:httpd dead but subsys locked ;把/var/lock/subsys/下的httpd删除重新開機httpd服務也不行,檢視/var/log/httpd/error_log發現錯誤如下:No space left on device:Couldn't create accept lock ; 在網上找了下,解決辦法如下:
1.首先确定你的磁盤空間是否真的不足或者已經達到配額;
2.如果磁盤空間還很充足或配額也夠,那麼apache能産生’accept lock‘的另一個原因是 semaphore, semaphore是一個内部用于與其子程序進行交流的工具," No space left on device: Couldn't create accept lock "的意思是說apache不能再建立新的semaphore程序。用如下指令檢視有多少 semaphore在運作。
ipcs -s
你将會看到
------ Semaphore Arrays --------
key semid owner perms nsems
0x00000000 68681743 apache 600 1
0x00000000 68714515 apache 600 1
0x00000000 68747291 apache 600 1
你可運作如下指令來安全的殺死每個 Semaphore
ipcrm -s <semid>
<semid>是上面ipcs -s輸出的第二列值。
想要一次性将所有的Semaphore全部殺死,請運作如下指令:
for semid in `ipcs -s |awk '{print $2}'`; do ip crm -s $semid; done
如果不能再建立更多的Semaphores:
有些時候你可能想改變系統允許建立 semaphores的數量。這就需要改變核心參數。如果你在虛拟機上運作而不能改變核心參數,請聯系你的主機提供商來改變這個參數。運作以下指令來檢視目前參數:
ipcs -l
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 32768
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1
------ Semaphore Limits --------
max number of arrays = 1024
max semaphores per array = 250
max semaphores system wide = 256000
max ops per semop call = 32
semaphore max value = 32767
------ Messages: Limits --------
max queues system wide = 1024
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
修改 /etc/sysctl.conf檔案,增加如下兩行:
kernel.msgmni = 1024
kernel.sem = 250 256000 32 1024
運作指令
sysctl -p
使剛改的參數生效。
(kernel.msgmni 該檔案指定消息隊列辨別的最大數目,即系統 範圍内最大多少個消息隊列。 預設設定 : 16)