web-dev-qa-db-fra.com

HHVM performances médiocres

J'évalue HipHop-PHP pour la compatibilité et les performances sur notre base de code, mais j'obtiens de très mauvaises performances lorsque je l'exécute avec le serveur Web intégré activé.

J'ai l'exemple de programme de test suivant qui calcule une séquence de Fibonacci.

ex3.php:

function fib($n)
{
    if ($n <= 2)
        return 1;
    else
        return fib($n-1) + fib($n-2);
}

$n = 36;
printf("fib(%d) = %d\n", $n, fib($n, 2));

Lorsque j'exécute cela via HHVM à l'aide de la ligne de commande, j'obtiens des résultats impressionnants:

time hhvm -v"Eval.Jit=true" -f ./ex3.php
fib(36) = 14930352

real    0m0.267s
user    0m0.248s
sys     0m0.020s

Comparez cela avec PHP standard:

root@hiphop:/www# time php -f ./ex3.php
fib(36) = 14930352

real    0m5.606s
user    0m5.600s
sys     0m0.000s    

Cependant, lorsque je souhaite activer le serveur Web intégré dans HHVM, tous les gains de performances sont perdus:

hhvm -v"Eval.Jit=true" -m server -p 8000 &
time wget -qSO - http://localhost:8000/ex3.php
  HTTP/1.1 200 OK
  Content-Type: text/html; charset=utf-8
  X-Powered-By: HPHP
  Date: Sat, 27 Jul 2013 14:16:09 GMT
  Content-Length: 19
fib(36) = 14930352

real    0m5.279s
user    0m0.000s
sys     0m0.000s

Comme vous pouvez le voir, je reçois la réponse de HHVM, mais il lui faut plus de 5 secondes pour traiter cette demande. Qu'est-ce que je rate?

43
Stephan Edelman

Ingénieur HHVM ici.

En mode serveur, HHVM exécutera les premières N requêtes qu'il voit en mode interprète uniquement (c'est-à-dire avec le JIT désactivé).

La valeur par défaut dans une version optimisée est N = 11, donc si vous exécutez la demande 12 fois, la 12e serait beaucoup plus rapide.

Vous pouvez régler cela avec une option de configuration, comme ceci: -v Eval.JitWarmupRequests=3. Si vous le définissez sur 0, vous verrez immédiatement l'accélération.

Il y a plusieurs raisons à cela.

Tout d'abord, il empêche les effets de réchauffement transitoires d'affecter le code compilé par JIT.

Par exemple, les premières demandes peuvent nécessiter de remplir des valeurs dans APC, ce qui entraînera le code d'application à descendre sur des chemins différents des chemins en régime permanent. De cette façon, nous ne perdons pas d'espace sur les compilations JIT qui ne seront utilisées que quelques fois.

Deuxièmement, il permet à HHVM de collecter des informations de profilage pour améliorer la future compilation.

Si nous observons qu'une certaine valeur est un entier 99% du temps, par exemple, nous pouvons compiler du code optimisé pour le cas entier. Nous n'avons actuellement pas la possibilité de compiler du code JIT avec le profilage activé (la partie difficile est de le jeter en toute sécurité une fois que nous en avons terminé), nous effectuons donc la collecte de données en mode interprète uniquement.

101
Owen Yamauchi

J'ai le même problème de performances et j'obtiens des résultats impressionnants uniquement après avoir commenté ces lignes dans /etc/hhvm/php.ini

;hhvm.log.level = Warning
;hhvm.log.always_log_unhandled_exceptions = true
;hhvm.log.runtime_error_reporting_level = 8191
2
Abdou

si HHVM> v3.4 a changé Eval.JitWarmupRequests = 0 en Eval.JitProfileInterpRequests = 0

 `#!/usr/bin/hhvm -v Eval.Jit = 1 -v Eval.JitProfileInterpRequests = 0 ./do.php`
2
Lee SunSin