PHP-транслятор HipHop позволил Facebook использовать в разы меньше оборудования
4 апреля 2011 года
Разработчики социальной сети 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 минут.
Источники
править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.