Почему Facebook использовал C ++ помимо PHP? [закрыто]

15

Какова основная причина, по которой Facebook вынужден использовать C ++ помимо PHP? Мне интересно, если я сделаю веб-сайт с большим количеством Vistors, мне нужно будет также использовать C ++?

Гома
источник
Возможно, для внутренних процессов, но вы бы с ума сошли, если бы занимались обычной веб-разработкой.
ChaosPandion
1
Вопрос programmers.stackexchange.com/questions/53624/… также обсуждает эту проблему. Возможно, вы захотите взглянуть на это.
Vitor Py
4
Почему Google пишет свои серверы на C ++?
Работа
1
@Job и Java и Python.
правостороннее
5
@WTP, насколько мне известно, Python используется для создания прототипов новых функций и их тестирования. Как только пользовательская нагрузка становится высокой и все должно работать как можно быстрее, код Python заменяется кодом C ++. Я уверен, что разница в скорости, равная 1,2, очень важна для серверов, на которых работают сотни миллионов пользователей.
Работа

Ответы:

20

И вот почему: HipHop для PHP: быстро двигаться :

Одним из ключевых ценностей в Facebook является быстрое движение. За последние шесть лет мы смогли многого добиться благодаря быстрому развитию, которое предлагает PHP. Как язык программирования, PHP прост. Легко учиться, легко писать, легко читать и просто отлаживать. Благодаря PHP мы можем быстрее привлечь новых инженеров на Facebook, чем на другие языки, что позволяет нам быстрее внедрять инновации.

Сегодня я рад поделиться проектом с небольшой командой замечательных людей, над которой я работаю последние два года; Хип-хоп для PHP. С HipHop мы сократили загрузку ЦП на наших веб-серверах в среднем примерно на пятьдесят процентов, в зависимости от страницы. Меньшая загрузка ЦП означает меньшее количество серверов, что означает меньшую нагрузку. Этот проект оказал огромное влияние на Facebook. Мы считаем, что Интернет в целом может извлечь выгоду из HipHop, поэтому мы выпускаем его как открытый исходный код сегодня вечером в надежде, что он придаст новое значение масштабированию больших сложных веб-сайтов с помощью PHP. Хотя HipHop показал нам невероятные результаты, он определенно не завершен, и вы должны освоиться с бета-версией программного обеспечения, прежде чем опробовать его.

HipHop for PHP технически сам по себе не является компилятором. Скорее это преобразователь исходного кода. HipHop программно преобразует ваш исходный код PHP в высоко оптимизированный C ++, а затем использует g ++ для его компиляции. HipHop выполняет исходный код семантически эквивалентным образом и жертвует некоторыми редко используемыми функциями, такими как eval (), в обмен на повышение производительности. HipHop включает преобразователь кода, повторную реализацию системы времени выполнения PHP и переписывание многих распространенных расширений PHP, чтобы воспользоваться преимуществами этой оптимизации производительности.

Масштабирование PHP как языка сценариев

Корни PHP - это корни языка сценариев, такого как Perl, Python и Ruby, которые имеют значительные преимущества с точки зрения производительности труда программистов и способности быстро выполнять итерации по продуктам. Это сравнивается с более традиционными скомпилированными языками, такими как C ++, и интерпретируемыми языками, такими как Java. С другой стороны, языки сценариев обычно менее эффективны, когда речь идет об использовании процессора и памяти. Из-за этого каждый месяц сложно масштабировать Facebook до 400 миллиардов просмотров страниц на основе PHP.

Один из распространенных способов устранения этих недостатков - переписать более сложные части вашего приложения PHP непосредственно в C ++ как расширения PHP. Это в значительной степени превращает PHP в связующий язык между вашим интерфейсом HTML и логикой приложения в C ++. С технической точки зрения это работает хорошо, но резко сокращает количество инженеров, способных работать над всем вашим приложением. Изучение C ++ - это только первый шаг к написанию PHP-расширений, второй - понимание Zend API. Учитывая, что наша команда инженеров относительно невелика - на каждого инженера приходится более миллиона пользователей - мы не можем позволить сделать части нашей кодовой базы менее доступными, чем другие.

