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

Несколько процессов php-cgi.exe в IIS

На производственном сервере выполняется приложение PHP на IIS 6.0. В часы пик у нас было несколько проблем, когда количество процессов php-cgi.exe увеличивалось и приближалось к 200. Сервер начинает сканировать, и нам приходится перезапускать сервер несколько раз, чтобы восстановить нормальное поведение. Когда сервер работает нормально, я заметил, что в диспетчере задач всего 10-15 процессов php-cgi.exe.

Что может быть причиной увеличения числа процессов php-cgi.exe с 10-15 до примерно 200 в часы пик? Где мне искать причину?

IIS6 CGI - это обычно 1 запрос → 1 процесс. 15 одновременных процессов PHP-CGI, вероятно, связаны с 15 одновременными запросами PHP-CGI. Или у вас высокая скорость зависания процессов PHP, и они просто не завершаются должным образом.

В Windows запуск процесса не такой дешевый, как в * nix (мне сказали); Потоки Windows легки и могут быть просто развернуты внутри процессов, но запуск процесса стоит дорого.

Запуск нового процесса для каждого входящего запроса может варьироваться от «дорогостоящего» до «катастрофического». Может случиться так, что ваша нагрузка увеличится, когда вы увидите 200 параллельных процессов, т. Е. У вас есть 200 невыполненных запросов «в процессе». В какой-то момент производительность упадет до уровня, когда новая работа будет выполняться быстрее, чем старая работа может быть завершена, и если вы перезапускаете сервер, чтобы справиться с этим, вы просто наказываете пользователей. Кто может сразу же сделать еще один запрос, чтобы повторить попытку.

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

В любом случае, это длинный способ добраться до: вы пробовали FastCGI? http://learn.iis.net/page.aspx/247/using-fastcgi-to-host-php-applications-on-iis-60/

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

Каждый экземпляр PHP-CGI остается активным, пока через него прокачивается более 1000 запросов, после чего ему разрешается завершить работу, и вместо него запускается новый. Из памяти есть группа процессов, которые делают это одновременно для обработки одновременных запросов (по умолчанию может быть 4, 5 или 10, настраивается), и производительность должна быть (намного) лучше.

Вам действительно не следует использовать IIS6 с PHP, он не очень хорошо поддерживается. Рассмотрите возможность перехода на IIS 7.5.

Поскольку процессы (против потоков) являются ресурсоемкими, ваша система занимает всю доступную оперативную память, когда у вас работает 200 процессов php-cgi.

Попробуйте установить maxInstances до 10 * количество имеющихся у вас процессоров ЦП.

Это ограничивает количество запускаемых CGI-процессов.

Кроме того, в качестве альтернативы IIS с PHP, который основан исключительно на CGI, вы можете использовать пакет WAMP, который использует PHP как модуль Apache (на основе потоков). Это значительно сократит количество используемых ресурсов и, как правило, сможет обрабатывать больше соединений. Я использую один под названием WampDeveloper Pro, который готов к работе и поддерживается. Также есть XAMPP и WAMPServer, которые бесплатны, но могут быть не лучшим вариантом в производственной среде.

Все зависит от пропускной способности.

Каждое соединение создает новый экземпляр php-cgi.exe

Так что больше пользователей = больше экземпляров php-cgi.exe

Он будет выполняться один раз для каждого скрипта, который необходимо запустить. Это часы пик ... это пользователи вашего сайта.

Оптимизируйте свои скрипты, чтобы позаботиться об этом.