Разработчики социальной сети Facebook опубликовали отчет об усовершенствовании производительности проекта HipHop, код которого был опубликован под открытой лицензией PHP License в начале прошлого года. HipHop трансформирует код PHP скриптов в высоко оптимизированное представление на языке C++, пригодное для дальнейшей компиляции при помощи g++ в машинные инструкции. В состав пакета входит транслятор кода, переработанный PHP runtime и набор переписанных с целью повышения производительность стандартных библиотек и расширений.
Первая версия HipHop позволяла примерно в два раза снизить нагрузку на CPU, по сравнению с классическими методами оптимизации, такими как использование Zend Engine, APC и eAccelerator. За год существования системы в виде открытого проекта, совместными усилиями разработчиков Facebook и независимых представителей сообщества, удалось добиться ещё более впечатляющих результатов в области повышения производительности. Летом производительность HipHop была увеличена примерно в 1.8 раз, одновременно была проведена работа по адаптации кода таких популярных проектов на языке PHP, как Drupal, MediaWiki, phpBB и WordPress, для работы с транслятором HipHop, который по своей сути не поддерживает вызов eval() и некоторые элементы динамического программирования.
В представленном на днях мартовском выпуске HipHop удалось ускорить работу собранных в HipHop php-приложений еще в 1.7 раз. Увеличение производительности HipHop сказывается прежде всего на возможность повысить эффективность работы серверов: проделанная за последние несколько месяцев работа по оптимизации привела к тому, что инфраструктура Facebook оказалась способной обработать на 70% больше запросов на том же оборудовании.
Из проведенных за последнее время оптимизаций отмечено:
- Интегрирование в HipHop новой реализации механизма кэширования APC (Alternative PHP Cache), избавленной от выполнения ресурсоёмких операций по сериализации данных при их записи в кэш и десериализации при извлечении из кэша (семантически API для работы с кэшем не изменилось). Ранее для ускорения для работы APC была задействована высокопроизводительная многопоточная библиотека TBB (Intel Threading Building Blocks), позволившая сократить число блокировок в коде;
- Для объектов, которым необходима сериализация или кодирование в JSON-представление, например, для их передачи на другие системы, подготовлены новые варианты соответствующих стандартных функций, производительность которых удалось увеличить благодаря оптимизации различных аспектов, таких как конвертация UTF8/UTF16, ускорение доступа к свойствам объектов, ускоренный разбор числовых значений и т.п.
- Избавление при работе с некоторыми структурами от необходимости ведения счетчиков обратных ссылок. При использовании строк, массивов и объектов в PHP ведется счетчик обратных ссылок, который позволяет предотвратить очистку памяти до момента удаления последней ссылки на находящиеся в этом блоке памяти данные (когда счетчик становится равным нулю сборщик мусора считает блок памяти свободным). Исследование Facebook показало, что столь незначительные на первый взгляд инкрементальные операции потребляют относительно много ресурсов CPU. Добавив в компилятор и run-time код ряд оптимизаций, была исключена необходимость ведения счетчика обратных ссылок для ситуаций, при которых без счетчика можно обойтись;
- Уменьшен размер исполняемых файлов, скопилированных из PHP-скриптов. Уменьшение бинарного кода и увеличение компактности наиболее активно исполняемых частей позволяет более эффективно использовать кэш CPU при выполнении инструкций;
- Улучшен код функций распределения памяти, для работы с памятью задействована библиотека jemalloc. Jemalloc представляет собой реализацию функций malloc, оптимизированную для решения проблем фрагментации и оптимальной утилизации ресурсов CPU при выделения памяти в нескольких потоках на многопроцессорных системах. Кроме того, использование jemalloc позволило упростить процесс мониторинга и профилирования потребления памяти в HipHop;
- Ускорен процесс компиляции. Несколько фаз работы компилятора, включая парсинг, оптимизацию и генерацию кода, переработаны для работы в параллельном режиме. Интегрированы некоторые созданные сторонними компаниями разработки, направленные на ускорение компиляции, без потери эффективности генерируемого кода. При задействовании distcc для распределения процесса сборки на несколько машин, компиляция бинарных файлов общим размером 1 Гб занимает примерно 15 минут.