Facebook draait php negen keer sneller dankzij jit-compiler

Facebook is er in geslaagd om php-code negen keer sneller te laten draaien, dankzij gebruik van een just-in-time-compiler en een virtuele machine. De implementatie van Facebook, waarvan de broncode op GitHub is geplaatst, is vooral geschikt voor grote websites.

Facebook LogoNormaliter is php een geïnterpreteerde taal, waarbij de php-binary ervoor zorgt dat de code als machinecode wordt uitgevoerd, maar in de implementatie van Facebook wordt de php-code door een just-in-time-compiler naar bytecode vertaald. Omdat bytecode niet rechtstreeks op een cpu kan worden uitgevoerd, wordt die uitgevoerd in een virtuele machine. Die constructie is vergelijkbaar met Java en .NET. De combinatie van de virtuele machine en de just-in-time-compiler wordt door Facebook HipHop Virtual Machine genoemd; sinds dit jaar draait de constructie op alle Facebook-servers.

HHVM, waar Facebook drie jaar aan heeft gewerkt, zorgt ervoor dat php negen keer sneller kan draaien, zo zegt een medewerker van de sociale-netwerksite tegenover ComputerWorld. De virtuele machine is vooral interessant voor grote websites met een zware belasting; voor kleinere websites, zoals een simpel WordPress-blog, schat de Facebook-medewerker dat er sprake is van 'slechts' een vijfvoudige verbetering in snelheid.

De HipHop VM, waarvan de code op GitHub is geplaatst, is de opvolger van een ouder Facebook-project dat eveneens als HipHop door het leven ging. In die implementatie, die inmiddels is uitgefaseerd, werd php gecompileerd naar C++. Dat zorgde voor een verdubbeling van de snelheid van php. De implementatie met de jit-compiler en de virtuele machine blijkt niet alleen sneller, maar ook dynamischer. Het vertalen van php naar C++ is namelijk niet in alle gevallen mogelijk, omdat niet alle mogelijke bewerkingen kunnen worden voorspeld. Voor de jit-compiler hoeft code niet vooraf te worden gecompileerd: dat gebeurt op het moment waarop de code wordt uitgevoerd.

Door Joost Schellevis

Redacteur

27-07-2013 • 10:43

47 Linkedin Whatsapp

Reacties (47)

