No space left on device: AH00023 AH00016: Configuration Failed
磁碟空間明顯充足,但 Apache 無法啟動,錯誤指向「裝置無剩餘空間」。
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
ipcs -s | grep -E 'apache|www|nginx|httpd' | awk '{print $2}' | xargs -r ipcrm -s
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
/var/log/httpd/error_logevent MPM 比 prefork 更少依賴信號量ipcs -s | wc -l 告警| 階段 | 動作 | 指令 |
|---|---|---|
| 即時修復 | 清理殘留信號量 | ipcs -s | awk '/apache/{print $2}' | xargs ipcrm -s |
| 永久預防 | 調大 kernel.sem | echo 'kernel.sem = 500 512000 100 2048' >> /etc/sysctl.conf && sysctl -p |
| 根治 | 排查異常退出原因、升級 MPM | 查 error_log、考慮 event MPM |
遇到 AH00023 不要慌,**90% 是信號量殘留**,清理即可秒啟動。