Как узнать, использует ли мое PHP-приложение слишком много памяти? - PullRequest
9 голосов
/ 16 марта 2010

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 17 марта 2010

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

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

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

<?php
register_shutdown_function('log_mem');

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

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

HTH

С

3 голосов
/ 16 марта 2010

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

1 голос
/ 16 марта 2010

Вот инструмент, который поддерживает профилирование PHP: http://xdebug.org/docs/profiler

0 голосов
/ 16 марта 2010

В зависимости от вашей версии 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, вероятно, излишне, но, с другой стороны, ничего не вредит, так почему бы и нет.

...