performance - php7 - HHVM pobre desempeño
hhvm vs php7 (3)
Estoy evaluando la compatibilidad y el rendimiento de HipHop-PHP en nuestra base de código, pero obtengo un rendimiento muy pobre cuando lo ejecuto con el servidor web incorporado habilitado.
Tengo el siguiente programa de prueba de ejemplo 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 ejecuto 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
Compara 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 servidor web incorporado en HHVM, todas las mejoras 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 puede ver, estoy recibiendo la respuesta de HHVM, pero toma más de 5 segundos procesar esta solicitud. ¿Qué me estoy perdiendo?
Ingeniero de HHVM aquí.
En el modo servidor, HHVM ejecutará las primeras N solicitudes que vea en modo solo para intérprete (es decir, con el JIT apagado).
El valor predeterminado en una compilación optimizada es N = 11, por lo que si tuviera que ejecutar la solicitud 12 veces, la 12a sería mucho más rápida.
Puede sintonizar esto con una opción de configuración, así: -v Eval.JitWarmupRequests=3
. Si lo establece en 0, verá la aceleración de inmediato.
Hay un par de razones para hacer esto.
Primero, evita que los efectos de calentamiento transitorios afecten el código compilado por JIT.
Por ejemplo, es posible que las primeras solicitudes deban llenar valores en APC, lo que hará que el código de la aplicación caiga en diferentes rutas de las rutas de estado estable. De esta manera, no desperdiciamos espacio en compilaciones JIT que solo se utilizarán unas cuantas 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, por ejemplo, podemos compilar el código que está optimizado para el caso del entero. Actualmente no tenemos la capacidad de compilar JIT con el perfil habilitado (la parte difícil es desecharlo de manera segura una vez que hayamos terminado con él), por lo que hacemos la recopilación de datos en modo de solo intérprete.
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
si HHVM> v3.4 Cambiado Eval.JitWarmupRequests = 0 a Eval.JitProfileInterpRequests = 0
`#!/usr/bin/hhvm -v Eval.Jit=1 -v Eval.JitProfileInterpRequests=0 ./do.php`