Масштабирование Facebook является особенно сложной задачей, поскольку почти каждый просмотр страницы является зарегистрированным пользователем с индивидуальным подходом. Когда вы просматриваете свою домашнюю страницу, нам нужно найти всех ваших друзей, запросить их наиболее релевантные обновления (из специальной службы, которую мы создали под названием Multifeed), отфильтровать результаты на основе ваших настроек конфиденциальности, а затем заполнить истории комментариями. , фотографии, лайки и все богатые данные, которые люди любят в Facebook. Все это всего за секунду. HipHop позволяет нам написать логику, которая выполняет окончательную сборку страницы в PHP, и быстро выполнить ее итерацию, полагаясь на пользовательские серверные службы в C ++, Erlang, Java или Python для обслуживания ленты новостей, поиска, чата и других основных частей. сайта.

С 2007 года мы думали о нескольких разных способах решения этих проблем и даже пытались реализовать некоторые из них. Распространенное предложение - просто переписать Facebook на другом языке, но, учитывая сложность и скорость разработки сайта, это займет некоторое время. Мы переписали аспекты Zend Engine - внутреннюю часть PHP - и внесли эти исправления обратно в проект PHP, но в конечном итоге не увидели необходимого повышения производительности. Преимущества HipHop практически прозрачны для нашей скорости разработки.

Взлом HipHop

Однажды вечером на хакатоне несколько лет назад (см. Prime Time Hack) я начал свой первый кусок кода, превращающий PHP в C ++. Синтаксически языки очень похожи, и C ++ значительно превосходит PHP, когда речь идет об использовании процессора и памяти. Даже сам PHP написан на C. Мы знали, что невозможно успешно переписать всю кодовую базу такого размера вручную, но задавались вопросом, что произойдет, если мы построим систему для этого программно.

Поиск новых способов улучшить производительность PHP не является новой концепцией. Во время выполнения Zend Engine превращает ваш источник PHP в коды операций, которые затем запускаются через виртуальную машину Zend. Проекты с открытым исходным кодом, такие как APC и eAccelerator, кэшируют этот вывод и используются большинством веб-сайтов на PHP. Есть также Zend Server, коммерческий продукт, который делает PHP быстрее благодаря оптимизации кода и кешированию. Вместо этого мы думали о преобразовании исходного кода PHP непосредственно в C ++, который затем можно превратить в машинный код. Даже компиляция PHP не является новой идеей, проекты с открытым исходным кодом, такие как Roadsend и phc, компилируют PHP в C, Quercus компилирует PHP в Java, а Phalanger компилирует PHP в .Net.

Излишне говорить, что это заняло больше времени, чем этот единственный хакатон. Восемь месяцев спустя у меня было достаточно кода, чтобы продемонстрировать, что действительно возможно быстрее работать с скомпилированным кодом. Мы быстро добавили Iain Proctor и Minghui Yang в команду, чтобы ускорить темпы проекта. Следующие десять месяцев мы потратили на доработку всего кода и следующие шесть месяцев на тестирование рабочих серверов. Мы с гордостью можем сказать, что на данный момент мы обслуживаем более 90% нашего веб-трафика с использованием HipHop, и все это только через шесть месяцев после развертывания.

Как работает хип-хоп

Основной проблемой проекта было преодоление разрыва между PHP и C ++. PHP - это язык сценариев с динамической слабой типизацией. C ++ - это скомпилированный язык со статической типизацией. Хотя PHP позволяет писать магические динамические функции, большинство PHP относительно просты. Скорее вы видите, if (...) {...} else {..}чем видите function foo($x) { include $x; }. Вот где мы выигрываем в производительности. По возможности наш сгенерированный код использует статическое связывание для функций и переменных. Мы также используем вывод типов, чтобы выбрать наиболее конкретный тип, возможный для наших переменных, и тем самым сэкономить память.

