Warum hat Facebook neben PHP auch C ++ verwendet? [geschlossen]

15

Was war der Hauptgrund, warum Facebook neben PHP C ++ verwenden musste? Ich frage mich, ob ich eine Website mit vielen Besuchern erstellen muss, um auch C ++ zu verwenden.

Goma
quelle
Möglicherweise für Back-End-Prozesse, aber Sie wären verrückt, wenn Sie damit eine regelmäßige Webentwicklung durchführen würden.
ChaosPandion
1
In der Frage programmers.stackexchange.com/questions/53624/… wird dieses Problem ebenfalls erörtert. Vielleicht möchten Sie einen Blick darauf werfen.
Vitor Py
4
Warum schreibt Google ihre Server in C ++?
Job
1
@Job und Java und Python.
Rightfold
5
@WTP Meines Wissens nach wird Python verwendet, um neue Funktionen zu prototypisieren und auszuprobieren. Sobald die Benutzerlast hoch ist und die Dinge so schnell wie möglich funktionieren müssen, wird Python-Code durch C ++ - Code ersetzt. Ich bin mir ziemlich sicher, dass ein Geschwindigkeitsunterschied von nur 1,2 eine große Sache für Server ist, die Hunderte von Millionen von Benutzern ausgesetzt sind.
Job

Antworten:

20

Hier ist, warum: HipHop für PHP: Bewegen Sie sich schnell :

Einer der Schlüsselwerte bei Facebook ist, schnell zu handeln. In den letzten sechs Jahren konnten wir dank des rasanten Entwicklungstempos von PHP viel erreichen. Als Programmiersprache ist PHP einfach. Einfach zu lernen, einfach zu schreiben, einfach zu lesen und einfach zu debuggen. Wir sind in der Lage, neue Ingenieure mit PHP viel schneller auf Facebook zu bringen als mit anderen Sprachen, wodurch wir schneller innovieren können.

Heute freue ich mich darauf, das Projekt mit einem kleinen Team großartiger Leute zu teilen, an dem ich in den letzten zwei Jahren gearbeitet habe. HipHop für PHP. Mit HipHop haben wir die CPU-Auslastung unserer Webserver je nach Seite um durchschnittlich etwa fünfzig Prozent gesenkt. Weniger CPU bedeutet weniger Server, was weniger Overhead bedeutet. Dieses Projekt hatte enorme Auswirkungen auf Facebook. Wir sind der Meinung, dass das Web als Ganzes von HipHop profitieren kann. Deshalb veröffentlichen wir es heute Abend als Open Source in der Hoffnung, dass es einen neuen Schwerpunkt auf die Skalierung großer komplexer Websites mit PHP legt. Während HipHop uns unglaubliche Ergebnisse gezeigt hat, ist es sicherlich nicht vollständig und Sie sollten mit Beta-Software vertraut sein, bevor Sie es ausprobieren.

HipHop für PHP ist technisch gesehen kein Compiler. Es ist eher ein Quellcode-Transformator. HipHop wandelt Ihren PHP-Quellcode programmgesteuert in hochoptimiertes C ++ um und kompiliert ihn dann mit g ++. HipHop führt den Quellcode auf semantisch äquivalente Weise aus und verzichtet auf einige selten verwendete Funktionen - wie eval () -, um die Leistung zu verbessern. HipHop enthält einen Code-Umsetzer, eine Neuimplementierung des PHP-Laufzeitsystems und eine Neuformulierung vieler gängiger PHP-Erweiterungen, um diese Leistungsoptimierungen zu nutzen.

PHP als Skriptsprache skalieren

Die Wurzeln von PHP liegen in Skriptsprachen wie Perl, Python und Ruby, die alle große Vorteile in Bezug auf die Produktivität von Programmierern und die schnelle Iterationsfähigkeit von Produkten haben. Dies wird mit traditionelleren kompilierten Sprachen wie C ++ und interpretierten Sprachen wie Java verglichen. Andererseits ist bekannt, dass Skriptsprachen im Allgemeinen weniger effizient sind, wenn es um die CPU- und Speichernutzung geht. Aus diesem Grund war es schwierig, Facebook jeden Monat auf über 400 Milliarden PHP-basierte Seitenaufrufe zu skalieren.

