2013-05-04 2 views
1

У меня есть приложение symfony2. Но у нас проблемы с ОЗУ ... Это работает как шарм, когда есть 50 активных людей (Google Analytics).symfony2 свободный -m из памяти

Я выбираю данные из БД 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 в то же время .. (Google Analytics) есть 7 ГБ памяти прочь ... потом упасть после пик до 5 ГБ. Но ПОЧЕМУ ТАК МНОГО? Мои сценарии занимают от 10 до 17 МБ использования памяти в app_dev.

Я также использую APC. Как я могу решить эту ситуацию? Почему так много памяти потребляется? Thx для любого совета !!

Какое у вас среднее значение?

BTW: Когда я не решит это, у меня будут большие неприятности.

+0

У меня есть куча Symfony2 приложений в дикой природе, но никто не нужен какой-либо этой суммы памяти. Вы используете APC? – catchamonkey

+0

Да, я бегу APC. – EnchanterIO

+0

У вас есть аналогичный вопрос до (http://stackoverflow.com/questions/16347256/symfony2-performance-ram-memory). Я думаю, это все та же проблема: вы увлажняете слишком много данных. Покажите нам некоторый код, как вы извлекаете данные из db. – ihsan

ответ

1

Одна проблема может быть доктриной, и если вы увлажняете слишком много obejcts в каждом отдельном запросе.

+0

его вид posiblle. Но я получаю именно то, что мне действительно нужно. Но я мог бы указать некоторые столбцы в некоторых запросах, которые будут изъяты из БД, а не целая таблица ... что уменьшило бы количество предметов и увлажняло бы? Или что бы вы посоветовали? – EnchanterIO

+0

Я не знаю вашего приложения, но результаты LIMIT и разбиение на страницы в пользовательском интерфейсе могут быть отправной точкой. –

+0

У каждого запроса для выбора есть MaxResult ... И я не использую разбиение на страницы. Я делаю. Я выбираю позволяет сказать «блоги» (15). Затем я беру все идентификаторы этих 15 блогов. И изъятые комментарии из БД, где идентификатор блога находится в массиве из этих 15 блогов. Это нормально? Мне нужно это так, потому что как-то я modifiy в коде ID, который мне нужно выбрать. Этот запрос очень-очень быстрый. – EnchanterIO

1

Установить максимальное время выполнения скрипта только 30 секунд:

max_execution_time = 30 

комплект APC shm_size к чему-то разумное по сравнению с вашей памяти:

apc.shm_size = 256M 

Затем оптимизировать запрос. И если вы используете php/symfony в cli, вам лучше ограничить использование ресурсов для php в cli.

+0

Что такое shm_size? А 256 - это ваше предложение, основанное на моем баране с экрана? – EnchanterIO

+0

Это размер каждого сегмента разделяемой памяти в МБ. По умолчанию некоторые системы (включая большинство вариантов BSD) имеют очень низкие ограничения на размер сегмента разделяемой памяти. (http://www.php.net/manual/en/apc.configuration.php#ini.apc.shm-size) – ihsan

+0

Но нет, это не мое предложение для вашей памяти 8G (что довольно большое). Используйте больше, например, 1G или 2G. – ihsan

1

Убедитесь, что вы правильно понимаете потребление памяти. http://blog.scoutapp.com/articles/2010/10/06/determining-free-memory-on-linux

Для быстрой APc вы можете удалить модифицированную проверку с apc.stat = 0, но вам нужно будет очистить АРС кэша каждый раз при изменении существующих файлов: 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

1

Я подозреваю, что на вашей странице есть больше одного запроса. Сколько запросов на странице? Хуже всего то, что в доктрине есть возможность делать запросы через getter (например, getComments()). Если вы используете отношение «многие ко многим», это приводит к огромным проблемам. Вы можете просмотреть все запросы через профайлер в среде dev.

Также возможно, что проблема в настройках 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

На уровне конфигурации симфони, у вас перепроверил свою конфигурацию, чтобы обеспечить кэширование было включено правильно?

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 ... о кешировании, мои запросы кэшированы, я вижу это. – EnchanterIO

+0

Вы регулярно очищаете своих менеджеров сущностей в своем процессе? http://docs.doctrine-project.org/en/2.0.x/reference/working-with-objects.html#detaching-entities –

+0

hm ... нет, я никогда этого не делал ... вы думаете это так много барана? – EnchanterIO

Смежные вопросы