我正在尋找關於我應該在哪裡深入挖掘的建議。
很快,Apache2 伺服器會在啟動 2-15 小時後停止處理請求。結果我必須service apache2 restart
每半天做一次。
長版:
- 我從專用伺服器(Ubuntu 13.04)運行幾個網站(Apache 2.2.22 於 2013 年 7 月 12 日建置)。
- Apache2 伺服器在半年多的時間裡表現良好,現在突然停止處理所有網站(大約有 5 個網站)上的請求,直到 apache 進程重新啟動。
- 我在 /var/log/apache 中找不到任何關於該問題的異常日誌。
service apache2 status
報告進程正在運行
我很高興聽到您的建議,以及我在我的情況下該怎麼辦。
更新:
跑步netstat -an | grep 80
:
tcp6 0 0 :::80 :::* LISTEN
tcp6 325 0 SERV_IP:80 IP_A:35514 CLOSE_WAIT
tcp6 332 0 SERV_IP:80 IP_B:34198 CLOSE_WAIT
tcp6 379 0 SERV_IP:80 IP_C:57859 CLOSE_WAIT
tcp6 0 0 SERV_IP:80 IP_A:35060 CLOSE_WAIT
tcp6 360 0 SERV_IP:80 IP_A:38481 CLOSE_WAIT
tcp6 466 0 SERV_IP:80 IP_B:56324 CLOSE_WAIT
tcp6 361 0 SERV_IP:80 IP_A:53466 CLOSE_WAIT
tcp6 1 0 SERV_IP:80 IP_A:38102 CLOSE_WAIT
tcp6 196 0 SERV_IP:80 IP_E:58125 ESTABLISHED
還有更多類似的條目,大約有 150 個。
ps aux | grep apache
:
root 2968 0.0 0.0 452240 21116 ? Ss 16:08 0:01 /usr/sbin/apache2 -k start
www-data 5217 0.0 0.0 463584 23820 ? S 17:04 0:03 /usr/sbin/apache2 -k start
後面的行(www-data)大約有 120 個,所以我假設有 120 個 apache 進程?
strafe
在 apache2 根進程上使用:
sudo strace -f -p 2968
Process 2968 attached - interrupt to quit
select(0, NULL, NULL, NULL, {0, 264394}) = 0 (Timeout)
wait4(-1, 0x7fff6d157a6c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
wait4(-1, 0x7fff6d157a6c, WNOHANG|WSTOPPED, NULL) = 0
在 www-data 進程之一上使用:
sudo strace -f -p 8554
Process 8554 attached - interrupt to quit
flock(40, LOCK_EX
哇,在我看來,apache 進程似乎陷入了困境,一旦超過最大連線限制,它就會停止建立新實例。但為什麼他們會被卡住呢?
htop、iotop、jnettop 不報告任何異常。 (無超載)
UPDATE2:過去兩天伺服器不再崩潰。所以我無法獲得更多資訊。一旦獲得更多信息,我將留下一個指向具有更好結構的新問題的連結。謝謝
答案1
無論「service apache2 status」報告如何,當您執行 ps aux 時,您是否看到 apache 進程?
出現問題時可以執行netstat -n 嗎?也許您用完了資源(例如文件描述符),您可能有太多打開的連接。
問題期間你的cpu利用率高嗎?也許系統記憶體不足並且正在崩潰?
http 伺服器回應連線被拒絕或連線只是逾時?
在後一種情況下,我建議執行 strace -f -p [apachepid],您可能會發現哪個系統呼叫正在封鎖請求。前者可能是 apache 崩潰了。
您代理 Tomcat 或其他應用程式伺服器還是提供純靜態 html?
您是否配置了身份驗證?例如,身份驗證層可能出現問題
更新:
在第二個strace中,我看到這個flock(40,LOCK_EX,也許進程試圖在某個地方獲得獨佔鎖?你可以執行lsof -n -p 8554(或任何pid嘗試聚集)並查看它嘗試鎖定哪個檔案(40是檔案描述子)。