47
45
37
8
2
3
Wijzig sortering
Anoniem: 466420
27 juli 2013 23:18
Hoewel het een aardige prestatie is een vorm van PHP te kunnen parsen (gezien PHP's nogal vreemde en nergens volledig gespecificeerde syntax), is het niet heel bijzonder dat hun jit-compiler vele malen sneller code uitvoert dan de standaardinterpreter: de standaardimplementatie van PHP is namelijk een bij elkaar gehackt gedrocht zonder enige intelligentie die je normaal gesproken in een interpreter zou mogen verwachten (ze bouwen niet eens een AST op). Niet heel verassend dat het veel beter en dus ook sneller zou kunnen.

Ik vind het wel moeilijk te begrijpen waarom ze deze moeite doen als ze ook gewoon een degelijke programmeertaal zouden kunnen gebruiken. Kennelijk vindt Facebook het belangrijker om een leger goedkope programmeurs te kunnen inhuren dan dat de software die zij bouwen kwalitatief en onderhoudbaar is.
Zo, wat een bash naar PHP. Vanwaar die negativiteit? PHP is niet voor niets (een van) de meestgebruikte programmeertalen voor het web. Vanuit de overlevering uit de vroegere versies zijn er nog wel wat onconsequenties in de parametervolgorde of naamgeving van functies overgebleven met het oog op backwards compatibility maar de taal is echt met sprongen vooruit gegaan in PHP4 en PHP5, waarin ook vele wel consequente alternatieven voor oude functies geboden worden.

Je kunt er prima zeer fatsoenlijk onderhoudbare code in schrijven en dat gebeurt ook heel veel. Dat het de flexibiliteit biedt om ook lelijke code op een (soort van) juiste methode te interpreteren heeft natuurlijk tot gevolg dat ook veel mensen die minder kaas van programmeren gegeten hebben er scriptjes in bouwen die vervolgens (natuurlijk) lelijk en slecht te onderhouden zijn. Dat zegt op zich niets over de taal, maar voornamelijk over die programmeurs.

AST levert meer overhead dan een bytecode interpreter, dus dat levert zeker geen slechtere performance op. En waarin is de taal niet volledig gespecificeerd dan? Op zijn minst is de taal volledig gespecificeerd in de broncode, maar ook de documentatie op php.net is zeer uitgebreid, inclusief zeer vele waardevolle bijdragen van gebruikers. Wat je probleem hierin is is mij onduidelijk, maar het komt nogal over als een troll.

[/verleiding door flamebait]


Ik moet zeggen dat ik wat dit betreft Facebook wel goed bezig vind. Ik ben geen fan van de website en de manier waarop zij met de privacy van gebruikers omgaan, maar met dergelijke projecten leveren zij wel een grote bijdrage aan de PHP community, zeker omdat ze het open source doen. De conversie naar C++ vond ik ook al een hele mooie ontwikkeling. Ik heb zelf ook wel eens webdevelopment in C++ gedaan, en al mis je dan wel een hoop standaard functionaliteit die in PHP zonder extra libraries beschikbaar is, de snelheid is wel om van te smullen. Dat een converter wel beperkingen heeft lijkt me niet meer dan logisch, en een herimplementatie als JIT interpreter is wel weer een mooie ontwikkeling. Ik zal hier binnenkort eens mee gaan spelen, performance verbetering is altijd welkom!
"Bash naar PHP" made my day
Vanwaar de negativiteit? Ik kan natuurlijk niet voor AardvarkSoep spreken, maar PHP is een *slechte* taal. Alhoewel ik durf te beweren dat de meeste programmeurs die enkel in PHP programmeren geen topprogrammeurs zijn, denk ik ook dat de taal zeker niet meehelpt. En dat er onderhoudbare code te schrijven is in een taal als PHP zegt niks over de taal zelf: het lukt een timmerman ook vast om met een steen een spijker in een plank te slaan, maar is de steen dan direct een goed hulpmiddel?

Een greep uit de doos van slechte gewoonten is:
  • Sorteren is niet deterministisch. NULL is bijvoorbeeld kleiner dan -1, maar tegelijkertijd gelijk aan 0.
  • Impliciete casting is totaal gaar. De twee (string!!) variabelen 9223372036854775807 en 9223372036854775808 zijn overduidelijk niet hetzelfde, maar wanneer ze worden vergeleken met == geeft PHP een hele andere uitkomst. De interpreterer kijkt voor iedere twee strings die je vergelijkt eerst of het een nummer is en zet het vervolgens om naar een float. Het voor iedere twee strings bekijken of het toevallig nummers zijn is al totaal gaar, maar het laatste breekt al helemaal mijn klomp.
  • De ontwikkelaars van PHP zijn onprofessioneel, onbeleefd en incapabel. Met de eerste twee kan ik nog leven, maar de laatste is de doodsteek voor een taal. Een paar jaar geleden werd (bijvoorbeeld) in een aantal talen een lek ontdekt waardoor de talen gevoelig bleken voor een DoS aanval (Python bug report). De PHP ontwikkelaars reageerde door niet de implementatie van hashmaps aan te pakken, maar door het maximale aantal POST-argumenten te limiteren. Dit laat zien dat ze totaal niet snappen waar ze mee bezig zijn.

    Verder heb ik helemaal geen zin om in te gaan op de onprofessionaliteit en onbeleefdheid van hen. Een kleine selectie bugs uit de bug tracker ondersteunt mijn punt voldoende denk ik..
  • Functies als "mysql_real_escape_string" en "mysql_escape_string". Beide functies nemen dezelfde argumenten aan en doen het zelfde. De laatste bevat echter een serieuze beveiligingsfout. Wut.
  • Een array sorteren? Makkelijk! Gewoon een van deze functies kiezen: array_multisort, arsort, asort, ksort, krsort, natsort, natcasesort, sort, rsort, uasort, uksort, usort. I rest my case.
Goed. Ik eigenlijk weet ik gewoon niet goed waar ik moet beginnen. Maar zie:

http://me.veekun.com/blog...-a-fractal-of-bad-design/
http://phpsadness.com/
Slechte punten.

Sorteren is wel deterministisch. NULL is de eerste waarde bij sorteren. NULL is ook zeker niet gelijk aan 0. Het wordt gelijk geevalueerd als 0 onder bepaalde omstandigheden:


$a = null;
$b = 0;

if ($a === $b)
echo "BUG in PHP\n";
echo ($a == $b)
echo "Verwacht gedrag in php\n";


Dezelfde dingen zie je in veel andere geinterepreteerde talen zoals Python.

Impliciete casting gebeurt niet zoals jij het hier omschrijft:

$a = "9223372036854775807";
$b = "9223372036854775808";

if ($a == $b)
echo "Bug in PHP\n";
else
echo "Verwacht gedrag in PHP";

Dit levert gewoon netjes 'Verwacht gedrag in PHP' op, oftewel, $a != $b. Maak je er zelf floats van dan kan gebeuren wat jij zegt, maar dan vraag je er zelf om door buggy code te schrijven.


Wat jij meegemaakt hebt met PHP developers weet ik niet, maar in mijn ervaring wordt adequaat en gericht gereageerd op bugs. De bug waar jij aan refereert is toch op een juiste manier opgelost? In ieder geval op korte termijn. De limiet op aantal POST-argumenten is een zeer snelle manier om een zeer effectieve patch op te zetten, en de limiet die gesteld wordt zal geen enkele applicatie schaden omdat de limiet dermate hoog ligt dat je wel eens goed over je scripts na mag gaan denken als je er tegenaan loopt. Als je op die manier gaat redeneren maakt het feit dat Python (en vele andere talen) een exception gooien als er te veel niveaus van recursie zijn het ook een slechte taal: waarom repareren ze de implementatie van recursie niet gewoon om hier geen artificiele limiet aan te leggen of tail-recursion te detecteren / toe te passen?

mysql_real_escape_string dan wel mysql_escape_string zou je uberhaubt niet moeten gebruiken. Het zijn functies van de traditionele "mysql" module die al zwaar achterhaald is en al lang vervangen zou moeten zijn in jouw code door PDO en/of mysqli. In PHP5.5 zullen alle mysql functies verwijderd worden en wordt je gedwongen deze upgrade te maken die je al veel te lang uitgesteld hebt. mysqli_real_escape_string bestaat, maar mysqli_escape_string is niet beschikbaar. Geen probleem dus, tenzij je doel is om antieke code te schrijven.

Een array sorteren is inderdaad makkelijk. Je eerste gedachte zou zijn om de functie genaamd 'sort' te gebruiken, en weet je wat, die doet precies wat je verwacht! Wil je nu complexere dingen als op de keys sorteren, key-value associaties behouden of eigen vergelijkfuncties gebruiken is het toch mooi dat er functies als ksort, usort, asort enzovoorts zijn? Ik vind de naamgeving aardig intuitief, in tegenstelling tot het opgeven van een combinatie flags om het gedrag van de sorteerfunctie te beinvloeden (Wat overigens ook mogelijk is).


De dingen die jij in jouw post aanhaalt doen mij vermoeden dat je nog met PHP 2 of 3 werkt. De taal is immens populair geworden in korte tijd (danzij zijn superioiriteit qua inzichtelijkheid tov bijvoorbeeld Perl), wat natuurlijk als gevolg heeft gehad dat de implementatie van nieuwe features een tijdje voor heeft gelopen op de QA van die features en het design erachter. Later (in de overgang naar PHP5) zijn heel veel van deze tekortkomingen al lang en breed opgelost. Ik kan ook wel gaan ranten over hoe WIndows 3.1 incapabel was, maar zullen we wel een beetje in het heden blijven leven?
Anoniem: 61690
27 juli 2013 10:53
Staat er al lange tijd, niet echt nieuws ofzo. Ik heb zelf wat gepiemeld met HipHop. Leuk voor als je iets nieuws gaat bouwen en de ontbrekende functies vermijd. Het is geen full replacement dus als je Drupal of Wordpress erop wilt draaien zonder te patchen dat zal niet lukken.

Verder leuk project, alleen jammer dat het zo'n floating target is op het moment (of misschien is dat nu juist voorbij met die VM). Er veranderde naar mijn mening nog teveel. Hopelijk trekt dit meer ontwikkelaars aan want er moet nog heel wat gebeuren. Er zijn overigens ook pre-built Ubuntu packages beschikbaar, gemakkelijk om te installeren.

Uit ervaring, als je APC gebruikt kom je erg dicht in de buurt van de performance van HipHip mocht het toch niet lukken om zo ver te komen met HipHop maar je wel die performance-gain wilt zien zul je zoiets moeten doen.
Als APC (wat niks anders doet dan de PHP byte code van een .php file cachen) dicht in de buurt komt van HipHop, is er nog een lange weg te gaan. HipHop is dus vergelijkbaar met Java 1.1.

FYI, er is ook een Java based implementatie voor de PHP interpreter: Quercus http://www.caucho.com/resin-3.1/doc/quercus.xtp en die claimt 4x performance in vergelijking met mod_php (dus in de buurt van APC). (note: quercus doet geen JIT voor PHP naar JVM bytecode).

[Reactie gewijzigd door elmuerte op 27 juli 2013 11:07]

Quercus hoeft ook niet per se JIT daarvoor te doen, ze zouden ook het JIT-gebeuren aan de JVM over kunnen laten door zelf de php-code te transformeren naar JVM-bytecode. Maar toen ik een paar weken geleden de code ervan bekeek, zag het er niet naar uit dat ze dat doen.

Op zich niet erg, maar daar zou ook bij Quercus dus nog een enorme winst te halen zijn. Dat gaat natuurlijk wel gepaard met erg ingewikkelde programmacode (PHP is niet bepaald de eenvoudigste taal om te compileren naar een andere taal). En daar zijn ze ook achter gekomen bij Facebook :P

Overigens doet Quercus wel een paar simpele optimalisaties tijdens de omzetting van de php-code naar een Quercus Program. Maar niets op de manier zoals de JVM het tegenwoordig doet of zelfs HipHop VM.
Eens, zelf compileren is een crime en daarna heb je iets dat maar zeer beperkt inzetbaar is. Kan me voorstellen dat voor facebook die de resources heeft om alles aan te passen aan hiphop het een uitkomst is. Maar voor gewone stervelingen is APC denk ik 10x beter: makkelijk te installeren en redelijk fool proof :)

