首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Apache 啟動報錯「No space left on device: AH00023」解決方案:清理 IPC 信號量殘留

     編輯:PHP 綜合知識

錯誤現象

No space left on device: AH00023
AH00016: Configuration Failed

磁碟空間明顯充足,但 Apache 無法啟動,錯誤指向「裝置無剩餘空間」。

根本原因:System V IPC 信號量洩漏

Apache (prefork/worker MPM) 啟動時會建立大量子進程,進程間通訊 (IPC) 依賴 **System V 信號量**。若 Apache 異常終止(kill -9、OOM Killer、段錯誤),信號量未被正確釋放,累積超過核心限制(kernel.sem),導致新啟動失敗。

即時解決:清理殘留信號量

方法一:針對特定使用者清理(推薦)

# 停止 Apache
systemctl stop httpd
# 或 /etc/init.d/httpd stop

# 列出 apache 使用者擁有的信號量並刪除
for i in $(ipcs -s | awk '/^apache/ {print $2}'); do
    ipcrm -s $i
done

# 啟動 Apache
systemctl start httpd

方法二:一鍵清理所有 Apache/相關使用者信號量

ipcs -s | grep -E 'apache|www|nginx|httpd' | awk '{print $2}' | xargs -r ipcrm -s

方法三:Perl 單行指令(舊版系統相容)

ipcs -s | grep apache | perl -e 'while () { @a=split(/\s+/); system("ipcrm sem $a[1]") }'

永久預防:調整核心參數

編輯 /etc/sysctl.conf,增加信號量上限:

# 格式:SEMMSL SEMMNS SEMOPM SEMMNI
# SEMMSL: 每個信號量集合最大信號量數
# SEMMNS: 系統全域最大信號量數
# SEMOPM: 每次 semop 最大操作數
# SEMMNI: 最大信號量集合數
kernel.sem = 500 512000 100 2048

套用:

sysctl -p

建議值: 高併發伺服器可設 kernel.sem = 1000 1024000 200 4096。

驗證核心參數

ipcs -l
# 或
sysctl kernel.sem

進階排查:找出洩漏源頭

  1. 檢查 Apache 錯誤日誌:/var/log/httpd/error_log
  2. 確認是否有第三方模組(mod_php、mod_perl、mod_wsgi)未正確清理資源
  3. 考慮切換 MPM:event MPM 比 prefork 更少依賴信號量
  4. 監控腳本:定時執行 ipcs -s | wc -l 告警

總結

階段動作指令
即時修復清理殘留信號量ipcs -s | awk '/apache/{print $2}' | xargs ipcrm -s
永久預防調大 kernel.semecho 'kernel.sem = 500 512000 100 2048' >> /etc/sysctl.conf && sysctl -p
根治排查異常退出原因、升級 MPM查 error_log、考慮 event MPM

遇到 AH00023 不要慌,**90% 是信號量殘留**,清理即可秒啟動。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved