HipHop Virtual Machine: le compilateur PHP just in Time de Facebook

WRInaute accro
Facebook avait déjà livré HipHop, son interpréteur PHP (systématisé en prod' chez FB en 2010, cela avait fait chuter le besoin CPU de 50%). Il vient maintenant de le faire évoluer en un compilateur JIT (just in time): le résultat, intitullé HHVM, pour HipHop Virtual Machine a été ouvert sur github.

Les gains de performance attendus sont impressionnants: 60% de rapidité en plus pour 90% de mémoire en moins.

Source: LMI


90% de mémoire en moins, quand on a 800 millions d'utilisateurs, ça en fait des machines devenues inutiles. Que vont-ils en faire à votre avis ?
 
WRInaute impliqué
90% de mémoire en moins, quand on a 800 millions d'utilisateurs, ça en fait des machines devenues inutiles. Que vont-ils en faire à votre avis ?
Rien, ils en remplaceront moins au pire, ou au mieu, ils s'en serviront pour gérer d'autres charges.
 
Nouveau WRInaute
Ca a l'air intéressant, mais concrètement j'ai du mal à voir comment cela fonctionne / s'installe ?

- Est ce toujours apache qui interprète le c++ ?
- Comment un flux entrant en port 80 est "redirigé" vers une application interprétant du c++ ?
- faut il installer un module c++ dans apache, et les urls qui ne sont plus en .php mais en .autrechose ???

Beaucoup d'interrogations :)

Si jamais vous croisez un tutoriel, n'hésitez pas...

Très bonne soirée à tout le monde

EDIT : de plus, FB semble utiliser beaucoup d'AJAX, cela veut il dire que c'est compatible javascript ? à moins que j'ai mal compris quelque chose... ou que le code généré reste du html ?
 
Nouveau WRInaute
/!\ Déterrage de topic, je viens de lire la news, et constatant que mon bottleneck est visiblement PHP plus que MySQL, le sujet m'intéresse.

swakone a dit:
Ca a l'air intéressant, mais concrètement j'ai du mal à voir comment cela fonctionne / s'installe ?

- Est ce toujours apache qui interprète le c++ ?
- Comment un flux entrant en port 80 est "redirigé" vers une application interprétant du c++ ?
- faut il installer un module c++ dans apache, et les urls qui ne sont plus en .php mais en .autrechose ???

Beaucoup d'interrogations :)

Si jamais vous croisez un tutoriel, n'hésitez pas...

Très bonne soirée à tout le monde

EDIT : de plus, FB semble utiliser beaucoup d'AJAX, cela veut il dire que c'est compatible javascript ? à moins que j'ai mal compris quelque chose... ou que le code généré reste du html ?

C'est très confus dans ta tête, je vais aborder le peu que j'ai pu appréhender.

Déjà, laisse tomber Apache, ça tient pas la charge face à NginX.

La conf idéale est un NginX qui écoute sur le port 80, qui via les rewrites rules détecte une url à réécrire en php et forward en 8080 cette url à la HHVM.

On a donc schématiquement :

NginX (listen 80, rewrite vers .php) ----> HHVM (listen 8080, conversion en bytecode ou compilation JIT)

Il n'y a aucun module spécifique à installer sur NginX (ou Apache).
C'est juste du forward d'url sur un port différent de celui de NginX (monurl:80 et monurl:8080 sont deux urls différentes).

Quand Facebook dit qu'il fait beaucoup d'AJAX, c'est qu'il utilise AJAX pour charger des données en PHP

On a le schéma suivant :

NginX -> HHVM -> NginX -> (page complète .html) -> AJAX -> NginX -> HHVM -> NginX -> (morceau de .html/json/...)

La problématique de Facebook n'est pas tant de faire de l'AJAX, mais de délivrer des données en live.
C'est à dire des données qu'il est impossible de cacher.
Autrement dit, il est obligé d'exécuter du code dynamique, et c'est ça qui est très coûteux, en temps d'exécution comme en ressources CPU.

Maintenant, une page web, ce n'est pas que du PHP (JS, CSS, images...).
Il y a tout un tas de choses à améliorer avant de t'attaquer à cela.

Scorer + 95 % à Google Page Speed est, selon moi, un excellent préambule aux optimisations "lourdes" comme HHVM.
 
Nouveau WRInaute
Je me pose deux questions existentielles sur HHVM :

Le binaire fait-il du séquentiel ou possède-t-il un moyen de paralléliser les écoutes de fichier ?
On sait que les "serveurs web" traditionnels possèdent ce type de feature, que ce soit Apache, NginX, PHP-FPM... etc.
Il serait décevant que HHVM n'ai pas ce type de mécanisme, mais la documentation ne précise pas.
Décevant dans le sens où si HHVM apporte bien un gain de 4.8 x en vitesse d'execution, il suffirait de spawner 5 threads (et plus) avec PHP-FPM pour passer devant.
Mon PHP-FPM tourne actuellement avec 30 threads, donc c'est loin d'être anodin comme question.
En pire cas, j'imagine qu'on doit pouvoir faire tourner manuellement 30 HHVM sur des ports différents et utiliser NginX comme load balancer
Après, il faut bien l'avouer, j'ai tendance à préférer un mécanisme automatique à un mécanisme manuel...

Le binaire est-il un PHP figé, avec des modules figés ?
Est-il possible de compiler ses propres modules (GD2, PDO, Memcached, IgBinary... etc.) ?
Je sais que c'était problématique à l'époque de HPHPc (la version C++, qui était statique).
Le binaire était un PHP 5.2 avec une liste de modules figée car entièrement réécrite à la sauce Facebook
C'est ce qui m'avait découragé à l'époque : j'adore utiliser une distribution PHP custom avec des modules triés sur le volet.
HHVM pourrait être une surcouche de PHP, une machine virtuelle transformant en bytecode + compilation JIT
Dans le cas où HHVM utiliserait réellement le binaire PHP, on aurait aucun problème de compatibilité.
Mais j'aimerai en être sûr...

Bref, c'est vraiment pas évident de trouver de la doc là-dessus, et quand t'en trouve, elle date de deux ans (cf les dates d'édition) et elle parle des fois de l'ancien HipHop (HPHPc).

https://github.com/facebook/hiphop-php/wiki/Building-and-installing-HHVM-on-Ubuntu-12.04
https://github.com/facebook/hiphop-php/wiki/Building-and-installing
https://github.com/facebook/hiphop-php/wiki/Using-nginx-as-front-server-to-HipHop
 
Discussions similaires
Haut