Значение PHP_FCGI_CHILDREN и max-procs в конфигурации Lighttpd и Fastcgi

В конфигурации fastcgi есть 4 поля: max-procs, max-load-per-proc, PHP_FCGI_CHILDREN,PHP_FCGI_MAX_REQUESTS:

fastcgi.server = ( ".php" =>
  (( "socket" => "/tmp/php-fastcgi.socket",
     "bin-path" => "/usr/local/bin/php",
     "max-procs" => "2",
     "bin-environment" => ( 
                           "PHP_FCGI_CHILDREN" => "3",
                           "PHP_FCGI_MAX_REQUESTS" => "10000" )
   ))
)
  • Так как в fastcgi.server есть только 1 запись, будет 1 бэкэнд Fastcgi.
  • Поскольку PHP_FCGI_CHILDREN =3 и max-procs=2, количество процессов "/usr/local/bin/php" будет 2*(3+1)=7.
  • Поскольку max-procs=2, в статусе сервера будет статус fastcgi.backend.0.0 и fastcgi.backend.0.1

Итак, будет 1 fastcgi бэкэнд с 2 процессами. Эти процессы принимают нагрузку.

Я не понимаю следующее:

  1. Какое значение имеет PHP_FCGI_CHILDREN?
  2. Обрабатывается ли запрос PHP_FCGI_CHILDREN или процедурой?
  3. Какой параметр определяет максимальную нагрузку в 1 процесс? И каково его значение по умолчанию?
  4. Имеет ли максимальная загрузка процедуры какое-либо отношение к PHP_FCGI_MAX_REQUESTS?
  5. Что будет, если PHP_FCGI_CHILDREN=0? Было упомянуто, что max-proc = количество наблюдателей и max-proc*PHP_FCGI_CHILDREN= количество рабочих. Что это значит?
  6. Когда процедура считается перегруженной?

1 ответ

Надеюсь, что это проливает некоторый свет на ситуацию

Небольшой контекст для остальной части этого ответа:

"Основной" процесс - это процесс, который порождается. Это может поделиться всеми своими ресурсами [как память] со своими детьми. Но, тем не менее, не обрабатывает запросы php, думайте об этом как о контейнере для реальных обработчиков запросов.

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

Общая стратегия здесь должна заключаться в том, чтобы минимизировать количество "основных" процессов и максимизировать количество "дочерних" процессов при сохранении стабильности, поскольку дочерние процессы будут иметь общий opcache, memoryspace и системные ресурсы со своими братьями и сестрами.

  1. PHP_FCGI_CHILDREN = Количество дочерних процессов, которые может породить "главный" процесс.
  2. Запросы обрабатываются PHP_FCGI_CHILDREN
  3. PHP_FCGI_CHILDREN и по умолчанию оно равно 1, и если установлено другое значение, оно всегда добавляет 1 к указанному вами номеру [поэтому, если вы укажете его как 1, оно добавит 1, так что оно станет 2]
  4. Да, это так
  5. Если вы установите PHP_FCGI_CHILDREN=0 каждый "основной" процесс будет порождать только 1 дочерний процесс
  6. Процесс перегружен, когда он не может обрабатывать больше запросов [из-за нехватки ресурсов] Это очень зависит от системы / окружающей среды, так что извините за то, что здесь так плохо

По-видимому, кросс-пост на https://redmine.lighttpd.net/boards/3/topics/6683

Вы смотрели в документации вики?
https://redmine.lighttpd.net/projects/1/wiki/Docs_ModFastCGI

Вы смотрели в FAQ?
https://redmine.lighttpd.net/projects/1/wiki/FrequentlyAskedQuestions

Вы пытались использовать поисковую систему, прежде чем делать несколько сообщений на этом форуме?
https://www.google.com/#q=PHP_FCGI_CHILDREN+PHP_FCGI_MAX_REQUESTS
https://serverfault.com/questions/199953/lighttpd-php-fcgi-children-correct-value

Другие вопросы по тегам