HighLoad.org – блог о высоких нагрузках
HighLoad.org > HipHop для PHP: ускорение

HipHop для PHP: ускорение
2010-02-13 23:06 my_fess  
Одна из важнейших вещей в Facebook -это быстрая работа. За последние 6 лет у нас много раз был повод поблагодарить PHP за то ускорение разработки, которое он предлагает. Как язык программирования PHP очень прост. Его легко изучить, на нем легко писать, легко читать и легко отлаживать. С PHP мы можем увеличивать количество новых инженеров в Facebook намного быстрее, чем с другим языком программирования. Это позволяет нам вводить инновации быстрее.
Сегодня мне выпала честь рассказать о проекте небольшой команды потрясающих людей и над которым я работал последние 2 года – HipHop для PHP. С HipHop мы уменьшили использование CPU на наших web-серверах по-разному в зависимости от страницы, но в среднем на 50%. Меньшее потребление CPU означает уменьшение серверов и уменьшение накладных расходов. Влияние этого проекта на Facebook просто огромно. Нам кажется, что интернет в целом может выиграть благодаря HipHop, поэтому мы сегодня вечером выкладываем его как open source в надежде, что он привлечет новое внимание к построению больших, сложных, масштабируемых web-сайтов на PHP. HipHop конечно же еще не закончен до конца, но уже показал невероятные результаты, и вам будет комфортно работать с beta версией продукта. HipHop для PHP технически не является компилятором сам по себе. Скорее это трансформатор исходного кода. HipHop автоматически трансформирует ваш исходный PHP код в сильно оптимизированный C++ и затем использует g++ для его компиляции. HipHop выполняет исходный код в семантически эквивалентном стиле, но жертвует некоторыми очень редко используемыми функциями, например такими как eval() - за счет этого увеличивается производительность. HipHop включает в себя преобразователь кода, переделанную среду выполнения PHP и множество переписанных расширений PHP для получения преимуществ оптимизации производительности. Масштабирование PHP как скриптового языка Корни PHP исходят из скриптовых языков, таких как Perl, Python и Ruby. Их всех главное преимущество в продуктивности разработки и возможности быстрого повторного использования в продуктах. Это все в сравнение с более традиционными компилируемыми языками такими как C++ и интерпретируемыми языками такими как Java. С другой стороны скриптовые языки широко известны тем, что менее эффективно используют CPU и оперативную память. Поэтому промасштабировать Facebook для показа свыше 400 миллиардов PHP страниц в месяц (155,000 показов в секунду) было большой проблемой. Одним из известных путей избавления от неэффективности PHP — это переписать самые сложные части вашего PHP приложения на C++ и включить его затем как PHP расширение. По большому счету, это делает из PHP язык соприкосновения вашего front-end HTML и логики приложения на C++. С технической точки зрения это работает хорошо, но сильно снижает число инженеров способных работать над всем вашим приложением в целом. Изучение C++ - это только первый шаг на пути написания расширения PHP, второй — понимание Zend API. Учитывая что наша команда инженеров относительно мала — на каждого нашего инженера приходится более миллиона пользователей - мы не можем позволить себе сделать некоторые части нашего основного кода менее доступными чем другие. Масштабирование Facebook требует чрезвычайного напряжения, потому что почти каждая страница просматривается залогиненным пользователем с индивидуальным опытом. Когда вы просматриваете свою домашнюю страничку мы должны найти всех ваших друзей, запросить их наиболее важные обновления (у специально разработанного нами сервиса, называемого Multifeed), отфильтровать результаты, основываясь на ваших персональных настройках, затем заполнить истории комментариями, фотографиями, понравившимися материалами и всем тем богатством данных за которое люди любят Facebook. Все это быстрее чем за секунду. HipHop позволяет нам писать логику, которая создает финальную страницу собранную на PHP и выдавать ее быстро, а специальные back-end сервисы написанные на C++, Erlang, Java или Python обслуживают новости, поиск, чат, и другие центровые части сайта. С 2007 года мы думали над несколькими различными путями решения этих проблем и даже пробовали реализовать некоторые из них. Общее предложение — переписать Facebook на другом языке, но текущая сложность и скорость разработки сайта потребовала бы много времени чтобы реализовать это. Мы переписали некоторые моменты Zend Engine – внутренности PHP — и внесли эти патчи назад в PHP, но в конце концов так и не получили необходимого роста производительности. Преимущество HipHop — это почти полная прозрачность для нашей скорости разработки. Создание HipHop Однажды ночью на хакатоне несколько лет назад, я начал писать мой первый кусок кода трансформации PHP в C++. Языки были очень похожи синтаксически, но C++ чрезвычайно превосходил PHP по производительности использования CPU и оперативной памяти. Даже не смотря на то что PHP сам написан на C. Мы понимали, что просто невозможно переписать весь код такого объема вручную, но начали задумываться, а что будет если построить систему которая перепишет все автоматически. Находить новые пути улучшения производительности PHP - это не новая идея. Во время выполнения Zend Engine превращает ваш PHP код в опкод, который затем выполняется на Zend Virtual Machine. Опенсорс проекты такие как APC и eAccelerator кэшируют этот опкод. Такие проекты используются большинством мощных web-сайтов написанных на PHP. Еще существует Zend Server — коммерческий продукт который делает PHP быстрее за счет оптимизации опкода и кэширования. Вместо всего этого, мы думали о трансформации PHP кода напрямую в C++ код, который затем может быть преобразован в нативный машинный код. Даже компиляция PHP не является новой идеей, опенсорс проекты такие как Roadsend и phc компилируют PHP в C, Quercus компилирует PHP в Java, а Phalanger компилирует PHP в .Net. Понятное дело, что это заняло больше времени чем один хакатон. Восемь месяцев спустя, у меня было достаточно кода, чтобы продемонстрировать, что действительно возможно работать быстрее с откомпилированным кодом. Мы быстро подключили Iain Proctor и Minghui Yang к команде для увеличения скорости разработки проекта. Мы провели следующие 10 месяцев заканчивая все кодирование и следующие 6 месяцев занимались тестированием на работающих серверах. Мы можем с гордостью сказать, что в данный момент, всего лишь через 6 месяцев после развертывания системы, мы обслуживаем уже более 90% web-трафика используя HipHop. Как работает HipHop Главной проблемой проекта было построить мост через пропасть между PHP и C++. PHP – скриптовой язык с динамической, слабой типизацией. C++ - компилируемый язык с статической типизацией. В основном PHP относительно прямолинейный и простой, потому что позволяет вам писать магические динамические вещи. Более приятно видеть if(...) {…} else {…}, чем function foo($x) {include $x;}. Это как раз то место, где мы получили рост производительности. Каждый раз когда это возможно наш сгенерированный код использует статическую привязку для функций и переменных. Мы также делаем выводы о типе для поиска наиболее подходящего типа для наших переменных и это экономит оперативную память. Процесс преобразования состоит из 3 главных шагов:
  1. Статический анализ который собирает информацию о том кто что объявляет и выявляет связи.
  2. Процесс выбора для переменных типа данных в C++: строка, массив, класс, объект.
  3. Генерация кода. По большей части там прямое соответствие между конструкциями и выражениями PHP и конструкциями и выражениями в C++.
Еще мы разработали HPHPi – это экспериментальный интерпретатор, спроектированный для разработки. Когда вы используете HPHPi вам не нужно компилировать ваш PHP код для его запуска. Это помогает нам находить баги в самом HipHop и предоставляет инженерам путь использования HipHop без изменения стиля в котором они писали на PHP. В итоге HipHop позволяет нам использовать лучшие возможности PHP и при этом получая производительность C++. В сумме мы написали больше 300,000 строк когда и больше 5,000 юнит тестов. Все это будет выложено сегодня вечером на GitHub лицензией open source PHP.

Автор статьи: Haiping Zhao Дата: 2 февраля 2010


комментарии [0]  | комментировать

  © 2010-2018 HIGHLOAD