De opmerking dat het vooral handig is voor grootschalige toepassingen snap ik niet zo, veelste veel een moving target en nog lang niet stabiel genoeg.
Tip: gebruik Opcache (hoort standaard bij PHP 5.5), nòg eens veel sneller dan APC (+300% oid).
Opvallend dat jij als enige op OPcache wijst. Voor alle anderen: APC is passe, omdat de PHP-ontwikkelaars het niet stabiel kregen onder PHP 5.5. Ook voor oudere PHP versies (5.3 en 5.4) en voor Windows kun je beter overschakelen op OPcache.

Voor zelfbouwers:
https://github.com/zendtech/ZendOptimizerPlus

Voor Windows:
- meegeleverd met PHP 5.5
- http://windows.php.net/do...l/releases/opcache/7.0.2/ voor 5.3 en 5.4

Of je haalt mijn builds op via
http://www.apachelounge.com/viewforum.php?f=6

@TvdW: --enable-opcache hoef je in 5.5 niet eens toe te voegen (staat automatisch aan) en voor 5.3 en 5.4 zul je toch echt die broncode op moeten halen.

[Reactie gewijzigd door Jan-E op 27 juli 2013 15:12]

Voor zelfbouwers, gewoon "--enable-opcache" meegeven aan PHP's "./configure"-script. Niet handmatig met broncode gaan prutsen :)
Het hangt heel erg van je code en de hoeveelheid verkeer af, zoals ze ook uitleggen in een aantal blogs. Wikipedia gebruikt bijvoorbeeld ook HipHop omdat dit juist heel veel sneller is dan APC. Wordpress vereist trouwens ook maar een paar kleine wijzigingen.
Nog niet. Maar er is al wel een testversie, hihi.

