2014-11-06 78 views
3

我被困在試圖調試內存大小不斷增長的Apache進程中。我在帶有4GB內存的虛擬Ubuntu主機上運行帶有MPM Prefork的Apache 2.4.6,並使用mod_wsgi爲Django應用程序提供服務。該應用程序是沉重的AJAX調用和Apache每分鐘獲得300-1000個請求。下面是我所看到的:Apache進程空閒並進食內存

  • 當我重新啓動Apache,第一子過程(與最低PID)將繼續增長其內存使用量,達到了在6或7分鐘的演出。所有其他Apache進程將保持每個進程的內存使用量在10MB-50MB之間。
  • 令人煩惱的過程的CPU使用率將會波動,有時會非常低,其他時間徘徊在20%或有時更高。
  • 麻煩的過程將無限期地運行,直到我重新啓動Apache。
  • 我可以在我的Django日誌中看到,麻煩的進程正在向多個遠程IP提供一些請求(主要是我看到了我的應用不喜歡的URL捕獲異常的報告)。
  • Apache錯誤日誌通常(但不總是)顯示PID的「IOError:無法寫入數據」,有時會跨越多個IP。
  • Apache訪問日誌確實不是顯示與此PID完成關聯的任何請求。
  • 除了'restart_syscall(< ...正在恢復中斷呼叫...「,即使在strace運行時我可以看到在我的應用程序日誌中提到PID時,運行PID的結果也不會得到結果

我試過設置MaxRequestsPerChild和MaxMemFree的低值既不似乎已產生任何影響。

那會是什麼或者我如何進一步調試?我看到的事實沒有strace的輸出使我我的應用程序有一個無限循環,如果是這樣的話,我怎麼能把PID追回到它執行的代碼路徑或啓動故障的請求中去?

回答

0

不要重新啓動Apache,請停止並啓動Apache。 Apache有一個已知的修復內存泄漏問題。

另外,考慮使用nginx和gunicorn-這個設置是一個輕量級,更快,並且經常推薦替代服務你的django應用程序和靜態文件。

參考文獻:

Performance

Memory Usage

Apache/Nginx Comparison