Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Migración a HipHop y la HHVM

Tuenti
November 20, 2013

Migración a HipHop y la HHVM

HipHop es uno de los proyectos liberados por Facebook más conocidos. Hablaremos del estado actual del proyecto, y aprovecharé mi experiencia migrando de PHP a HipHop para describir los mayores problemas que supone la migración, así como los resultados obtenidos, con la idea de que los asistentes puedan valorar si la migración merece la pena en su caso.

Tuenti

November 20, 2013
Tweet

More Decks by Tuenti

Other Decks in Technology

Transcript

  1. Qué es HipHop •Implementación completa de parser & runtime de

    PHP •Transforma ficheros PHP a C++ y los compila (modo compilado) •Pensado para evitar tener que codificar parte del BE en C / C++ •Servidor HTTP incluido (libevent) •Proyecto grande y complejo (~ 600k líneas de código)
  2. ¿Ventajas? •Facebook dice ganar entre un 50 y un 70%

    de CPU •Nuestros resultados muestran un 50% menos de CPU •Uso de memoria también reducido, rondando el 6x de ahorro (y más estable) •Sin degradación inicial de rendimiento (PHP & APC)
  3. Actividad del proyecto •Repositorio github estuvo parado durante casi un

    año •Facebook está prestando atención a la versión open source de nuevo •Hay mucha actividad a nivel de incidencias / commits •La versión upstream es una máquina virtual con compilación JIT
  4. Documentación •Muy básica, cercana al código •Normalmente desactualizada •Código poco

    documentado (aunque la calidad del código es buena en general) •Normalmente acaba siendo mejor recurrir al código fuente (incluso para cosas como configurar el servidor)
  5. Migrando: Factores a tener en cuenta •Características de la granja

    de frontales ◦ Coste de mantenimiento (tamaño) ◦ Factores limitantes de la arquitectura •Tamaño del código •Complejidad del código •Cantidad de extensiones de PHP usadas •¿Indeciso? ¡Haz una prueba de concepto!
  6. Migrando: Recursos necesarios •Migración involucra a toda la compañía ◦

    DevOps y Sistemas ▪ Sistema de desarrollo y despliegues ▪ Testeo bajo HipHop ◦ Otros equipos ▪ Cambios de código para conseguir la compatibilidad con HipHop •Equipo encargado de la migración ◦ Conocimiento de bajo nivel (C, C++, red) ◦ Conocimiento de la arquitectura del código ◦ ¡Paciencia!
  7. HipHop @ Tuenti: nuevas extensiones •Implementación de extensión de Memcache

    ◦ Añadido soporte UDP a libmemcached •Implementación parcial de gmagick •Migración de filter, gettext, geoip... •Algunas extensiones internas
  8. HipHop @ Tuenti: otras modificaciones •Última versión de libevent •Mejorado

    el build y creación de paquetes deb •Cientos de fixes en todo el código fuente •Cambiar sistema de traducciones a boost •634 files changed, 35025 insertions(+), 59768 deletions (-)
  9. Problemas encontrados: código •Funciones o parametros sin implementar •Diferencias de

    comportamiento PHP vs HipHop •Acceso a ficheros del repositorio no presentes en la versión compilada •Ficheros de configuración en PHP •Thread-safety en HipHop •Diferencias detectadas en los tests
  10. Problemas encontrados: código •Funciones o parametros sin implementar •Diferencias de

    comportamiento PHP vs HipHop •Acceso a ficheros del repositorio no presentes en la versión compilada •Ficheros de configuración en PHP •Thread-safety en HipHop •Diferencias detectadas en los tests
  11. Problemas encontrados: código •Funciones no implementadas ◦Evitar su uso si

    es posible (y/o aconsejable) ◦Implementación en HipHop •Ejemplos ◦eval ◦class_alias ◦runkit_constant_redefine ◦dynamic defines ◦ftp_* functions ◦extensión filter
  12. Problemas encontrados: código •Diferencias de comportamiento PHP vs HipHop ◦Debug

    del problema ◦Fix en el código de HipHop ◦En ocasiones significa hacer que HipHop se comporte de forma "errónea" ◦A veces debidas a que HipHop es más estricto que PHP
  13. Problemas encontrados: código •Problemas derivados de la naturaleza multithread de

    HipHop ◦Reescritura de extensiones no thread-safe ◦Cambio del sistema de traducciones ◦Problemas de locking ◦Algunas partes de HipHop resultaron no ser thread safe!
  14. Problemas encontrados: código •Diferencias detectadas en los tests ◦Unit e

    Integration ▪ Bastantes problemas detectados ▪ Pocos falsos positivos ▪ Fácil de depurar en unit, no tanto en integration ◦Browser ▪ Casi ningún problema real detectado ▪ Muy díficil de depurar ▪ Muchísimos falsos positivos por las diferencias de tiempos
  15. Problemas encontrados: despliegue •Tiempo de compilación ◦Tiempo inicial de compilación

    del código: 3 horas ◦Tiempo actual: 5 minutos (sin cache) •¿Cómo? ◦Granja de compilación (distcc) ◦ccache (cacheo de compilaciones locales) ◦Clusterización de los fuentes
  16. Problemas encontrados: despliegue •Cambios en todos los entornos ◦Debe de

    usarse HipHop en todas las etapas del desarrollo ◦Tests unit / integration / browser también en HipHop ◦Modo interpretado para las etapas más tempranas del desarrollo (más cómodo, más parecido a PHP) ◦Modo compilado para fases pre-producción
  17. HHVM •Modo compilado e interpretado fusionados en HHVM •Compilación JIT

    o compilado previamente •Paridad con PHP muy mejorada •Importados todos los test de PHP •Posibilidad de usar extensiones de Zend •Carga dinámica de extensiones
  18. Conclusiones •HipHop es un proyecto que demuestra estar probado en

    producción •La ausencia de base de usuarios garantiza problemas •Su implantación mejora la base de código •La implantación previsiblemente requerirá un esfuerzo considerable en tiempo •El debug de los problemas requiere soltura con la toolchain de compilación en linux (gcc / gdb / strace...)