Eine übliche Möglichkeit, diese Ineffizienzen zu beheben, besteht darin, die komplexeren Teile Ihrer PHP-Anwendung direkt in C ++ als PHP-Erweiterungen zu schreiben. Dies verwandelt PHP weitgehend in eine Verbindungssprache zwischen Front-End-HTML und Anwendungslogik in C ++. Aus technischer Sicht funktioniert dies gut, reduziert jedoch drastisch die Anzahl der Ingenieure, die in der Lage sind, an Ihrer gesamten Anwendung zu arbeiten. Das Erlernen von C ++ ist nur der erste Schritt zum Schreiben von PHP-Erweiterungen, der zweite ist das Verstehen der Zend-APIs. Da unser Entwicklungsteam relativ klein ist - es gibt über eine Million Benutzer pro Ingenieur - können wir es uns nicht leisten, Teile unserer Codebasis weniger zugänglich zu machen als andere.

Das Skalieren von Facebook ist eine besondere Herausforderung, da fast jede Seitenansicht ein angemeldeter Benutzer mit einer benutzerdefinierten Benutzererfahrung ist. Wenn Sie Ihre Homepage aufrufen, müssen wir alle Ihre Freunde nachschlagen, die wichtigsten Aktualisierungen abfragen (von einem von uns erstellten benutzerdefinierten Dienst namens Multifeed), die Ergebnisse basierend auf Ihren Datenschutzeinstellungen filtern und die Artikel mit Kommentaren ausfüllen , Fotos, Likes und all die umfangreichen Daten, die die Leute an Facebook lieben. Das alles in weniger als einer Sekunde. Mit HipHop können wir die Logik für die endgültige Seitenerstellung in PHP schreiben und schnell iterieren, während wir uns auf benutzerdefinierte Back-End-Dienste in C ++, Erlang, Java oder Python verlassen, um den Newsfeed, die Suche, den Chat und andere Kernbestandteile zu bedienen Der Seite.

Seit 2007 haben wir über verschiedene Möglichkeiten nachgedacht, um diese Probleme zu lösen, und sogar versucht, einige davon umzusetzen. Der übliche Vorschlag ist, Facebook nur in einer anderen Sprache umzuschreiben. Angesichts der Komplexität und Geschwindigkeit der Entwicklung der Website würde dies jedoch einige Zeit in Anspruch nehmen. Wir haben Aspekte der Zend Engine - PHPs Interna - umgeschrieben und diese Patches wieder in das PHP-Projekt eingebracht, aber letztendlich nicht die Art von Leistungssteigerungen gesehen, die erforderlich sind. Die Vorteile von HipHop sind für unsere Entwicklungsgeschwindigkeit nahezu transparent.

HipHop hacken

Vor ein paar Jahren habe ich eines Abends bei einem Hackathon (siehe Prime Time Hack) meine erste Code-Transformation von PHP in C ++ gestartet. Die Sprachen sind syntaktisch ziemlich ähnlich und C ++ übertrifft PHP drastisch, wenn es um die CPU- und die Speichernutzung geht. Sogar PHP selbst ist in C geschrieben. Wir wussten, dass es unmöglich ist, eine ganze Codebasis dieser Größe von Hand neu zu schreiben, fragten uns jedoch, was passieren würde, wenn wir ein System bauen würden, das dies programmgesteuert erledigt.