[Reactie gewijzigd door TvdW op 27 juli 2013 11:47]

Serverfout, heh.
Het is wel iets nieuws. Dit nieuwe project draagt dan wel dezelfde naam als het oude HipHop, maar werkt geheel anders :)
HipHop VM is ook al een aardige tijd in ontwikkeling hoor. Zie de diverse verhalen op Facebook. Maar het is inderdaad wel een voortborduursel op die omgeving die het in C++-code omzette.
Heb jij het niet over de oude versie van HipHop ( de versie die een C++ compile van je php code maakte)?
'slechts' een vijfvoudige verbetering in snelheid.

Als je dit kunt bewerkstelligen op de grote providers die soms honderden sites op een server hebben draaien (allemaal weblogjes) Dan is dat als datacenter natuurlijk gewoon 5x zoveel inkomsten per server :+

Erg mooi dat facebook zich hier ook mee bezig houd. Zelf ben ik totaal niet thuis in het software wereldje (echt hardware tweakert) maar dit is een erg mooi concept zoals ik het nu kan beoordelen _/-\o_
Het werkt niet met alle standaard PHP code, deze snelheidswinst is grotendeels afhankelijk van de code kwaliteit en de installatie van HipHop for PHP is niet bepaald simpel (behalve als je exact dezelfde Linux distributie als Facebook gebruikt). Om alle websites op een webserver van een provider compatibel te maken zal een hoop werk nodig zijn.

