儘管限制了 MaxRequestsPerChild,Apache 程序仍在增長
伺服器版本:Apache/2.2.27 (Unix) mod_ssl/2.2.27 OpenSSL/1.0.1e-fips DAV/2 mod_bwlimited/1.4 PHP/5.4.27 mod_perl/2.0.6 Perl/v5.8.8 CENTOS 6.6 PHP 處理程序 - DSO
伺服器正在使用 prefork 模組執行。Apache 子程序從大約 10mb 開始並逐漸增長(超過 100mb)。我正在開始搜尋記憶體洩漏的過程 - 但在此期間,我將 MaxRequestsPerChild 減少到 500(從 10000),基於我的理解,這會更早地殺死孩子並從 10mb 開始。然而,事實上,記憶體還在繼續增加(幾天后它增長到 23mb。這讓我覺得我沒有正確理解某些東西。
我假設子程序正在死亡,因為我看到正在創建新的 PID,並且可以在 Apache 狀態頁面中看到每個子程序的訪問次數增加。
這可能與記憶體有關嗎?我啟用了用於 PHP 的 eAccelerator,最大記憶體分配為 16mb(目前使用大約 3mb)。我意識到我對記憶體記憶體的管理方式知之甚少(我假設它是共享的,而不是與每個子程序複製的)。
額外的想法……在子程序增長幾天后 - 記憶體佔用量在沒有乾預的情況下回落到更小的值。例如,在它達到 100mb 的峰值後,一天下降到 25mb 左右(沒有重新啟動 Apache)。這可能只是正常行為嗎?
一旦新程序開始,它可能會立即處理幾個請求,從而從 10 倍增長到 2 倍 MB,並給您錯誤的比例感。
不幸的是,僅通過查看 top 或 /proc 數據,您將無法獲得完整的圖片。您可能會被實時數字所誤導。通過一些監控工具收集統計數據可以讓您更好地了解正在發生的事情。
關於 MaxRequestsPerChild 設置 - 你確實做對了,這個設置告訴 apache 之後應該處理的服務請求數量被回收(例如:殺死並替換為新程序)。但是,這並不能保證您的程序將保持在 10MB 限製附近,因為即使是第一個請求服務也會將共享內容載入到記憶體中,這些內容將繼續使用,直到該特定 PID 死亡。我建議您將它進一步降低 - 到 50。您基本上是在用 CPU 換取記憶體 - 例如,降低數量,更多的 CPU 週期將用於殺死現有的和分叉新的 apache 程序。今天的伺服器往往擁有過多的 CPU 能力,因此在這種情況下,將 CPU 換成 RAM 通常是安全的。
另外,當你談到記憶體使用時,你沒有具體說明你是如何計算每個程序的使用的?您是否計算了“比例集大小(PSS)”以排除所有 apache 程序之間共享的記憶體段?看看smem。