Linux

如何使用 Apache 和 PHP 調查記憶體洩漏?

  • March 10, 2017

我們正在執行一個執行財務建模的重型 Drupal 網站。考慮到 apache 使用的記憶體超時而 apache 程序的數量保持穩定,我們似乎遇到了某種記憶體洩漏:

在此處輸入圖像描述

在此處輸入圖像描述

我們知道記憶體問題來自 apache/PHP,因為每當我們發出 a 時/etc/init.d/httpd reload,記憶體使用量都會下降(見上面的截圖和下面的 CLI 輸出):

在 httpd 重新載入之前

$免費
記憶體的已用空閒共享緩衝區總數
電話:49447692 45926468 3521224 0 191100 22609728
-/+ 緩衝區/記憶體:23125640 26322052
互換:2097144 536552 1560592

httpd重新載入後

$免費
記憶體的已用空閒共享緩衝區總數
電話:49447692 28905752 20541940 0 191360 22598428
-/+ 緩衝區/記憶體:6115964 43331728
互換:2097144 536552 1560592

每個 apache 執行緒都分配了一個memory_limit512MB 的 PHP,它解釋了低請求量的情況下記憶體使用率高,以及一個max_execution_time120 秒的 PHP,它應該終止執行需要更長時間的執行緒,因此應該防止記憶體使用量的持續增長。看到。

問:我們如何調查導致此記憶體洩漏的原因?

理想情況下,我正在尋找可以在系統上執行的故障排除步驟,而不必打擾開發團隊。

附加資訊:

OS: RHEL 5.6
PHP: 5.3
Drupal: 6.x
MySQL: 5.6

僅供參考,我們知道我們正在單獨調查的交換問題,與我們在交換開始發生之前觀察到的記憶體洩漏無關。

我們知道記憶體問題來自 apache/PHP,因為每當我們發出 /etc/init.d/httpd reload 時,記憶體使用量都會下降

不 - 這只是意味著它與網路流量有關。你繼續提到你在盒子上執行 mysql - 大概是管理網路伺服器的數據 - 它很容易成為這裡的罪魁禍首。與您未提及的 webstack 使用的其他服務一樣。

每個 apache 執行緒都分配了一個 512MB 的 PHP memory_limit,這解釋了

不,它沒有。您報告平均有 7 個和最多 25 個繁忙的伺服器 - 但您的記憶體圖顯示大約 25Gb 的增量。

確實,您應該從基本的 HTTP 調整重新開始——您似乎在執行恆定的 256 個 httpd,但您的峰值使用量是 25——這簡直是愚蠢的。

和 120 秒的 max_execution_time 應該終止執行需要更長時間的執行緒

否 - 僅當執行執行緒在 PHP 解釋器中時 - 不會在 PHP 被阻塞時。

執行財務建模

(嘆)

如果您提供了有關如何配置 Apache、執行緒或 prefork、什麼版本、如何呼叫 PHP(模組、cgi、fastcgi)、是否使用持久連接、是否使用儲存過程的詳細資訊,將會很有幫助。

我建議您首先將 mysql 移動到單獨的機器上並停止使用持久連接(如果您目前正在使用它們)。將記憶體限制設置更低,並在每個腳本的基礎上覆蓋它。確保您已安裝並配置了循環引用垃圾收集器。

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