簡體   English   中英

在Linux apache上運行Drupal時發生內存泄漏,但是同一應用程序不會在Windows服務器上泄漏mem

[英]Memory leak when run Drupal on linux apache, but same application wont leak mem on windows server

當前我的網站正在使用drupal 6,apache http正在使用prefork mpm。 當我測試我的Web應用程序時,內存根本不會釋放,它只會增加內存使用量。 但是,在Windows上,它使用mpm_winnt.c可以正常工作,而不會發生內存泄漏。

如果我將其更改為在Linux服務器上使用worker.c,是否可以正常工作?

工作者模式不適用於Apache的mod_php。 因為如果已知PHP5是啟用多線程的,則並非所有PHP庫和擴展都並非如此(例如,語言環境調用將對apache進程中的所有PHP線程強制執行語言環境設置)。

因此,請勿使用輔助模型。 除非您在Apache之外使用PHP(與php-fpm一起使用)。 在Windows上,您可能會遇到相同的線程損壞問題(但正式地,Windows上的PHP發行版被認為是線程安全的,只要您不添加自編譯的PHP外部組件...)。

當你說 :

內存根本不會釋放

我不確定您是否完全了解正在發生的事情。 Apache將派生大量子進程。 如果您在這些子代上使用Drupal6應用程序,並為PHP設置了一個較大的memory_limit,則可以肯定的是Drupal將使用此內存限制,因此,如果您說您的Apache子進程為128M,則運行PHP將占用此RAM(如果Drupal要求這樣做) ,但是具有視圖的Drupal當然是不錯的RAM使用者。 當請求結束時,Apache子進程將不會釋放RAM,因為下一個查詢可能需要相同的數量。 因此,如果您允許100個MaxClients使用Apache並具有128M的內存限制,則最終可能會有128M * 100 = 12,5Go的RAM。 現在在Linux上使用可用RAM的事實已經不是問題,您可以將其視為一件好事。 您有可用的RAM,為什么不使用它呢? 您的問題可能是您沒有足夠的RAM(此處為12.5G,僅適用於Apache)

您可以使用MaxRequestsPerChild強制執行apache子進程的死,比如說值為100,然后在apache子進程處理了100個請求后,該請求將被殺死並重新創建。 但是,如果您的所有請求都需要128M RAM,那么您很快就會遇到相同的問題。

  • 為MaxClients設置較低的值(小於一個進程的可用RAM /平均RAM),
  • 將MySQL服務器推到另一台服務器上,同時也占用大量RAM
  • 嘗試找到memory_limit的下限(對於Drupal來說可能很難,但是請檢查所有Drupal分析模塊,並檢查塊的所有可見性設置,您會得到很好的提示)
  • 如果您的項目很大,請購買幾台apache服務器並使用http負載平衡構建解決方案。
  • 在fastcgi模式下使用php(例如php-fpm ),以便至少所有非php頁面將與輔助apache服務器一起使用(但在fastcgi php服務器內部會遇到相同的RAM使用問題)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM