Ограничение числа php-fcgi процессов для mod_fcgid
Приведённые ниже директивы играют самую главную роль в ограничении числа php-fcgi процессов и в большинстве случаев приведённые здесь значения по умолчанию являются ущербными для серверов с оперативной памятью ниже 5-10 ГБ:
- FcgidMaxProcesses 1000 - максимальное количество процессов, которые могут быть активны одновременно;
- FcgidMaxProcessesPerClass 100 - максимальное количество процессов в одном классе (сегменте), т.е. максимальное количество процессов которое разрешено порождать через один и тот же враппер (wrapper - обвертку);
- FcgidMinProcessesPerClass 3 - минимальное количество процессов в одном классе (сегменте), т.е. минимальное количество процессов запускаемые через один и тот же враппер (wrapper - обвертку), которое будет доступно после завершения всех запросов;
- FcgidMaxRequestsPerProcess 0 - FastCGI должен "сыграть в ящик" после выполнения этого количества запросов.
Настройки тайм-аута жизни php-fcgi процессов
При активном размножении php-fcgi чилдов, поедая РАМу они могут жить чуть ли не вечно, а это чревато катаклизмами. Ниже есть перечень ГМО-директив, которые помогут урезать срок жизни для php-fcgi процессов и своевременно освободить занимаемые ими ресурсы:
- FcgidIOTimeout 40 - время (в сек.) в течении которого модуль mod_fcgid будет пытаться выполнить скрипт.
- FcgidProcessLifeTime 3600 - если процесс существует дольше этого времени (в секундах), то он должен будет помечен для уничтожения во время следующего сканирования процессов, интервал которого задается в директиве FcgidIdleScanInterval;
- FcgidIdleTimeout 300 - если число процессов превышает FcgidMinProcessesPerClass, то процесс, который не обрабатывает запросы за это время (в сек.), во время следующего сканирования процессов, интервал которого задается в директиве FcgidIdleScanInterval, будет отмечен для убивания;
- FcgidIdleScanInterval 120 - интервал, через который mod_fcgid модуль будет искать процессы превысившие лимиты FcgidIdleTimeout или FcgidProcessLifeTime.
- FcgidBusyTimeout 300 - если процесс занят обработкой запросов свыше этого времени (в сек.), то во время следующего сканирования, интервал которого задается в FcgidBusyScanInterval, такой процесс будет отмечен для убивания;
- FcgidBusyScanInterval 120 - интервал, через который выполняется сканирование и поиск занятых процессов превысивших лимит FcgidBusyTimeout;
- FcgidErrorScanInterval 3 - интервал (в сек.), через который модуль mod_fcgid будет убивать процессы ожидающие завершения, в т.ч. и те которые превысили FcgidIdleTimeout or FcgidProcessLifeTime. Убивание происходит путем отправки процессу сигнала SIGTERM, а если процесс продолжает быть активным, то он убивается сигналом SIGKILL.
Нужно принимать во внимание, что процесс превысивший FcgidIdleTimeout или FcgidBusyTimeout может прожить + ещё время FcgidIdleScanInterval или FcgidBusyScanInterval, через которое он будет отмечен для уничтожения.
ScanInterval-ы лучше устанавливать с разницей в несколько сек., например если FcgidIdleScanInterval 120, то FcgidBusyScanInterval 117 - т.е. чтобы сканирование процессов не происходило в одно и тоже время.
Активность порождения php-fcgi процессов
Если ничего из вышеприведённого не помогло, что удивительно, то можно ещё попробовать пошаманить с активностью порождения php-fcgi процессов...
Помимо лимитов на количество запросов, процессов php-cgi и времени их жизни, есть ещё такая штука как активность порождения дочерних процессов, которую можно урегулировать такими директивами как FcgidSpawnScore, FcgidTerminationScore, FcgidTimeScore и FcgidSpawnScoreUpLimit, перевод которых с буржуйского думаю я дал правильный (указаны значения по умолчанию):
- FcgidSpawnScore 1 - Каждый потомок процесса добавляет это значение к общему счету активности родительского процесса;
- FcgidTerminationScore 2 - После завершения каждого порожденного процесса это значение добавляется к общему счету активности родительского процесса;
- FcgidTimeScore 1 - число, которое каждую секунду вычитается из общего счета активности родительского процесса;
- FcgidSpawnScoreUpLimit 10 - Если текущий счет (Score) активности родительского процесса выше, чем значение FcgidSpawnScoreUpLimit, никакие дочерние процессы приложения не будут порождены, а все запросы на порождение должны будут ожидать, пока существующий процесс не освободится или пока оценка (Score) не упадает ниже этого предела.
Если мой перевод описания и понимание указанных выше параметров верное, то для понижения активности порождения php-cgi процессов следует понизить значение директивы FcgidSpawnScoreUpLimit или увеличить значения FcgidSpawnScore и FcgidTerminationScore.
|