2010-03-16 2 views
9

Я работаю над веб-приложением PHP, которое позволяет пользователям общаться друг с другом, записывать события и общаться друг с другом. Всего около 100 пользователей.Как узнать, использует ли мое приложение PHP слишком много памяти?

Я установил приложение на VPS с Ubuntu 9.10, apache2, mysql 5 и php 5. У меня было 360 Мб ОЗУ, но обновлено до 720 МБ.

В последнее время мое веб-приложение испытывает сбои из-за чрезмерного использования памяти. Из того, что я могу сказать в журналах ошибок, кажется, что сервер автоматически убивает процессы apache, которые потребляют слишком много памяти. В результате я обновил память с 360 МБ до 720 МБ в качестве меры остановки.

Итак, мой вопрос в том, как я могу решить эти проблемы с отключением? Как узнать, нужен ли мой сайт для большей памяти из-за плохого кода или если он является частью естественного роста веб-сайта? Каков наиболее эффективный способ определить, какие скрипты PHP потребляют большую часть памяти?

+1

у вас есть только 720MB памяти? вы должны подумать о том, чтобы получить больше ОЗУ. вы не используете программное обеспечение, которое было 10 лет назад. – ghostdog74

+0

Насколько я должен иметь память? – John

+2

@ ghostdog74: Он использует VPS, который является виртуальным сервером, где вы обычно ежемесячно платите за ресурсы диска и памяти. – spoulson

ответ

4

Нет простого ответа на этот вопрос, хотя я подозреваю, что это может быть проблемой в вашем коде.

Какая у вас настройка memory_limit в файле php.ini? Обычно я рекомендую по крайней мере 4 МБ, и обычно 16. Сколько одновременных показов вы выставляете? Является ли сайт большим количеством отчетов о статистике? Или рендеринг изображений через PHP? Вы используете file_get_contents() в любом месте?

Вам действительно нужно настроить некоторые пользовательские протоколирования для отчета по каждому URL-адресу, размер файла журнала при выходе. например вы могли бы автоматическое PREPEND:

<?php 
register_shutdown_function('log_mem'); 

function log_mem() 
{ 
    fputs(STDERR, '[' . date('c') . '] ' . memory_get_usage() . ' ' 
    . $_SERVER["REQUEST_URI"] . "\n"); 
} 

(примечание - нет закрывающего тега) Это выпишет память, используемую каждую PHP страницы в error_log, так что вы можете изолировать проблему более легко.

НТН

C.

+0

Получение: «Предупреждение: fputs() ожидает, что параметр 1 будет ресурсом, строка задана ...» – Stefan

0

В зависимости от версии HTTPD & PHP, HTTPD может держаться сегментов памяти, что это не нужно, и растущий размер запущенного процесса без необходимости , У меня есть ящик, который делает это, и я решил эту проблему, выполнив перезапуск HTTPd по ночам, как так:

30 00 * * *  /httpd/sbin/apachectl restart 
31 00 * * *  /httpd/sbin/apachectl start 
35 00 * * *  /httpd/sbin/apachectl start 
40 00 * * *  /httpd/sbin/apachectl start 

Как вы можете видеть, я следую мой рестарт с 3 задней начинается, только в случае, если apache не сможет вернуться к жизни после перезагрузки. 3, вероятно, слишком много, но, с другой стороны, ничего не болит, так почему бы и нет.

+0

Не знаю, почему это происходит, многие люди сообщают о утечке памяти при использовании стека лампы: http://www.google.com/search?q=httpd+php+memory+leak&ie=utf- 8 & oe = utf-8 & aq = t & rls = org.mozilla: ru-US: official & client = firefox-a Не означает, что это HTTP-утечка памяти, она также может быть библиотекой, вызываемой внутри php. Это не отрицает тот факт, что это httpd-процесс, который будет отнесен к памяти ... – Zak

+0

Кроме того, возможно *, что я получаю процесс, который не умирает в течение периода времени, который пытается перезагрузить Поддержка Apache. Более конкретно, у меня был апаш, умирающий в полночь изящным, из-за того, что процесс забирал непомерное количество времени, чтобы умереть. Опять же, если вы собираетесь спускать вниз, я буду признателен за причину, по крайней мере, за лучший способ делать вещи ... – Zak

+0

Он становится downvoted, потому что это не решение, это обходное решение. Есть много мест для поиска таких утечек, которые вряд ли могут быть связаны с сообщенной проблемой, когда куча zvar заполняется. – symcbean

3

Еще одна вещь, которую вы можете сделать, если размер вашего процесса небольшой, - это отключить настройки вашего httpd, чтобы иметь минимальные резервные серверы из 1 и максимальные резервные серверы 3. Если у вас только 100 пользователей, это должно быть хорошо, поскольку вы не заботятся об издержках запуска процессов только для нескольких пользователей.

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