Dlaczego Facebook używał C ++ oprócz PHP? [Zamknięte]

15

Jaki jest główny powód, dla którego Facebook musiał używać C ++ oprócz PHP? Zastanawiam się, czy stworzę stronę internetową z dużą ilością vistorów, czy musiałbym również używać C ++?

Goma
źródło
Być może dla procesów zaplecza, ale szaleństwem byłoby regularne tworzenie z nim sieci.
ChaosPandion,
1
Pytanie programmers.stackexchange.com/questions/53624/... również omawia ten problem. Możesz na to rzucić okiem.
Vitor Py
4
Dlaczego Google pisze swoje serwery w C ++?
Job
1
@Job, Java i Python.
prawej strony
5
@WTP, o ile mi wiadomo, Python służy do prototypowania nowych funkcji i testowania ich. Gdy obciążenie użytkownika staje się wysokie i rzeczy muszą działać tak szybko, jak to możliwe, kod Pythona zostaje zastąpiony kodem C ++. Jestem prawie pewien, że różnica prędkości tak mała jak 1,2 to wielka sprawa dla serwerów, które mają do czynienia z setkami milionów użytkowników.
Job

Odpowiedzi:

20

Oto dlaczego: HipHop for PHP: Move Fast :

Jedną z kluczowych wartości na Facebooku jest szybkie poruszanie się. Przez ostatnie sześć lat byliśmy w stanie wiele osiągnąć dzięki szybkiemu rozwojowi, który oferuje PHP. Jako język programowania PHP jest prosty. Prosty do nauki, prosty do napisania, prosty do odczytania i prosty do debugowania. Jesteśmy w stanie uzyskać nowych inżynierów na Facebooku znacznie szybciej dzięki PHP niż w innych językach, co pozwala nam szybciej wprowadzać innowacje.

Dzisiaj jestem podekscytowany, że mogę podzielić się projektem z niewielkim zespołem niesamowitych ludzi, nad którym pracowałem przez ostatnie dwa lata; HipHop dla PHP. Dzięki HipHop zmniejszyliśmy użycie procesora na naszych serwerach internetowych średnio o około pięćdziesiąt procent, w zależności od strony. Mniej procesora oznacza mniej serwerów, co oznacza mniejsze obciążenie. Ten projekt miał ogromny wpływ na Facebook. Uważamy, że cała sieć może czerpać korzyści z HipHop, dlatego udostępniamy ją dziś jako oprogramowanie typu open source, mając nadzieję, że położy ona nowy nacisk na skalowanie dużych złożonych witryn za pomocą PHP. Chociaż HipHop pokazał nam niesamowite wyniki, z pewnością nie jest kompletny i powinieneś wypróbować oprogramowanie beta przed wypróbowaniem go.

HipHop dla PHP nie jest technicznie kompilatorem. Jest to raczej transformator kodu źródłowego. HipHop programowo przekształca kod źródłowy PHP w wysoce zoptymalizowany C ++, a następnie używa g ++ do jego skompilowania. HipHop wykonuje kod źródłowy w sposób semantycznie równoważny i poświęca niektóre rzadko używane funkcje - takie jak eval () - w zamian za lepszą wydajność. HipHop zawiera transformator kodu, reimplementację systemu wykonawczego PHP i przepisanie wielu popularnych rozszerzeń PHP, aby skorzystać z tych optymalizacji wydajności.

Skalowanie PHP jako języka skryptowego

Korzenie PHP wywodzą się z języka skryptowego, takiego jak Perl, Python i Ruby, z których wszystkie mają duże zalety pod względem produktywności programisty i możliwości szybkiego iterowania produktów. Jest to porównywane z bardziej tradycyjnymi językami kompilowanymi, takimi jak C ++ i językami interpretowanymi, takimi jak Java. Z drugiej strony wiadomo, że języki skryptowe są ogólnie mniej wydajne, jeśli chodzi o użycie procesora i pamięci. Z tego powodu trudno jest skalować Facebooka do ponad 400 miliardów odsłon stron opartych na PHP każdego miesiąca.

Jednym z powszechnych sposobów rozwiązania tych nieefektywności jest przepisanie bardziej złożonych części aplikacji PHP bezpośrednio w C ++ jako Rozszerzenia PHP. To w znacznej mierze przekształca PHP w język kleju między interfejsem HTML a logiką aplikacji w C ++. Z technicznego punktu widzenia działa to dobrze, ale drastycznie zmniejsza liczbę inżynierów, którzy są w stanie pracować nad całą aplikacją. Nauka C ++ jest tylko pierwszym krokiem do pisania rozszerzeń PHP, drugim jest zrozumienie interfejsów API Zend. Biorąc pod uwagę, że nasz zespół inżynierów jest stosunkowo niewielki - na każdego inżyniera przypada ponad milion użytkowników - nie możemy sobie pozwolić na to, aby niektóre części naszej bazy kodu były mniej dostępne niż inne.

Skalowanie Facebooka jest szczególnie trudne, ponieważ prawie każde wyświetlenie strony jest zalogowanym użytkownikiem z dostosowaną obsługą. Podczas przeglądania strony głównej musimy wyszukać wszystkich znajomych, wyszukać ich najistotniejsze aktualizacje (z niestandardowej usługi, którą zbudowaliśmy o nazwie Multifeed), przefiltrować wyniki na podstawie ustawień prywatności, a następnie wypełnić komentarze komentarzami , zdjęcia, polubienia i wszystkie bogate dane, które ludzie uwielbiają na Facebooku. Wszystko to w niecałą sekundę. HipHop pozwala nam napisać logikę, która wykonuje końcowy zestaw stron w PHP i iterować ją szybko, polegając na niestandardowych usługach zaplecza w C ++, Erlang, Java lub Python do obsługi kanału informacyjnego, wyszukiwania, czatu i innych podstawowych części strony.

Od 2007 roku zastanawialiśmy się nad kilkoma różnymi sposobami rozwiązania tych problemów, a nawet próbowaliśmy wdrożyć kilka z nich. Powszechną sugestią jest przepisanie Facebooka na inny język, ale biorąc pod uwagę złożoność i szybkość rozwoju strony, osiągnięcie tego zajmie trochę czasu. Przeprojektowaliśmy aspekty Zend Engine - wewnętrzne elementy PHP - i wnieśliśmy te poprawki z powrotem do projektu PHP, ale ostatecznie nie widzieliśmy, jaki wzrost wydajności jest potrzebny. Korzyści z HipHop są prawie przezroczyste dla naszej szybkości rozwoju.

Hakowanie HipHop

Pewnej nocy na Hackathonie kilka lat temu (patrz Hack Prime Time) zacząłem swój pierwszy fragment kodu, przekształcając PHP w C ++. Języki są dość podobne pod względem składniowym, a C ++ drastycznie przewyższa PHP, jeśli chodzi zarówno o użycie procesora, jak i pamięci. Nawet sam PHP jest napisany w C. Wiedzieliśmy, że niemożliwe jest ręczne przepisanie całej bazy kodu tego rozmiaru, ale zastanawiałem się, co by się stało, gdybyśmy zbudowali system, aby to zrobić programowo.

Znalezienie nowych sposobów na poprawę wydajności PHP nie jest nową koncepcją. W czasie wykonywania Zend Engine zamienia twoje źródło PHP w kody, które są następnie uruchamiane przez maszynę wirtualną Zend. Projekty typu open source, takie jak APC i eAccelerator, buforują to wyjście i są używane przez większość stron internetowych opartych na PHP. Istnieje również Zend Server, produkt komercyjny, który przyspiesza PHP poprzez optymalizację kodu i buforowanie. Zamiast tego myśleliśmy o przekształceniu źródła PHP bezpośrednio w C ++, które następnie można przekształcić w natywny kod maszynowy. Nawet kompilacja PHP nie jest nowym pomysłem, projekty open source, takie jak Roadsend i phc, kompilują PHP do C, Quercus kompiluje PHP do Java, a Phalanger kompiluje PHP do .Net.

Nie trzeba dodawać, że zajęło to więcej czasu niż singiel Hackathon. Osiem miesięcy później miałem dość kodu, aby wykazać, że naprawdę można szybciej uruchomić skompilowany kod. Szybko dodaliśmy do zespołu Iaina Proctora i Minghui Yang, aby przyspieszyć tempo projektu. Następne dziesięć miesięcy spędziliśmy na skończeniu całego kodowania, a kolejne sześć miesięcy na testach na serwerach produkcyjnych. Z dumą możemy powiedzieć, że w tym momencie obsługujemy ponad 90% naszego ruchu internetowego za pomocą HipHop, a wszystko to tylko sześć miesięcy po wdrożeniu.

Jak działa HipHop

Głównym wyzwaniem projektu było wypełnienie luki między PHP a C ++. PHP to język skryptowy z dynamicznym, słabym pisaniem. C ++ to skompilowany język ze statycznym pisaniem. Podczas gdy PHP pozwala pisać magiczne funkcje dynamiczne, większość PHP jest stosunkowo prosta. Bardziej prawdopodobne jest to, że zobaczysz if (...) {...} else {..}niż zobaczysz function foo($x) { include $x; }. Tutaj zyskujemy na wydajności. Gdy tylko jest to możliwe, nasz wygenerowany kod używa wiązania statycznego dla funkcji i zmiennych. Używamy również wnioskowania typu, aby wybrać najbardziej szczegółowy typ dla naszych zmiennych, a tym samym zaoszczędzić pamięć.

