«mod_php vs CGI vs FastCGI» или «Как выбирать хостера»

Предлагаю вашему вниманию свои изыскания по вопросу производительности php (а точнее, предпочтительный вариант конкретно для Битрикса) в разных режимах запуска. Целью не было получить какие-то цифры по возможной посещаемости, а именно сравнить разные варианты при прочих равных условиях.

Небольшая вводная

GGI — самый старый способ запуска скриптов (в том числе и php). В этом случае на каждый хит запускается интерпретатор php как самостоятельное приложение и ему отдаётся скрипт для запуска. Скрипт должен вернуть заголовки, затем код html страницы. После этого интерпретатор прекращает свою работу.

Модуль Apache — в этом случае php постоянно находится в памяти веб сервера, не тратится время на запуск интерпретатора.

FastCGI — эволюция CGI интерфейса, в этом случае php запускается отдельным процессом, но после выполнения скрипта не прекращает свою работу.

Действительно ли он такой быстрый, этот FastCGI? Проверим!

Инструменты

На одной машине установлен Apache 2.2 + MySQL 5, а также демонстрационный сайт «Битрикс Бизнес». Кеширование компонентов битрикс отключил чтобы случайное пересоздание кеша не повлияло на результаты.
Здесь я умышленно не акцентирую внимание на аппаратной части и конфигурации т.к. повторюсь, задача не получить абсолютные величины, а сравнитьразные режимы работы php.
Другая машина по локальной сети создаёт имитацию нагрузки на сервер. Для этого я использовал JMeter.
Он написан на Java и сам создаёт приличную нагрузку :) , поэтому для чистоты эксперимента мне пришлось его «отделить» от сервера.

JMeter

План тестирования состоял из 6 страниц, по 2 параллельных запроса. Постарался выбрать наиболее динамически загруженные страницы, для удобства дал им условные названия по контенту. Не следует ассоциировать скорость отдачи страниц с одноимёнными модулями.
Загружался только динамический код страниц без статики, соответственно nginx не использовал (подробности в учебном курсе).

Итак, всё готово, приступаем к тестированию.

Тестирование без акселератора php

CGI
Получился следующий график суммарных результатов по всем страницам:
cgi
Синий — среднее время отдачи на каждом хите в мс
Пурпурный — статистическое среднее
Красный — отклонение от среднего
Зелёный — скорость отдачи страниц

В итоге имеем среднее время 5,5 секунды на страницу, скорость отдачи страниц — 105 в минуту.
Обратите внимание, здесь время на страницу — это время, которое реально ждёт пользователь, а не среднее по всем параллельным запросам (во втором случае мы получим 105/60 = 1,75 сек на страницу).

Отдельно по страницам получилась такая диаграмма (среднее время ответа):
cgi диаграмма

Модуль Apache

php_mod

Здесь уже результат получше — 122 страницы в минуту. И соответственно, диаграмма:

php_mod диаграмма

FastCGI

fastcgi

Совсем неплохой результат по сравнению с традиционным CGI: 120 страниц в минуту, чуть медленнее, чем модуль.
Диаграмма:

fastcgi диаграмма

Но как изменится картина если установить акселератор php?

Результаты тестирования с установленным EAccelerator

CGI — EA
Известно, что акселератор не работает в CGI режиме т.к. ему нужен доступ к общей памяти из всех процессов. Но в phpinfo есть информация о том, что eaccelerator загружен и создаётся ощущение, что он работает. Давайте проверим.

cgi-ea

108 страниц в минуту. Это практически тот же результат что и был. Диаграмма:

cgi-ea диаграмма

Модуль Apache

php_mod-ea

309 страниц в минуту, среднее время ожидания ответа 1 секунда. Я бы сказал, это уже что-то. Ну и соответственно по страницам:

php_mod-ea диаграмма

FastCGI

fcgi-ea

294 страницы в минуту, т.е. примерно на 5% медленнее, чем модуль. Но всё равно не идёт ни в какое сравнение с традиционным и неторопливым CGI режимом.

fcg-ea диаграмма

В среднем по страницам также прослеживается небольшое отставание от модуля.

А есть ли другие проблемы?

  • Как CGI, так и FastCGI работают независимо от веб сервера. А это значит что если происходит какая-то ошибка, веб сервер не получает заголовки от скрипта и возвращает нам в ответ «Ошибка 500 на стороне сервера». Чтобы узнать какая произошла ошибка, надо смотреть логи сервера, к которым далеко не всегда есть прямой доступ у пользователя. В случае модуля Apache ошибка может сразу отобразиться на экране (если включен вывод ошибок) и отладка скриптов осуществляется гораздо проще и быстрее.
  • В CGI/FastCGI режимах есть проблема с авторизацией HTTP, как следствие — проблема с интеграцией с 1С, есть и другие специфические проблемы.
  • При загрузке в Apache модуля php мы получаем замечательную возможность менять на лету некоторые настройки php через .htaccess, в CGI/FastCGI опять же получим ошибку 500.
  • Основной довод сторонников CGI/FastCGI — это безопасность. Т.к. php работает как отдельное приложение — пользователи хостинга на системном уровне отделены друг от друга, а в режиме модуля существует гипотетическая возможность ломать соседние сайты на хостинге. Отчасти это так, но на сегодняшний день существуют определённые механизмы защиты и по опыту техподдержки могу сказать, что основную проблему безопасности пользователей представляют трояны, которые воруют пароли ftp и вживляют паразитный код на сайты.

Хостеры часто используют CGI т.к. в этом случае гораздо удобнее управлять [читать: резать] ресурсами пользователей. И в итоге получаем «непонятные ошибки».

Хочу упомянуть ещё об одном важном моменте: сегодня php идёт одним файлом для CGI и FastCGI режимов, в phpinfo видим:

Server API: CGI/FastCGI

А значит слабо представляется возможным на пользовательском уровне выяснить, как на самом деле работает php. Учитывая скудную документацию по настройке FastCGI очень может быть, что вы будете введены в заблуждение.

Выводы или «Как же выбрать хостера?»

Если вы простой пользователь, вероятно, прокрутили весь технический груз чтобы сразу найти ответ на вопрос. :)

Пишу результаты.

  • Выбирайте CGI режим если ваш сайт посвящён восточной философии и время загрузки страниц посетителей сайта не волнует.
  • FastCGI даёт хорошие результаты по производительности, но ему присущи проблемы CGI режима, а это постоянные ошибки сервера «500».
  • В остальных случаях рекомендую использовать php как модуль Apache. Особенно если речь идёт о выделенном сервере или VPS.
  • Обязательно обращайте внимание на акселератор php. К сожалению, многие хостеры не уделяют этому вопросу должного внимания.
  • И вот ещё важный момент: не выбирайте в качестве хостера соседа по лестничной клетке, порой элементарное неумение настроить систему приносит больше проблем, чем всё остальное. Выбирайте профессионалов.
  • Рекомендуем перед долговременной покупкой хостинга тестировать его нашим скриптом. Мы периодически обновляем скрипт с учётом новых проблем.

Смотрите сами и делайте выводы. К сожалению, пользователь начинает понимать важность «правильного» хостинга только после того как столкнулся с чередой проблем.

Источник: http://dev.1c-bitrix.ru/community/blogs/howto/568.php