Назад | Перейти на главную страницу

Как автоматически возобновить работу php-fpm?

Я использую nginx + php-fpm в Debian Squeeze для загруженного сервера, и у меня были большие трудности с достижением максимального количества подключений. Здесь проблема в том, что процессы php иногда просто умирают случайным образом при высокой нагрузке и оставляют сервер без процесса php. Затем мне нужно вручную перезапустить службу php5-fpm, чтобы вернуть сервер к жизни.

Мне интересно, как этого избежать или, по крайней мере, лечить симптомы, автоматически перезагружая php5-fpm всякий раз, когда не остается процесса php для прослушивания входящих запросов. Мои соответствующие конфигурации:

pm = dynamic
pm.max_children = 1400

pm.start_servers = 10
pm.max_spare_servers = 20
pm.process_idle_timeout = 1s; #not sure it will be useful when pm=dynamic
pm.max_requests = 100000
request_terminate_timeout = 30

Я ценю ваши предложения по решению этой неприятной проблемы.

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

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

Вы определили, что процесс действительно умирает. В этом случае это так же просто, как определить, существует ли еще процесс. ps aux должен сделать это за вас.

например:

ps aux|grep php-fpm|grep -v grep|awk '{print $2}'

должен выводить идентификатор процесса php-fpm. Если его нет, его необходимо перезапустить.

так что что-то вроде этого должно сработать. (коротко и просто)

#!/bin/bash
pid=`ps aux|grep php-fpm|grep -v grep|awk '{print $2}'`
if [ $pid == '' ]
then
service php-fpm restart
fi

Этот скрипт будет запускаться как crontab каждую минуту. и он НЕ был отлажен. так что поэкспериментируйте и убедитесь, что он работает.

Проблема с тем, чтобы делать это с зомби-процессами, заключается в том, что они действительно существуют и «работают», но физически ничего не делают. в этом случае их нужно сначала убить, а затем перезапустить процесс.

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

Надеюсь, поможет. Удачи

Проблема php-fcgi заключается в следующем: процесс продолжает работать после каждого запроса (в отличие от php-cgi). Каждый запрос увеличивает использование памяти процессом php. В любой момент процесс достигает предела памяти php.

Вы можете избежать этого, уменьшив

pm.max_requests = <value>

pm.max_children = 1400

Вы же не хотите устанавливать такой высокий параметр max children. На самом деле это слишком много.

Вы можете поэкспериментировать с этим, но, честно говоря:

Начать с:

pm.max_children = 50

И посмотрим, как получится.