PHP-транслятор HipHop позволил Facebook использовать в разы меньше оборудования
Первая версия 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 минут.
Источник: http://www.opennet.ru/opennews/art.shtml?num=30122
|
0 | Tweet | Нравится |
|