Apache 記憶體問題
所以我敢肯定這可能以前被問過,但我想確保我得到正確的資訊。
我正在使用 Debian 5 和 Apache 2.2 執行 360 Linode 盒子。我自己編譯了所有東西(沒有apt-get)。時不時地(每隔幾週一次?),我的伺服器會隨機“崩潰”:它會達到 100% 的 CPU(實際上是 400%,但你知道我的意思)並交出盒子。您無法通過 SSH 查看問題所在,並且伺服器本身停止接受連接。修復它的唯一方法是重新啟動盒子。
最近,它開始以相對頻率發生:24 小時、12 小時、10 小時、8 小時、6 小時、4 小時。最後,我設法在大約兩天前鎖定之前瞥見了它。我注意到磁碟 IO 升高了,幾乎沒有剩餘的 RAM!此外,還有大量的 httpd 程序在 3-4% 的 RAM 上執行。至於船載,我的意思是當我執行 ps -ef 時,它們佔據了整個螢幕。如果您向上滾動,它們會佔用我的 SSH 客戶端的整個緩衝區。
所以我對我的程式碼進行了一些調整,認為某些東西沒有正確關閉。我修復了我的 PHP 中的記憶體問題,我打開了更精細的錯誤日誌記錄並修復了一堆錯誤,這似乎在某種程度上有所幫助。崩潰又回到了大約每 24 小時一次。
我確信這是因為記憶體太少而造成的,而且我收到的點擊量正在將我的伺服器踢到交換中。由於有太多請求命中交換,磁碟 IO 突飛猛進,導致我的 CPU 使用率突飛猛進,導致我的伺服器鎖定。
這是我試圖修復它所做的:我做了一些研究,發現我可能應該使用 prefork。我在我的配置中環顧四周,找不到任何 ServerLimit 或 MaxClients 或類似的東西,所以我添加了一些“預設”值,我的伺服器拒絕接受 /any/ 傳入連接。實際上,prefork 值通過阻塞連接來阻止所有入站 http 流量(可能是因為我的伺服器無法處理 prefork?idk)。
在我看來,我的伺服器“過去所做的”很好,除了所有這些 apache 程序一直掛起並洩漏記憶體。有沒有辦法在 Apache 程序上設置超時或限制它們的數量?最好的解決方案是使用 prefork,這似乎很愚蠢。我不得不想像有更好的方法。
多謝你們
看來您正在艱難地學習 PHP 是一個記憶體消耗者並且不是特別可擴展的。
一些建議,排名不分先後:
如果您仍然懷疑記憶體洩漏,請將 MaxRequestsPerChild 設置為非常低的值。
考慮購買更多的記憶體,360 兆現在真的不多。
嘗試通過執行 ps 或 top 找到 httpd 程序的平均大小,然後設置 MaxClients 以便所有內容始終適合記憶體。交換是一個死亡螺旋,因為它處理請求的速度越慢,apache 需要分叉的程序越多,使用的記憶體就越多。
如果您將 php 作為 apache 中的模組載入,它會為每個請求載入,無論是腳本還是靜態文件(圖像或 css 或 .js 或諸如此類)。考慮從單獨的伺服器提供靜態內容,或者使用 fastcgi 或反向代理(如 nginx)讓 apache 僅提供 php 以限制您必須保留在記憶體中的胖 php 實例的數量。