Pull to refresh

HHVM: тестирование производительности и совместимости с Joomla, Битрикс и Wordpress

Reading time 4 min
Views 44K
Про HHVM уже писали на Хабре. Вкратце: HHVM — это виртуальная машина от Facebook, которая за счет трансляции и JIT-компиляции кода позволяет ускорить PHP в несколько раз. Разработчики также обещают практически полную совместимость с PHP 5.4.

Я решил сравнить HHVM с нативным интерпретатором на нескольких тестах, а также попробовать запустить на нем CMS.



Условия тестирования


Тестирование проводилось в виртуальной машине с конфигурацией процессор 2 ядра Core i5 @ 3,3 ГГц, 8 Гб ОЗУ.
ОС: Ubuntu 12.04 x86_64.
PHP: 5.3.10-1ubuntu3.7
Nginx: 1.1.19
Apache: 2.2.22
HHVM: 2.1.0-dev
В настройках были увеличены таймауты выполнения и memory_limit, включен APC. Никакого дополнительного тюнинга не производилось.

HHVM установлена из исходников по инструкции.

Бенчмарки


Было подготовлено несколько скриптов, каждый из которых был запущен 50 раз: по 10 раз в PHP CLI, HHVM CLI, Apache+mod_php, nginx+php-fpm, и nginx+HHVM. Средняя продолжительность выполнения в секундах представлена в таблице. В последних двух столбцах обозначен выигрыш в скорости выполнения при использовании HHVM.

  CLI HTTP Прирост скорости по сравнению
Тест PHP HHVM Apache+mod_php Nginx+php_fpm Nginx+HHVM PHP CLI PHP-FPM
asort 42,4 17,9 N/A1 40,9 18,9 137,0% 116,7%
bcmath_factorial 3,4 3,0 3,4 3,4 2,8 13,9% 21,5%
curl_multi 8,6 8,4 9,7 9,0 9,7 2,3% -7,0%
domdocument 50,2 51,0 54,3 50,1 50,1 -1,5% 0,0%
for 60,5 36,9 60,8 61,0 211,2 63,7% -71,1%
geoip 14,4 15,6 14,7 14,9 5,0 -7,8% 198,0%
getid3 46,5 26,9 46,2 45,6 8,5 72,4% 435,5%
mb_strings 22,8 16,8 7,0 22,2 17,0 35,8% 31,0%
md5 36,8 35,7 37,0 37,2 27,2 3,2% 36,7%
preg 11,6 10,9 11,6 11,7 10,9 6,1% 7,9%
prime 4,2 5,6 4,2 4,3 2,5 -24,1% 71,8%
sort 46,3 17,8 N/A1 44,1 17,5 160,1% 151,8%
sqlite 12,4 10,0 12,6 12,2 15,2 23,7% -19,9%
strings 38,6 37,5 37,8 38,2 36,0 3,0% 6,3%
tcp_client 15,4 13,2 15,5 17,3 13,6 16,9% 27,7%
tcpdf 3,3 2,4 3,4 4,4 1,4 38,7% 215,1%
thumbnail 100,8 94,8 93,7 99,9 94,2 6,3% 6,1%


1 — Apache не смог выполнить asort.php и sort.php — падал с out of memory

asort — сортировка ассоциативного массива строк с 10 млн. элементов
bcmath_factorial — вычисление факториала числа 1000 функцией bcmul
curl_multi — скачивание 100 файлов по 1 Мб в 10 потоков из Интернет
domdocument — разбор большого XML (122 тыс. тегов) — для примера взял sitemap ag.ru
for — 3 вложенных for по 1000 итераций (всего 1 млрд.)
geoip — 100 тыс. поисков IP по базе GeoIP
getid3 — получение ID3 тегов из MP3 с помощью библиотеки getID3() — 10 тыс. раз
mb_strings — использование mb_strlen, mb_ereg_replace, mb_substr, mb_strpos, mb_strtolower 1000 раз на первом томе «Войны и мира»
md5 — генерация md5 от чисел от 1 до 100 млн
preg — поиск preg_match_all hex-кодов цветов, тегов и URL на HTML-странице — 1000 раз (для примера взята главная Хабра)
prime — получение всех простых чисел от 2 до 1 млн. перебором «в лоб»
sort — сортировка массива строк 10 млн. элементов с числовыми индексами
sqlite — 10 тыс. запросов SELECT к БД sqlite3
strings — использование strlen, str_replace, substr, strpos, strtolower 10 тыс. раз на первом томе «Войны и мира»
tcp_client — 10 тыс. конектов к localhost и чтение 2 Мб по TCP (CHARGEN)
tcpdf — генерация многостраничной PDF библиотекой TCPDF — 10 раз (взят пример example_061.php)
thumbnail — 10 тыс. созданий thumbnail изображения с помощью GD imagecopyresized()

Также я хотел прогнать тест со Smarty, но HHVM не смог его исполнить.

Интерпретация результатов


Конечно, бенчмарки не могут полностью показать ситуацию с производительностью. Но все-таки кое-какие выводы можно сделать.

  1. Время выполнения каждого прогона теста от среднего отличалось ненамного — значит результат можно считать стабильным.
  2. Аномальных результата два: слишком быстрое выполнение теста mb_string на Apache+mod_php и слишком медленное выполнение for на nginx+HHVM. Тесты я перепроверил, но не знаю, в чем дело.
  3. Что в CLI-версии, что при использовании для веб HHVM дает преимущество в половине тестов.
  4. В некоторых случаях использование HHVM как бекенда nginx (т.е. не как CLI) дает еще больший прирост — видимо, за счет активации JIT. Обратите внимание насколько быстрее работают сложные библиотеки getid3 и TCPDF.


Тестирование CMS



Wordpress


То, что Wordpress запускается на HHVM было известно заранее. Нужна лишь небольшая корректировка в одном файле.

Простой тест: загрузка главной страницы 100 раз в один поток.
nginx+HHVM: 4.498 с
Apache+mod_php: 9.997 c
Apache+mod_php+APC: 6.567 c
nginx+php-fpm+APC: 5.460 с

Обращаю ваше внимание, что это был тест именно времени отклика страницы, а не нагрузочное тестирование в несколько потоков.

Битрикс и Joomla


Битрикс и Joomla на HHVM запускаться отказались, выдав фатальную ошибку. Я подозреваю, что Битрикс надежды запустить вообще нет, т.к. там используются deprecated функции и mbstring.func_overload.

Обзор Интернета показал, что пока именно Worpress проще всего запустить под HHVM. С другими CMS и фреймворками все не так радужно, например в недавнем топике на Хабре Symfony2 не взлетела.

Возможно, тем, кому производительность ну очень важна, стоит сразу писать фреймворк под HHVM?

Выводы


1) HHVM дает хороший прирост производительности на некоторых задачах — возможно использовать его для запуска процессов фоновой обработки чего-либо. Помните, что HHVM не эффективен при использовании глобальным переменных.

2) В настоящий момент использование существующих библиотек, фреймворков и CMS с HHVM затруднено. HHVM заточена под производительность и может не поддерживать различные красивые конструкции. Однако в будущем ситуация будет улучшаться, т.к. и HHVM, возможно, начнет поддерживать лучше язык и разработчики могут озадачиться адаптацией своего кода под HHVM.

3) На Wordpress HHVM показала впечатляющий рост производительности — в 2 раза по сравнению с mod_php.

P.S. тестовые скрипты, сырые данные (Excel)
Tags:
Hubs:
+25
Comments 12
Comments Comments 12

Articles