Я работаю над веб-приложением PHP, которые позволяют нам пользовательская сеть друг с другом, заказывают события и передают друг друга. Существует только приблизительно 100 пользователей.
Я настроил приложение на VPS с Ubuntu 9.10, apache2, mysql 5 и php 5. Я имел 360 Мбит RAM, но обновил до 720 МБ.
В последнее время мое веб-приложение испытывало отключения электричества из-за чрезмерного использования памяти. Из того, что я могу сказать в журналах ошибок, кажется, что сервер автоматически уничтожает апачские процессы, которые используют слишком много памяти. В результате я обновил память от 360 МБ до 720 МБ как временная мера.
Таким образом, мой вопрос, как я иду о решении этих вопросов отключения электричества? Как я знаю, происходит ли потребность моего веб-сайта в большей памяти из-за плохого кода или если это - часть естественного роста веб-сайта? Что состоит в том, чтобы определить самый эффективный путь, какие Сценарии PHP используют большую часть памяти?
На этот вопрос нет простого ответа, хотя я подозреваю, что это может быть проблема в вашем коде.
Каков параметр 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
C.
Вот инструмент, поддерживающий профилирование PHP: http://xdebug.org/docs/profiler
В зависимости от вашей версии 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, наверное, перебор, но, с другой стороны, ничего не повредит, так почему бы и нет.
Еще одна вещь, которую вы можете сделать, если размер вашего процесса небольшой, - это уменьшить в настройках httpd минимальное количество резервных серверов, равное 1, и максимальное количество резервных серверов, равное 3. Если у вас всего 100 пользователей, это должно быть нормально, поскольку вам не нужны накладные расходы на запуск процессов только для нескольких пользователей.