Процесс преобразования включает в себя три основных этапа:

  1. Статический анализ, где мы собираем информацию о том, кто что объявляет и зависимости,
  2. Вывод типа, где мы выбираем наиболее конкретный тип между скалярами C ++, String, Array, классами, Object и Variant, и
  3. Генерация кода, которая по большей части является прямым соответствием операторов и выражений PHP операторам и выражениям C ++.

Мы также разработали HPHPi, экспериментальный интерпретатор, разработанный для разработки. При использовании HPHPi вам не нужно компилировать исходный код PHP перед его запуском. Это помогло нам выявить ошибки в самом HipHop и предоставляет инженерам способ использовать HipHop без изменения способа написания PHP.

В целом, HipHop позволяет нам сохранить лучшие аспекты PHP, используя при этом преимущества производительности C ++. В общей сложности мы написали более 300 000 строк кода и более 5000 модульных тестов.

Тринидад
источник
4
Это ответ, немного цвета было бы хорошо, но в основном все сводится к производительности. Они хотят, чтобы их приложение масштабировалось лучше, но у них также есть более опытные люди в PHP и считают, что PHP делает их более продуктивными. Таким образом, решение допускает простоту PHP с производительностью C. Их кодовая база слишком велика, чтобы все равно вручную ее перевести.
Cervo
13

Короткий ответ - нет, вам не нужен C ++.

Я полагаю, вы имеете в виду хип-хоп . Если вы читаете об улучшениях, это дает около 50%. Это очень важно, если вы используете Facebook, на котором есть тысячи веб-серверов. Сокращение нагрузки на них означает миллионы в экономии затрат на центры обработки данных. В случае компании, имеющей 10-100 серверов с внешним интерфейсом, стоимость разработки значительно перевесит возможную экономию. В любом случае, самая тяжелая обработка выполняется в бэкэнде, который обычно представляет собой некое решение СУБД или NoSQL, разработанное как высоко оптимизированный код C / C ++.

Конечно, можно было бы добиться гораздо большей экономии, просто полностью сбросив PHP. Но это не то, что вы можете сделать с огромной кодовой базой, как в случае с Facebook.

Теперь о другой части вопроса: если вы действительно хотите знать, как справляться с огромными нагрузками, прочитайте блог High Scalability , особенно часть Real Life Architectures.

Это возможно с PHP, но определенно не будет моим выбором. Если вы хотите динамический язык, Python, Ruby или, возможно, Lua будет гораздо лучшим выбором.

Vartec
источник
2
+1, но масштабируемость практически не связана с используемым языком. Архитектура базы данных имеет гораздо большее значение.
dan_waterworth
1
@Dan: вот почему я говорю - это возможно с PHP.
vartec
2
Согласно цитируемой записи в блоге @Trinidad, 50% - это среднее улучшение, а не максимальное.
Джерри Коффин
2
@Jerry: верно, но все еще очень и очень далеко от реальной разницы в производительности между C ++ и PHP.
vartec
6

Хорошая вещь в подходе FB заключается в том, что им не нужно было сразу принимать решение. Вы должны сделать то же самое. Выберите язык, который сделает вас наиболее продуктивным, но убедитесь, что он легко взаимодействует с C / C ++.

Если у вас есть миллионы пользователей и вам нужно сократить время отклика на миллисекунды, вы можете оптимизировать критические пути, используя C / C ++.

Скудный Роджер
источник
0

Элементом C ++, используемым Facebook, является HHVM.

Это виртуальная машина HIPHOP. Хотя написано на C ++, это по сути «лучший интерпретатор PHP».

Код php компилируется в байтовый код, который затем интерпретируется HHVM во время выполнения и подвергается оптимизации «Just In Time» во время работы.

Разработчики в фейсбуке по-прежнему пишут в основном на PHP, и то, что вы видите в своем браузере, почти наверняка выводится PHP-программой - все, что было скомпилировано и интерпретировано средой выполнения HHVM.

Фактический HHVM находится в свободном доступе с открытым исходным кодом. Так что если вам нужно обслуживать миллион изображений милых котят в час, вы можете загрузить HHVM и ускорить работу своего сервера с минимальными изменениями в PHP.

Джеймс Андерсон
источник