2012-01-11 117 views
1

首先,我想說我使用Drupal作爲CMS,並且我知道有單獨的Drupal stackexchange站點。但我的問題不是Drupal特定的,它不在用戶或高級用戶級別。它與PHP和服務器相關。好吧,現在問題。PHP應用程序性能

我開發了尚未推出的網站。隨機存取內存錯誤。有時服務器會崩潰。有助於重新啓動。沒有其他人使用應用程序,所以沒有重負載。特別是超過了特權限制。我嘗試了一些一般的東西 - 增加/減少PHP內存限制,尋找錯誤日誌,記錄緩慢的MySQL查詢。沒有...一樣。

我已經運行'top'linux命令。根據瀏覽器請求,有4-5個apache進程。 MEM使用率(%)是10,5,4,3,0.5。兩個過程運行> 10小時。 重新啓動apache後,我獲得了+ 40%的可用內存。

這裏有一些問題和mysts對我來說。

  1. 爲什麼這兩個進程在沒有來自瀏覽器的活動請求的情況下運行那麼久?我怎樣才能防止他們?
  2. 爲什麼我在重新啓動後有+ 40%的空閒內存,當我有10 + 5 + 4 + 3 + 0.5內存使用的Apache?這不應該是平等的?
  3. 這可能是內存泄漏嗎?我如何檢測它們?
  4. 我應該用什麼技術從較高層次降低到低層次?想象一下,在我的一個函數中我有'內存泄漏',我應該如何讓他在整個應用程序中?
  5. 如何基準我的特殊功能的內存和CPU使用率?
  6. 爲什麼服務器崩潰?即使基本的httpd重啓正在返回「fork:無法分配內存」。這可能是內存泄漏的症狀嗎?

請逐點回答。

+0

您是否使用過任何注重性能的模塊(例如[from this list])(http://drupal.org/project/modules?filters=tid%3A123%20drupal_core%3A103%20bs_project_sandbox%3A0&solrsort=sis_project_release_usage%20desc ))?當你使用一些分析器時你看到了什麼?你是否執行一些不尋常的任務,例如。用你自己的模塊(比如用每個請求重建菜單)?你使用緩存嗎? – Tadeck 2012-01-11 08:44:37

+0

未使用性能模塊。這不應該是發展中的問題,是的?一定要在生產中使用。我有一些自定義代碼影響每一個請求,但我幾乎可以肯定沒有什麼重要的東西。 – 2012-01-11 08:55:46

+2

您可以使用一些性能分析模塊,這些模塊將列出執行的功能和/或數據庫查詢以及執行所需的內存使用情況和時間。它可以縮小問題的範圍。當涉及到這個自定義代碼時,你可能是錯的,這完全取決於。例如。如果做得不正確,修改菜單可能會造成一些主要的性能下降。 – Tadeck 2012-01-11 09:08:35

回答

1

聽起來像你可能有一個無限循環的地方,或者你在處理諸如GD之類的事情時不釋放資源。

Linux有東西存放在內存中,如果有另一個RAM進程突然需要,並且RAM沒有被佔用,Linux會爲需要的應用程序釋放/交換它。檢查「免費」的輸出,你會注意到一個緩存列,指出只有緩存,並可以在任何時候釋放。

+0

好的,例如我有GD的問題,但我不知道它。我應該如何調試和理解問題出現在GD中?你如何做這樣的事情? – 2012-01-11 10:15:05

+1

PHP通常會返回內存中的哪一行,然後從那裏開始並向後註釋代碼塊,直到找到內存管理器。你可以像@kidata所說的那樣使用xdebug,但我不知道從哪裏開始,真正的開發人員不使用調試器*(笑話)* – Geoffrey 2012-01-11 10:18:29

+0

我不知道你是如何預測的,但GD函數似乎有些問題: D – 2012-01-11 10:36:53