Linux

Apache Web 伺服器間歇性停止

  • August 13, 2014

我們的 SOAP Web 伺服器在 CentOS 上的 Apache 上以 PHP 執行,並大量使用 MySQL。對伺服器的需求很大——大多數請求非常小,只涉及兩個或三個 MySQL 查詢,但它們的數量非常多——在高峰時間可能每秒幾百個。每個請求的數據流量通常小於 1Kb,通常只有幾個字節。

執行它的硬體相當不錯,18 個核心和 32 Gb RAM,並且通常可以很好地應對。CPU 使用率從未真正超過 30%,物理 RAM 消耗從未超過 50%。然而,每隔一段時間,伺服器似乎就會停止,而 Apache 就會阻塞。這可能會持續大約一分鐘,然後再次鬆動並恢復正常服務。

我已經對此進行了相當深入的分析,以了解攤位期間發生了什麼。Apache 的連接已達到極限,幾乎所有連接都處於“閱讀”狀態。CPU 使用率下降到幾乎為零,記憶體使用率沒有變化,網路和磁碟 IO 都直線下降,所以看起來系統完全處於空閒狀態。

在做了很多Google搜尋之後,我被引導相信這可能與一些超時設置有關 - 網路連接沒有足夠快地釋放,並且 Apache 用完了。這可以解釋為什麼 Apache 會在一段時間後恢復正常執行,它會等待它們都超時,然後繼續。執行“netstat -an”將支持這一點,因為我確實在 TIME_WAIT 中看到了很多連接。但是,我已經減少了 Apache 配置中的各種超時設置,以及 sysctl.conf 中的各種網路設置,但似乎沒有任何東西可以解決問題。

Apache 的錯誤日誌中根本沒有任何內容。我已經嘗試使用“ab”對 Apache 進行壓力測試——它似乎會導致間歇性停頓發生得稍早一些,但這就是我能從中真正衡量的全部。Apache 和 MySQL 的最大連接數都設置為高值 - 實際並發連接永遠不會關閉,除非在 Apache 連接數達到最大時的停頓期間。

我不確定還有什麼可以嘗試的。關於我可能在這裡遺漏的東西的任何想法或指示?

  • 編輯 -

一些額外的觀察。隨著停頓的發生,我注意到處於 ESTABLISHED 狀態的連接數顯著增加,然後幾秒鐘後 CLOSE_WAIT 中的連接數隨之增加。

此外,當停頓發生時,“套接字的監聽隊列溢出的次數”和“忽略監聽套接字的 SYN”的數量會迅速增加。在攤位之間的間隔期間,這些數字根本沒有變化。

我不確定這些數字是失速的原因還是結果。任何進一步的幫助將不勝感激。

我現在已經解決了這個問題,所以我發布解決方案以防其他人遇到同樣的問題。

我沒有提到我們所有的網路流量都通過 HTTPS,這似乎是原因。在停頓期間,我使用 strace 和 pstack 來查看其中一個空閒的 Apache 程序在做什麼。它被困在等待 SSL 會話記憶體的互斥體上。

查看 Apache 配置,我注意到我們啟用了 SSLSessionCache,超時時間為 5 分鐘。禁用這是修復。

我的猜測是會話記憶體已滿,然後 Apache 在繼續之前等待舊會話超時。

引用自:https://serverfault.com/questions/618196