Rendimiento bajo de HHVM


Estoy evaluando HipHop-PHP para la compatibilidad y el rendimiento en nuestra base de código, pero estoy obteniendo un rendimiento muy pobre cuando se ejecuta con el servidor web incorporado habilitado.

Tengo el siguiente programa de prueba de muestra que calcula una secuencia 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));

Cuando corro esto a través de HHVM usando la línea de comandos, obtengo resultados impresionantes:

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

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

Compare esto con PHP estándar:

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

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

Sin embargo, cuando quiero habilitar el built-in servidor web en HHVM, todas las ganancias de rendimiento se pierden:

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

Como puedes ver, estoy recibiendo la respuesta de HHVM, pero tarda más de 5 segundos para procesar esta solicitud. ¿Qué me estoy perdiendo?

Author: Stephan Edelman, 2013-07-27

3 answers

Ingeniero HHVM aquí.

En modo servidor, HHVM ejecutará las primeras N peticiones que vea en modo solo intérprete (es decir, con el JIT apagado).

El valor predeterminado en una compilación optimizada es N=11, por lo que si ejecuta la solicitud 12 veces, la 12 sería mucho más rápida.

Puede ajustar esto con una opción de configuración, como así: -v Eval.JitWarmupRequests=3. Si lo pones en 0, verás el aumento de velocidad inmediatamente.

Hay un par de razones para hacer esto.

Primero, previene transitorios efectos de calentamiento que afectan al código compilado por JIT.

Por ejemplo, las primeras solicitudes pueden necesitar valores de relleno en APC, lo que hará que el código de la aplicación vaya por rutas diferentes de las rutas de estado estacionario. De esta manera, no perdemos espacio en compilaciones JIT que solo se usarán unas pocas veces.

En segundo lugar, permite a HHVM recopilar información de perfiles para mejorar la compilación futura.

Si observamos que un cierto valor es un entero el 99% del tiempo, para por ejemplo, podemos compilar código optimizado para el caso entero. Actualmente no tenemos la facilidad de JIT-compilar código con perfiles habilitados (la parte difícil es tirarlo a la basura una vez que hayamos terminado con él), por lo que hacemos la recopilación de datos en modo de solo intérprete.

 100
Author: Owen Yamauchi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-28 22:23:52

Tengo el mismo problema de rendimiento, y obtengo resultados impresionantes solo después de comentar estas líneas en /etc/hhvm/php.ini

;hhvm.log.level = Warning
;hhvm.log.always_log_unhandled_exceptions = true
;hhvm.log.runtime_error_reporting_level = 8191
 2
Author: Abdou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-19 12:32:28

Si HHVM > v3.4 Cambiar Eval.JitWarmupRequests = 0 a Eval.JitProfileInterpRequests = 0

`#!/usr/bin/hhvm -v Eval.Jit=1 -v Eval.JitProfileInterpRequests=0  ./do.php`
 2
Author: Lee SunSin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-26 02:47:19