Производительность CGI, FastCGI и ISAPI в acWEB
По просьбе Андрея Матвеева добавил в acWEB поддержку FastCGI. Потом позапускал небольшой стресс-тест для выявления багов, утечек и производительности: с помощью CURL 5ю потоками получал в каждом потоке по 100 раз страницу http://127.0.0.1/egroupware/admin/index.php (выбрано приложение, используемое заказчиком . В пяти режимах — CGI, FastCGI, FastCGI nts, ISAPI и ISAPI+eAccelerator. Багов и утечек не выявлено.Производительность такова:
Версия PHP | Режим | На 500 запросов затрачено секунд |
5.2.9-2 | CGI | 317 |
5.2.9-2 | FastCGI | 140 |
5.2.9-2-nts | FastCGI | 101 |
5.2.9-2 | ISAPI | 126 |
5.2.8-nts | FastCGI | 115 |
5.2.8 | ISAPI+eAccelerator | 64 |
Итого: FastCGI быстрее ISAPI только в случае использования особой nts-версии ("непотокобезопасной"), в которой нет межпоточных блокировок. Между рекомендуемым пулом из 8 процессов и 4х процессов разницы в производительности практически нет. При использовании одного FastCGI-процесса падение производительности примерно на 30% (в таблице не показано).
10 запросов в секунду для eGroupware похоже не предел — ни в одном из тестов процессор (Athlon X2 3800) не загружался более чем на 60%. В FastCGI и CGI-тестах, т.е. PHP вне acWEB, загрузка процессора от acWEB, curl и MySQL была нулевой, все 60% приходились на PHP. Для сравнения последний тест (ISAPI+eAccelerator) с 10ю потоками, т.е. 1000 запросов, выполняется за 147 секунд (FastCGI — 231 секунду), средняя загрузка процессора меньше 50%. Можно было бы предположить, что PHP не может использовать более одного ядра процессора в ISAPI, но по графикам загрузки процессора видно, что равномерно используются оба ядра. Задержка (ожидание ресурса или просто пауза) в каком-то из компонентов PHP. Тот же 10-поточный тест, исполняющий PhpInfo() выполняется PHP-5.2.8 FastCGI за 58 секунд (ISAPI+eAccelerator за 22 секунды) и грузит процессор на 100%.
acWEB с поддержкой /FastCGI: http://www.eserv.ru/download/acWEB_310509.rar
Простейший способ включения FastCGI для PHP в OnRequest acWEB:
File *.php | FastCgi {HTTP[PhpFastCgiPort]}
По умолчанию сервером перебираются 8 портов, начиная с указанного. Можно ограничить командой
1 FcgiServers !
Запуск PHP для FastCGI в описанном варианте взаимодействия таким bat-файлом:
set PHP_FCGI_MAX_REQUESTS=0
start php-cgi.exe -b 9000
start php-cgi.exe -b 9001
start php-cgi.exe -b 9002
start php-cgi.exe -b 9003
start php-cgi.exe -b 9004
start php-cgi.exe -b 9005
start php-cgi.exe -b 9006
start php-cgi.exe -b 9007