Es ist kein neues Konzept, neue Wege zur Verbesserung der PHP-Leistung zu finden. Zur Laufzeit verwandelt die Zend Engine Ihre PHP-Quelle in Opcodes, die dann durch die Zend Virtual Machine ausgeführt werden. Open-Source-Projekte wie APC und eAccelerator speichern diese Ausgabe im Cache und werden von den meisten PHP-basierten Websites verwendet. Es gibt auch Zend Server, ein kommerzielles Produkt, das PHP durch Opcode-Optimierung und Caching beschleunigt. Stattdessen haben wir darüber nachgedacht, PHP-Quellcode direkt in C ++ umzuwandeln, das dann in systemeigenen Maschinencode umgewandelt werden kann. Selbst das Kompilieren von PHP ist keine neue Idee. Open Source-Projekte wie Roadsend und phc kompilieren PHP nach C, Quercus kompiliert PHP nach Java und Phalanger kompiliert PHP nach .Net.

Unnötig zu erwähnen, dass es länger gedauert hat als dieser einzelne Hackathon. Acht Monate später hatte ich genug Code, um zu demonstrieren, dass es tatsächlich möglich ist, mit kompiliertem Code schneller zu laufen. Wir haben dem Team schnell Iain Proctor und Minghui Yang hinzugefügt, um das Tempo des Projekts zu beschleunigen. Wir haben die nächsten zehn Monate damit verbracht, die gesamte Codierung fertigzustellen und die folgenden sechs Monate auf Produktionsservern zu testen. Wir sind stolz zu sagen, dass wir zu diesem Zeitpunkt nur sechs Monate nach der Bereitstellung über 90% unseres Web-Traffics mit HipHop bedienen.

Wie funktioniert HipHop?

Die größte Herausforderung des Projekts bestand darin, die Lücke zwischen PHP und C ++ zu schließen. PHP ist eine Skriptsprache mit dynamischer, schwacher Typisierung. C ++ ist eine kompilierte Sprache mit statischer Typisierung. Während Sie mit PHP magische dynamische Funktionen schreiben können, sind die meisten PHP-Funktionen relativ unkompliziert. Es ist wahrscheinlicher, dass Sie sehen, if (...) {...} else {..}als es zu sehen ist function foo($x) { include $x; }. Hier gewinnen wir an Leistung. Wann immer möglich verwendet unser generierter Code statische Bindungen für Funktionen und Variablen. Wir verwenden auch die Typinferenz, um den spezifischsten Typ für unsere Variablen auszuwählen und damit Speicherplatz zu sparen.

Der Transformationsprozess umfasst drei Hauptschritte:

  1. Statische Analyse, bei der Informationen darüber gesammelt werden, wer was deklariert und welche Abhängigkeiten bestehen,
  2. Geben Sie Inferenz ein, wobei wir den spezifischsten Typ zwischen C ++ - Skalaren, String, Array, Klassen, Object und Variant und auswählen
  3. Codegenerierung, die größtenteils eine direkte Entsprechung von PHP-Anweisungen und -Ausdrücken zu C ++ - Anweisungen und -Ausdrücken ist.

Wir haben auch HPHPi entwickelt, einen experimentellen Interpreter, der für die Entwicklung entwickelt wurde. Wenn Sie HPHPi verwenden, müssen Sie Ihren PHP-Quellcode nicht kompilieren, bevor Sie ihn ausführen. Es hat uns geholfen, Fehler in HipHop selbst zu finden und bietet Entwicklern eine Möglichkeit, HipHop zu verwenden, ohne die Art und Weise zu ändern, in der sie PHP schreiben.

Insgesamt ermöglicht es HipHop, die besten Aspekte von PHP beizubehalten und gleichzeitig die Leistungsvorteile von C ++ zu nutzen. Insgesamt haben wir über 300.000 Codezeilen und mehr als 5.000 Komponententests geschrieben.

Trinidad
quelle
4
Das ist die Antwort, ein bisschen Farbe wäre schön gewesen, aber im Grunde kommt es auf die Leistung an. Sie möchten, dass ihre Anwendung besser skaliert wird, haben aber auch erfahrenere PHP-Mitarbeiter und sind der Meinung, dass PHP sie produktiver macht. Die Lösung ermöglicht also die Einfachheit von PHP mit der Leistung von C. Ihre Codebasis ist zu groß, um sie trotzdem manuell zu übersetzen.
Cervo
13

