2013-05-04 56 views
1

我在那裏有symfony2應用程序。但是我們有RAM內存問題......當有50個活躍的人(谷歌分析)時,它就像一個魅力。symfony2 free -m內存不足

我選擇DB數據usally這樣的:

 $qb=$this->createQueryBuilder('s') 
     ->addSelect('u') 
     ->where('s.user = :user') 
     ->andWhere('s.admin_status = false') 
     ->andWhere('s.typ_statusu != :group') 
     ->setParameter('user', $user) 
     ->setParameter('group', 'group') 
     ->innerJoin('s.user', 'u')    
     ->orderBy('s.time', 'DESC') 
     ->setMaxResults(15); 

return $query=$qb->getQuery()->getResult(); 

的查詢速度快我沒有問題與他們。

讓我請確切地知道你需要什麼,我會粘貼在這裏。我需要解決這麼多..

但現在的問題來了:當有470people在同一時間。(谷歌分析)有左右的內存7GB了......那之後倒下高峯到5GB。但爲什麼這麼多?我的腳本佔用了app_dev中10-17MB的內存使用量。

我也使用APC。我該如何解決這種情況?爲什麼有這麼多的內存消耗? Thx任何建議!

什麼是你的平均記憶?

順便說一句:當我不解決這個問題時,我會陷入困境。

+0

我有一堆野生Symfony2的應用程序,但是沒有任何地方需要接近這一數額的記憶。你正在運行APC嗎? – catchamonkey 2013-05-04 15:13:20

+0

是的,我正在運行APC。 – EnchanterIO 2013-05-04 15:43:39

+0

你有一個類似的問題之前(http://stackoverflow.com/questions/16347256/symfony2-performance-ram-memory)。我想這仍然是同樣的問題:你正在保存太多的數據。向我們展示一些代碼如何從db中檢索數據。 – ihsan 2013-05-05 01:28:32

回答

1

一個問題可能是學說,如果你在每一個請求中保存了太多的對象。

+0

它的一種posiblle。但我正在檢索我真正需要的東西。但是我可以在某些查詢中指定某些列從數據庫中撤回,而不是整個表......這會減少對象的數量和保持正確的權利?或者你會建議什麼? – EnchanterIO 2013-05-04 20:45:19

+0

我不知道您的應用程序,但LIMIT結果和用戶界面中的分頁可能是一個起點。 – 2013-05-04 20:50:03

+0

我對select的每個查詢都有MaxResult ...並且我不使用分頁。我正在做。我選擇讓我們說「博客」(15)。比我拿這15個博客的所有ID。並且從這些博客ID排列在這15個博客中的數據庫中撤回評論。這個可以嗎?我需要這樣做,因爲不知何故,我在代碼中修改了我需要選擇的ID。這個查詢是非常非常快速順便說一句。 – EnchanterIO 2013-05-04 20:55:27

1

腳本設置最大執行時間只有30秒:

max_execution_time = 30 

設置APC shm_size相比於你的記憶的東西合理:

apc.shm_size = 256M 

然後優化您的查詢。如果你在cli中使用php/symfony,你最好在cli中限制php的資源使用。

+0

什麼是shm_size?而256是你的建議基於我的屏幕內存? – EnchanterIO 2013-05-05 01:22:49

+0

它是以MB爲單位的每個共享內存段的大小。默認情況下,某些系統(包括大多數BSD變體)對共享內存段的大小具有非常低的限制。 (http://www.php.net/manual/en/apc.configuration.php#ini.apc.shm-size) – ihsan 2013-05-05 01:24:56

+0

但是,不,這不是我對你的8G內存(這是相當大的)的建議。使用更大,如1G或2G。 – ihsan 2013-05-05 01:25:54

1

確保您正確理解內存消耗。 http://blog.scoutapp.com/articles/2010/10/06/determining-free-memory-on-linux

要快APC,則您可以用apc.stat = 0刪除修改後的校驗,但是你需要在每次修改現有文件的時間來清除APC-緩存:http://www.php.net/manual/en/apc.configuration.php#ini.apc.stat

以減少內存消耗降低水化我加入->select('x'),僅取必要。

優化內存消耗啓動MySQL緩存,像/etc/mysql/my.cnf:

query_cache_size=128M 
query_cache_limit=1M 

不要忘了啓用和檢查慢的查詢日誌,以避免瓶頸。

+0

他並沒有試圖加速他的應用程序,他試圖減少內存消耗......但第一個鏈接是有用的! – Martin 2013-05-14 09:41:50

1

我懷疑你的頁面有多一個查詢。頁面上發生了多少查詢?教條中最糟糕的是通過getter(例如getComments())進行查詢的能力。如果您使用的是多對多關係,則會導致嚴重問題。您可以在開發環境中通過探查器查看所有查詢。

也可能,在Apache或PHP的設置中的問題。 php-fpm的錯誤設置也會導致問題。最好的解決方案是使用siege等工具對服務器進行壓力測試,並查看htop或top上的內容。300人可能是「赤裸裸的」阿帕奇的重負荷

1

你有沒有試過檢索標量結果而不是對象集合?

// [...] 
return $query=$qb->getQuery()->getScalarResult(); 

http://docs.doctrine-project.org/en/latest/reference/query-builder.html#executing-a-query http://doctrine-orm.readthedocs.org/en/2.0.x/reference/dql-doctrine-query-language.html#query-result-formats

在symfony的配置級別,你有沒有仔細檢查您的配置,以確保高速緩衝已被正確啓用?

http://symfony.com/doc/current/reference/configuration/doctrine.html#caching-drivers

卸下從實體管理實體可以根據您的整個過程證明是有用的:

http://docs.doctrine-project.org/en/2.0.x/reference/working-with-objects.html#detaching-entities

+0

是的,在我使用getSingleScalarResult的web的一些地方...關於緩存,我的查詢緩存我可以看到。 – EnchanterIO 2013-05-14 06:34:43

+0

您是否在您的流程中定期清理實體經理? http://docs.doctrine-project.org/en/2.0.x/reference/working-with-objects.html#detaching-entities – 2013-05-14 20:43:28

+0

hm ...不,我從來沒有這樣做嗯...你認爲它需要很多內存? – EnchanterIO 2013-05-15 10:03:23