Het zal waarschijnlijk pas nuttig worden vanaf het moment dat je minimaal 1 dedicated server voor je website nodig hebt, en dan nog is het waarschijnlijk goedkoper om een tweede server te huren dan om mensen in te huren om je code volledig aan te passen en te testen zodat het compleet werkt met HHVM (maar, kwa snelheids winst per pageview is het het meestal wel weer waard). Daar komt nog bij dat de installatie niet eenvoudig is en veel Apache modules vervangen moeten worden door andere dingen (zoals het populaire mod_rewrite).

De HipHop for PHP blog bevat een hoop informatie over hoe het werkt;
http://www.hiphop-php.com/blog/

[Reactie gewijzigd door Zerotorescue op 27 juli 2013 20:49]

Dan is dat als datacenter natuurlijk gewoon 5x zoveel inkomsten per server :+
Netwerkkosten daargelaten natuurlijk ;)
En het zal meer geheugen en mogelijk diskruimte kosten.

Ik betwijfel trouwens of rekentijd bij die datacenters de bottleneck is. Maar wie weet :)
Normaliter is php een geïnterpreteerde taal, waarbij de php-binary ervoor zorgt dat de code als machinecode wordt uitgevoerd, maar in de implementatie van Facebook wordt de php-code door een just-in-time-compiler naar bytecode vertaald. Omdat bytecode niet rechtstreeks op een cpu kan worden uitgevoerd, wordt die uitgevoerd in een virtuele machine
Als ik dat zo lees moet die PHP-interpreter goed gaar geweest zijn...
Met die nieuwe oplossing wordt als ik het goed begrijp een tweede vertaalslag gemaakt, plus dat het in een VM draait die ook nog eens een abstractielaag vormt die enige conversie vereist en een lag veroorzaakt op alle lokale bronnen. Ik vind het allemaal nog niet erg geloofwaardig klinken. Dit heeft volgens mij meer weg van een reclamespotje, alhoewel me dat met zoveel FB gebruikers ook niet meer nodig lijkt.

[Reactie gewijzigd door blorf op 27 juli 2013 13:02]

Om een voorbeeld te geven, ik heb ooit een cruptografische challenge opgelost met een python script. De standaard python interpreter deed er 8 minuten over. Pypy, een python implemetatie in python doet JIT compilen, en draait dezelfde code in 40 seconden. Ik vind de claims van Facebook dan ook niet raar.
Ah dan moeten Java en .NET ook erg traag zijn. Ik zou toch even Wikipedia erbij pakken en jezelf eens inlezen :)
Dat gaar valt wel mee, maar geinterperteerde talen zijn altijd langzamer dan gecompileerde talen.
Dus niet traag in absolute zin, maar traag in vergelijking met gecompileerde talen
Dit zal betekenen dat er minder servers nodig om dezelfde hoeveelheid verkeer te verwerken, servers kunnen meerdere aanvragen aan per seconden aan en pagina's zullen sneller gerenderd worden.

