PHP 5.4 vs PHP 5.6 vs HHVM

Во время подготовки предыдущей статьи про установку WordPress на LEMP, я собрал достаточно большое количество информации по производительности решений, основанных на разных версиях программного обеспечения. В результате консолидации полученных материалов я подготовил сравнение версий PHP 5.4 (текущая версия из Debian 7), PHP 5.6 (последняя Stable версия) и HHVM (виртуальной машины от FB).

Безусловным фаворитом гонки стал HHVM. Весь тест он прошел за 1263 секунды, что в 2,5 раза быстрее аутсайдера PHP 5.4 без APC, прошедшего испытание за 3199 секунды.

Чтобы не томить почтенную публику, сразу выкладываю сравнение одного из самых важных показателей данного теста — затраченного на выполнение условий времени.

В тестировании принимало участие 5 решений:

1. PHP 5.4 без APC
2. PHP 5.4 с APC
3. PHP 5.6 без OPCache
4. PHP 5.6 без OPCache
5. HHVM 3.6.1

В качестве платформы для теста был использован следующий набор:

1. Виртуальная машина от Flops.Ru. 1 ядро, 512 RAM
2. nginx 1.6.2.
3. MySQL 5.5.41.

В качестве исполняемого кода был использован WordPress 4.1.1, скопированный с боевого блога, т.е. имеющий полтора десятка подключенных плагинов, несколько десятков немаленьких постов и некоторое количество комментариев.

Средства кэширования nginx и WordPress тоже были отключены.

Для теста использовался программный продукт Siege. Каждый из подопытных получал нагрузку из 11 циклов по 1000 запросов с увеличивающимся количеством конкурентных подключений. Перед началом тестов проводился прогревочный прогон для наполнения кэшей байт кода там, где они были.

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

График времени ответа сервера от 10 до 50 конкурентных запросов:

Ниже представлены графики по каждому из решений.

На графиках отмечены:

Количество конкурентных подключений по горизонтальной оси.

Elapsed time – общая продолжительность шага тестирования.
Response time – среднее время за которое сервер успел ответить клиенту.
Transaction rate – среднее число обращений которые сервер успел обработать за секунду. Оно получается путём деления общего числа запросов на затраченное время.
Concurrency – количество одновременных подключений при которых сервер отвечает без задержек.
OKAY – количество запросов на которые сервер ответил кодом меньше 400.
Failed — количество запросов на которые сервер ответил кодом больше 400.

ИТОГ. Победитель теста — HHVM. Но мне так и не удалось добиться стабильности в его поведении. За время тестов демон HHVM несколько раз крашился и периодически занимал всю свободную память без видимых на то причин. Надеюсь, что в скором времени эта технология дорастет до беспроблемной эксплуатации без плясок с бубном.

Закономерный результат показали PHP 5.4 и 5.6. Второй оказался быстрее и оба значительно отзывчивее с использованием APC и OPCache.

Между версиями PHP 5.4 и 5.6 разница не столь существенна, так что мой выбор по прежнему PHP 5.4 с APC. Он нативно идет в поставке Debian 7, а плюшки 5.6 я все равно не использую.