Kurze Antwort - nein, Sie nicht brauchen , C ++.

Ich glaube, Sie beziehen sich auf HipHop . Wenn Sie über die Verbesserungen lesen, sind es ungefähr 50%. Dies ist sehr wichtig, wenn Sie Facebook mit Tausenden von Frontend-Servern sind. Sie zu entlasten bedeutet Kosteneinsparungen in Millionenhöhe im Rechenzentrum. Im Falle eines Unternehmens mit 10 bis 100 Front-End-Servern würden die Entwicklungskosten die möglichen Einsparungen deutlich übersteigen. Wie auch immer, die schwerste Verarbeitung erfolgt im Back-End, bei dem es sich normalerweise um eine RDBMS- oder NoSQL-Lösung handelt, die als hochoptimierter C / C ++ - Code entwickelt wurde.

Natürlich hätte das viel mehr Einsparungen bringen können, wenn man PHP komplett rausgeschmissen hätte. Aber das ist nicht etwas, was man mit einer riesigen Codebasis machen kann, wie im Fall von Facebook.

Nun zum anderen Teil der Frage: Wenn Sie wirklich wissen möchten, wie Sie mit großen Lasten umgehen müssen, lesen Sie den High Scalability-Blog , insbesondere den Teil Real Life Architectures.

Es ist mit PHP möglich, aber definitiv nicht meine Wahl. Wenn Sie eine dynamische Sprache möchten, sind Python, Ruby oder vielleicht Lua die bessere Wahl.

vartec
quelle
2
+1, aber die Skalierbarkeit hat praktisch nichts mit der verwendeten Sprache zu tun. Die Datenbankarchitektur hat eine viel größere Bedeutung.
Dan_waterworth
1
@ Dan: Deshalb sage ich - es ist mit PHP möglich.
Vartec
2
Nach dem Blog-Eintrag @Trinidad zitiert, ist 50% die durchschnittliche Verbesserung, nicht das Maximum.
Jerry Coffin
2
@Jerry: Richtig, aber es ist immer noch sehr, sehr weit vom tatsächlichen Leistungsunterschied zwischen C ++ und PHP entfernt.
Vartec
6

Das Schöne an FBs Ansatz ist, dass sie sich nicht sofort entscheiden mussten. Do solltest das auch machen. Wählen Sie die Sprache, die Sie am produktivsten macht, aber stellen Sie sicher, dass sie problemlos mit C / C ++ kompatibel ist.

Sobald Sie Millionen von Benutzern haben und die Antwortzeiten um Millisekunden verkürzen müssen, können Sie kritische Pfade mit C / C ++ optimieren.

Scant Roger
quelle
0

Das von Facebook verwendete C ++ - Element ist die HHVM.

Das ist die virtuelle HIPHOP-Maschine. Obwohl in C ++ geschrieben, handelt es sich im Wesentlichen um einen "besseren PHP-Interpreter".

Der PHP-Code wird in Byte-Code kompiliert, der dann von der HHVM zur Ausführungszeit interpretiert und während der Ausführung "Just In Time" -Optimierungen unterzogen wird.

Die Entwickler von face book schreiben immer noch hauptsächlich in PHP, und was Sie in Ihrem Browser sehen, wird mit ziemlicher Sicherheit von einem PHP-Programm ausgegeben - obwohl es von der HHVM-Laufzeit kompiliert und interpretiert wurde.

Die eigentliche HHVM ist Open Source frei verfügbar. Wenn Sie also eine Million süße Kätzchenbilder pro Stunde liefern müssen, können Sie die HHVM herunterladen und Ihren Server mit minimalen Änderungen an Ihrem PHP beschleunigen.

James Anderson
quelle