Proces transformacji obejmuje trzy główne etapy:

  1. Analiza statyczna, w której zbieramy informacje o tym, kto deklaruje, co i zależności,
  2. Wnioskowanie o typie, w którym wybieramy najbardziej konkretny typ między skalarami C ++, String, Array, klasami, Object i Variant oraz
  3. Generowanie kodu, które w przeważającej części jest bezpośrednią korespondencją z instrukcji i wyrażeń PHP na instrukcje i wyrażenia w C ++.

Opracowaliśmy również HPHPi, który jest eksperymentalnym interpretatorem przeznaczonym do programowania. Podczas korzystania z HPHPi nie musisz kompilować kodu źródłowego PHP przed jego uruchomieniem. Pomogło nam to wykryć błędy w samym HipHopie i zapewnia inżynierom sposób korzystania z HipHopa bez zmiany sposobu pisania PHP.

Ogólnie rzecz biorąc, HipHop pozwala nam zachować najlepsze aspekty PHP, jednocześnie korzystając z zalet wydajności C ++. W sumie napisaliśmy ponad 300 000 wierszy kodu i ponad 5000 testów jednostkowych.

Trynidad
źródło
4
To jest odpowiedź, trochę koloru byłby miły, ale w zasadzie sprowadza się do wydajności. Chcą, aby ich aplikacja skalowała się lepiej, ale mają też bardziej wykwalifikowanych ludzi w PHP i uważają, że PHP zwiększa ich produktywność. Rozwiązanie pozwala więc na prostotę PHP z wydajnością C. Ich podstawa kodu jest zbyt duża, aby mimo to ręcznie go przetłumaczyć.
Cervo,
13

Krótka odpowiedź - nie, nie potrzebujesz C ++.

Myślę, że masz na myśli HipHop . Jeśli przeczytasz o ulepszeniach, które daje, to około 50%. Jest to bardzo ważne, jeśli jesteś na Facebooku, który ma tysiące serwerów frontendowych. Zmniejszenie obciążenia oznacza miliony oszczędności kosztów centrum danych. W przypadku firmy, która ma 10-100 serwerów frontendowych, koszt rozwoju znacznie przewyższyłby możliwe oszczędności. W każdym razie najbardziej intensywne przetwarzanie odbywa się w back-endie, którym zwykle jest jakieś rozwiązanie RDBMS lub NoSQL, opracowane jako wysoce zoptymalizowany kod C / C ++.

Oczywiście mogłyby osiągnąć znacznie wyższe oszczędności po prostu całkowicie zrzucając PHP. Ale nie jest to coś, co można zrobić z ogromną bazą kodu, jak w przypadku Facebooka.

Teraz, jeśli chodzi o inną część pytania: jeśli naprawdę chcesz wiedzieć, jak radzić sobie z ogromnymi obciążeniami, przeczytaj blog High Scalability , zwłaszcza część Real Life Architectures.

Jest to możliwe w przypadku PHP, ale zdecydowanie nie byłbym moim wyborem. Jeśli chcesz dynamicznego języka, lepiej wybrać Python, Ruby lub Lua.

vartec
źródło
2
+1, ale skalowalność praktycznie nie ma nic wspólnego z używanym językiem. Architektura bazy danych ma znacznie większy wpływ.
dan_waterworth
1
@ Dan: dlatego mówię - jest to możliwe dzięki PHP.
vartec,
2
Według cytowanego wpisu na blogu @Trinidad 50% to średnia poprawa, a nie maksymalna.
Jerry Coffin
2
@Jerry: racja, ale wciąż bardzo, bardzo daleko od faktycznej różnicy w wydajności między C ++ i PHP.
vartec,
6

Zaletą podejścia FB jest to, że nie musieli od razu decydować. Powinieneś zrobić to samo. Wybierz język, który sprawia, że ​​jesteś najbardziej produktywny, ale upewnij się, że łatwo współpracuje z C / C ++.

Gdy masz miliony użytkowników i potrzebujesz skrócić czas reakcji o milisekundy, możesz zoptymalizować ścieżki krytyczne za pomocą C / C ++.

Scant Roger
źródło
0

Elementem C ++ używanym przez Facebook jest HHVM.

To jest maszyna wirtualna HIPHOP. Mimo że napisany w C ++, jest to zasadniczo „lepszy interpreter PHP”.

Kod php jest kompilowany w kod bajtowy, który jest następnie interpretowany przez HHVM w czasie wykonywania i podlega optymalizacji „Just In Time” podczas działania.

Programiści z facebooka nadal piszą głównie w języku PHP, a to, co widzisz w przeglądarce, jest prawie na pewno generowane przez program PHP - ale na którym został skompilowany i zinterpretowany przez środowisko uruchomieniowe HHVM.

Rzeczywisty HHVM jest darmowym oprogramowaniem typu open source. Więc jeśli musisz podawać milion zdjęć ślicznych kotków na godzinę, możesz pobrać HHVM i przyspieszyć swój serwer przy minimalnej zmianie PHP.

James Anderson
źródło