Ik zie dat HHVM alleen beschikbaar is voor Ubuntu, Debian, CentOS en FreeBSD. Vraag me af of er ooit een Mac/Windows versie zal komen (wat ik betwijfel).

Hier is een link met tips om HipHop VM te optimaliseren:
http://www.hiphop-php.com/wp/?p=713

Code zal dus altijd in functies/classes moeten staan wil de JIT Compiler deze kunnen verwerken. Alle globale variabelen zullen niet verwerkt worden.

[Reactie gewijzigd door ZeroXT op 27 juli 2013 11:04]

En dat is eigenlijk een goed iets. Global variabelen hoor je alleen te gebruiken als je procedurele pagina's schrijft. Zodra je zelf code in classes gaat plaatsen, hoor je ook de configuratie in objecten bij te houden en deze bijvoorbeeld via dependency injection door te geven aan de 'page' classes..

HHVM zou eventueel ook onder Windows kunnen werken, maar HHVM verwerkt zelfs de HTTP(s) calls. Het vervangt dus IIS en Apache en dus zal HHVM niet snel onder Windows worden gebruikt..

Daarnaast had Facebook in 2009 2 eigen data centers en hadden ze al meer dan 60.000 Linux servers staan welke vooral PHP, Memcached en MySQL draaiden en sindsdien is ook Facebook overgestapt op document databases (NoSQL) via Cassandra.
Ik denk niet dat HHVM zinvol is om op Windows aan de gang te krijgen. Niemand gaat Windows gebruiken voor dit doort high-volume sites, niet eens om dat het gewoon niet aan de eisen voor dit soort kritieke infrastructuur voldoet, maar vooral om dat het niet flexibel is, en het ook nooit zal zijn.

Dus stel dat iemand HHVM voor Windows zou patchen en builden, dan heb je er niet echt iets aan, om dat het toch nooit op die manier in een productie omgeving terecht zal komen, en als je lokaal wil testen, dan kan je beter een VM met linux nemen (of gewoon op Linux ontwikkelen).

Wat Mac betreft is het een ander verhaal. Je kan hem al gewoon bouwen onder Mac OS X, om dat er qua technologie veel overlap is. Je hoeft geen rare fratsen uit te halen om het te laten werken.
Ik zou bijvoorbeeld op een OS X machine gewoon van github kunnen clonen, en daarna configure && cmake waarna (als de deps geinstalleerd zijn) de binaries gebouwd worden.

