Nginx

PHP致命錯誤:試圖分配47264368字節

  • December 18, 2019

在通過負載均衡器執行託管在兩個應用伺服器中的網站時,突然一個應用伺服器停止工作並掛起。從其他應用伺服器訪問日誌中發現 499 狀態並且平均負載也很高。大約 20 分鐘後,它開始提供 200 狀態。然後,當另一個應用伺服器完全重新啟動時,它也開始正常工作。

我不明白為什麼會突然發生這種情況。從錯誤日誌中,我發現了以下問題:

2019/11/03 12:43:19 [error] 26445#0: *30538354 FastCGI sent in stderr: "PHP message: PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 47264368 bytes) in /.........../sites/all/modules/contrib/memcache/dmemcache.inc on line 64" while reading response header from upstream, client: ............, server: .........., request: "................", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "...........", referrer: "..........."

現在,我需要做些什麼來解決這個問題,以便將來永遠不會發生?

更廣泛地說,您未能在 memcache 模組內分配記憶體。這表明您正在嘗試載入一個非常大的記憶體對象(根據錯誤消息,大約 47 MB​​)。在一個執行在 256 MB 記憶體限制下的伺服器中,將近 20% 的記憶體花在單個對像上不會很好。

在 Drupal 中,這表現為幾種形式:您可能需要“克服困難”並且 47 MB​​ 是一個中間對象,在這種情況下,您會看到簡單的頁面載入成功,然後任何依賴於該 47 MB​​ 對象的頁面載入失敗,直到其中一個成功,然後所有載入都成功。或者該對象可能是凝聚的,在這種情況下,您會看到請求開始正常,然後在當天晚些時候開始失敗。或者該對象可能特定於站點的特定部分,甚至是特定的本地化。真的很難知道,我的觀點是症狀並不總是一致的,甚至可能看起來不確定。

要進行調試,您可以從直接查詢 memcache 以查看大約該大小的記憶體中的內容開始,或者通過打開 memcache 模組中的詳細日誌記錄,以便它會GET在失敗時告訴您它正在嘗試什麼。有關如何執行後者的詳細資訊,請參閱此連結的“調試日誌記錄”部分,至少在 D7 中。如果有的話,您還可以從完整的堆棧跟踪中推斷出一些額外的上下文。

最終,正如 Bert 在這裡所暗示的那樣,調試它可能遠遠超出了您想要做的範圍。在這種情況下,增加memory_limit肯定會使問題暫時消失。雖然這似乎是一個簡單的出路,但請記住,在您執行上述調試步驟之前,該問題是否會再次出現仍將是一個無法回答的問題。

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