Проект Wikipedia перешёл на использование HHVM для выполнения PHP-кода

07.01.2015 07:37

Инфраструктура свободной энциклопедии Wikipedia переведена со штатного интерпретатора языка программирования PHP на развиваемую инженерами Facebook виртуальную машину HHVM (HipHop Virtual Machine), которая благодаря поддержке JIT-компиляции позволила существенно ускорить выполнение кода движка MediaWiki. В настоящее время все некешируемые операции в Wikipedia, такие как запросы к API, функции редактирования, показ кастомизированного интерфейса для зарегистрированных пользователей, производятся с использованием HHVM. Процесс миграции Wikipedia на HHVM начался в марте и продолжался 9 месяцев, за которые совместно с разработчиками из Facebook была проделана большая работа по устранению возникающих проблем, выявляемых в процессе тестового внедрения.

В частности, была выявлена несовместимость реализации класса DOMDocument в HHVM c используемым в MediaWiki кодом для экспорта и импорта данных в формате XML, а также проблемы с расширением для выполнения скриптов на языке Lua. Кроме того, была проделана работа по внесению оптимизаций, рассчитанных на специфику использования MediaWiki, которые были упущены из-за разработки HHVM с оглядкой на виды нагрузки, свойственные Facebook. Например, была обеспечена поддержка JIT при выполнении регулярных выражений и изменён метод отслеживания состояния объектов с заданными деструкторами, что дополнительно ускорило выполнение кода на 8% и 4%. С другой стороны, предоставляемые проектом HHVM инструменты анализа кода позволили выявить и устранить ранее не замеченные узкие места в коде MediaWiki, а также оценить корректность использования типов данных.

В итоге, внедрение HHVM позволило почти в два раза уменьшить время обработки динамического контента Wikipedia и значительно снизило нагрузку на CPU, по сравнению с конфигурацией на основе PHP 5.3. Например, время сохранения изменений сократилось в среднем с 6 до 3 сек, время выдачи страницы для зарегистрированных пользователей уменьшилось с 1.3 до 0.9 сек, а загрузка процессоров на типовом сервере Wikipedia снизилась в 5-6 раз. Отмечается, что по сравнению с PHP 5.3 в актуальной версии PHP 5.6 наблюдается заметный прогресс в области увеличения производительности, поэтому разрыв между PHP 5.6 и HHVM был бы не столь значимым.

 Проект Wikipedia перешёл на использование HHVM для выполнения PHP-кода
 Проект Wikipedia перешёл на использование HHVM для выполнения PHP-кода

Основная причина высокой производительности HHVM заключается в возможности применения JIT-компиляции и динамических оптимизаций, учитывающих особенности выполнения скрипта. В процессе выполнения кода производится определение типов данных и генерация на лету эффективных наборов машинных инструкций, оптимизированных специально для используемых типов. Перед выполнением PHP-скрипты преобразуются в специальное промежуточное абстрактное представление AST (Abstract Syntax Tree), которое затем транслируется в байткод HHBC (HipHop bytecode), который выполняется внутри высокоуровневой виртуальной машины.