Wat de servers per pagina betreft (of pagina's per server); hoewel je in theorie minder servers nodig hebt denk ik dat het eerder een punt wordt om gewoon sneller te serveren. Stel dat je op een gegeven moment zo snel bent dat je geen wachtrij mee hebt is sneller niet heel belangrijk meer, maar capaciteit. Natuurlijk is facebook nog niet zo ver, maar wat servers betreft zullen er de komende tijd vooral nog servers bij komen ;)
Die constructie is vergelijkbaar met Java en .NET.
Dat is niet helemaal correct. Bij .NET (CLI languages) wordt de source code pre-runtime omgezet naar een soort bytecode, namelijk CIL. Die wordt dan met een JIT-compiler omgezet naar machine code, die ook gecachet kan worden en dus niet gewoon geïnterpreteerd wordt door een VM bij runtime zoals o.a. het geval is bij de default implementatie van Lua. Bij HipHop lijkt dit wel het geval te zijn (volgens het artikel alleszins). HipHop lijkt ook nog de PHP source code bij runtime om te zetten in bytecode, in plaats van het vooraf te compileren.

[Reactie gewijzigd door lesderid op 27 juli 2013 11:31]

Sowieso is er een enorm verschil tussen Java/.NET en PHP: PHP is dynamically typed (voor zover je daar van kunt spreken). Omdat je daarmee niet hard kunt linken aan functies die worden aangeroepen, zal de performance altijd achterlopen op statically linked talen (zoals Java/.NET).

Ja, ik weet dat .NET een DLR heeft, maar het gebruik daarvan is meer uitzondering dan regel.
Sowieso is er een enorm verschil tussen Java/.NET en PHP: PHP is dynamically typed (voor zover je daar van kunt spreken). Omdat je daarmee niet hard kunt linken aan functies die worden aangeroepen, zal de performance altijd achterlopen op statically linked talen (zoals Java/.NET).

Ja, ik weet dat .NET een DLR heeft, maar het gebruik daarvan is meer uitzondering dan regel.
Dat is wellicht ook wat men bedoelt met:
Het vertalen van php naar C++ is namelijk niet in alle gevallen mogelijk, omdat niet alle mogelijke bewerkingen kunnen worden voorspeld.
zoals eerder aangegeven. Door APC te gebruiken kom je al aardig in de buurt van deze perfmance voor werkelijk 0.0 werk. Om dit systeem van facebook t implemetneren/installeren ben je ontzettend veel meer tijd kwijt en er zitten een hoop haken en ogen aan.
zoals eerder aangegeven. Door APC te gebruiken kom je al aardig in de buurt van deze perfmance voor werkelijk 0.0 werk.
Heb je de oude of nieuwe HipHop 'versie' gebruikt?

Op mijn werk gebruikten we PHP met APC en zijn overgestapt naar HipHop (oude versie) voor een advertentieplatform met 10 miljoen requests op drukke dagen en zagen zeer grote performance boost. Servers zaten op piek momenten langdurig tussen 75% ~ 100%. Met HipHop is dat nu 20% ~ 30%.

Ook zagen we in de responsetijden bij grotere aantallen concurrent users een (heel) groot verschil. Overigens ook bij kleinere aantallen concurrent users. :)

Maar goed, ik kan mij zo voorstellen dat de ene dienst meer baat heeft bij HipHop dan de andere dienst.

Of misschien andersom: de ene type dienst zal meer baat hebben bij APC dan de ander.
Mooie van dit project vindt ik dat je php gecompiled kan worden en tijdelijk opgeslagen wordt op je RAM. Hierdoor is geen I/O communicatie met de hardeschijf meer nodig;) Verder zijn er twee soorten compile mogelijkheden. Ene is realtime compilen en andere is alles compile en draaien. Dit laatste zorgd voor snelheid ;)
Die I/O communicatie is natuurlijk sowieso niet nodig, zeker niet voor veelgebruikte scripts. Een fatsoenlijk OS cachet de inhoud van het bestand na de eerste request in het geheugen en zal het de volgende keer niet opnieuw van de schijf inladen, tenzij het geheugen nodig was voor een ander doeleinde.
Wel gaaf, maar als het zo is, dat het een vergelijking is tussen PHP, zonder APC (of een andere) opcode cache, dan loopt de vergelijking wel wat scheef.

Op de meeste productie servers wordt APC wel ingesteld, omdat dit ook voor een aardige prestatie winst zorgt ten opzichte van ongechached uitvoeren van PHP.

Als je daarbij als developer nog rekening houdt met de APC caching mechanismes en niet teveel recursive / objecten calls doet in je code. Dan krijg je ook een aardig efficiënte code base, met een goede performance.

Daar heeft Facebook ook wel een aardige extensie voor gemaakt en als opensource uitgegeven overigens: xhprof http://pecl.php.net/package/xhprof

Die is sinds 20 mei 2013 weer bijgewerkt, en draait goed onder PHP 5.4, dat geeft een mooi overzicht van hoe code wordt uitgevoerd, welke functies worden aangeroepen en hoe vaak, per request.
Het project mag dan weleens waar nog niet helemaal volwassen zijn. Maar ik kan dit alleen maar toejauichten. Een ding wat ik wel minder vind is dat het alleen te implementeren valt als een stand-alone server. betekend toch weer dat je het kan inzetten bij een nieuwe omgeving of een migratie traject, mocht het zo zijn dat het project volwassen is.

[Reactie gewijzigd door Typnix op 27 juli 2013 11:49]

Op dit item kan niet meer gereageerd worden.

Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee