¿Por qué Facebook usó C ++ al lado de PHP? [cerrado]

15

¿Cuál es la razón principal que hizo que Facebook necesitara usar C ++ además de PHP? Me pregunto si creo un sitio web con muchos visitantes. ¿Necesitaría usar C ++ también?

Goma
fuente
Posiblemente para procesos de back-end, pero sería una locura hacer un desarrollo web regular con él.
ChaosPandion
1
La pregunta programmers.stackexchange.com/questions/53624/… también analiza este problema. Es posible que desee echarle un vistazo.
Vitor Py
44
¿Por qué Google escribe sus servidores en C ++?
Trabajo
1
@Job y Java y Python.
derecha el
55
@WTP, que yo sepa, Python se usa con el propósito de crear prototipos de nuevas funciones y probarlas. Una vez que la carga del usuario aumenta y las cosas deben funcionar lo más rápido posible, el código de Python se reemplaza con el código de C ++. Estoy bastante seguro de que la diferencia de velocidad tan pequeña como 1.2 es un gran problema para los servidores que enfrentan cientos de millones de usuarios.
Trabajo

Respuestas:

20

He aquí por qué: HipHop para PHP: muévete rápido :

Uno de los valores clave en Facebook es moverse rápido. Durante los últimos seis años, hemos podido lograr mucho gracias al rápido ritmo de desarrollo que ofrece PHP. Como lenguaje de programación, PHP es simple. Simple de aprender, simple de escribir, simple de leer y simple de depurar. Podemos lograr que los nuevos ingenieros aumenten en Facebook mucho más rápido con PHP que con otros lenguajes, lo que nos permite innovar más rápido.

Hoy estoy emocionado de compartir el proyecto con un pequeño equipo de personas increíbles y he estado trabajando durante los últimos dos años; HipHop para PHP. Con HipHop hemos reducido el uso de CPU en nuestros servidores web en un cincuenta por ciento en promedio, dependiendo de la página. Menos CPU significa menos servidores, lo que significa menos sobrecarga. Este proyecto ha tenido un tremendo impacto en Facebook. Creemos que la Web en general puede beneficiarse de HipHop, por lo que la estamos lanzando como código abierto esta noche con la esperanza de que brinde un nuevo enfoque para escalar grandes sitios web complejos con PHP. Si bien HipHop nos ha mostrado resultados increíbles, ciertamente no está completo y debería sentirse cómodo con el software beta antes de probarlo.

HipHop para PHP no es técnicamente un compilador en sí mismo. Más bien es un transformador de código fuente. HipHop transforma programáticamente su código fuente PHP en C ++ altamente optimizado y luego usa g ++ para compilarlo. HipHop ejecuta el código fuente de una manera semánticamente equivalente y sacrifica algunas características raramente utilizadas, como eval (), a cambio de un mejor rendimiento. HipHop incluye un transformador de código, una reimplementación del sistema de tiempo de ejecución de PHP y una reescritura de muchas extensiones PHP comunes para aprovechar estas optimizaciones de rendimiento.

Escalando PHP como lenguaje de scripting

Las raíces de PHP son las de un lenguaje de secuencias de comandos, como Perl, Python y Ruby, que tienen grandes beneficios en términos de productividad del programador y la capacidad de iterar rápidamente en los productos. Esto se compara con lenguajes compilados más tradicionales como C ++ y lenguajes interpretados como Java. Por otro lado, se sabe que los lenguajes de secuencias de comandos generalmente son menos eficientes cuando se trata del uso de CPU y memoria. Debido a esto, ha sido un desafío escalar Facebook a más de 400 mil millones de visitas a páginas basadas en PHP cada mes.

Una forma común de abordar estas ineficiencias es reescribir las partes más complejas de su aplicación PHP directamente en C ++ como Extensiones PHP. Esto transforma PHP en gran medida en un lenguaje de pegamento entre su front-end HTML y la lógica de la aplicación en C ++. Desde una perspectiva técnica, esto funciona bien, pero reduce drásticamente la cantidad de ingenieros que pueden trabajar en toda su aplicación. Aprender C ++ es solo el primer paso para escribir Extensiones PHP, el segundo es comprender las API de Zend. Dado que nuestro equipo de ingeniería es relativamente pequeño (hay más de un millón de usuarios para cada ingeniero), no podemos permitirnos hacer que partes de nuestra base de código sean menos accesibles que otras.

Escalar Facebook es particularmente desafiante porque casi cada vista de página es un usuario conectado con una experiencia personalizada. Cuando veas tu página de inicio, debemos buscar a todos tus amigos, consultar sus actualizaciones más relevantes (de un servicio personalizado que hemos creado llamado Multifeed), filtrar los resultados según tu configuración de privacidad y luego completar las historias con comentarios. , fotos, me gusta y todos los datos ricos que las personas adoran de Facebook. Todo esto en menos de un segundo. HipHop nos permite escribir la lógica que realiza el ensamblaje final de la página en PHP e iterarla rápidamente mientras se confía en servicios de fondo personalizados en C ++, Erlang, Java o Python para dar servicio a las noticias, la búsqueda, el chat y otras partes principales. del sitio.

Desde 2007, hemos pensado en algunas formas diferentes de resolver estos problemas e incluso hemos intentado implementar algunas de ellas. La sugerencia común es reescribir Facebook en otro idioma, pero dada la complejidad y la velocidad de desarrollo del sitio, esto llevaría algún tiempo. Hemos reescrito aspectos de Zend Engine (componentes internos de PHP) y contribuimos con esos parches al proyecto PHP, pero finalmente no hemos visto el tipo de aumento de rendimiento que se necesita. Los beneficios de HipHop son casi transparentes para nuestra velocidad de desarrollo.

Hackear HipHop

Una noche en un Hackathon hace unos años (ver Prime Time Hack), comencé mi primer código transformando PHP en C ++. Los lenguajes son bastante similares sintácticamente y C ++ supera drásticamente a PHP cuando se trata tanto del uso de la CPU como de la memoria. Incluso el propio PHP está escrito en C. Sabíamos que era imposible reescribir con éxito una base de código completa de este tamaño a mano, pero nos preguntamos qué sucedería si creáramos un sistema para hacerlo mediante programación.

Encontrar nuevas formas de mejorar el rendimiento de PHP no es un concepto nuevo. En tiempo de ejecución, Zend Engine convierte su fuente PHP en códigos de operación que luego se ejecutan a través de la máquina virtual Zend. Los proyectos de código abierto como APC y eAccelerator almacenan en caché este resultado y son utilizados por la mayoría de los sitios web con PHP. También está Zend Server, un producto comercial que hace que PHP sea más rápido a través de la optimización de código de operación y el almacenamiento en caché. En cambio, estábamos pensando en transformar la fuente PHP directamente en C ++, que luego se puede convertir en código de máquina nativo. Incluso compilar PHP no es una idea nueva, los proyectos de código abierto como Roadsend y phc compilan PHP a C, Quercus compila PHP a Java y Phalanger compila PHP a .Net.

No hace falta decir que tomó más tiempo que ese solo Hackathon. Ocho meses después, tuve suficiente código para demostrar que es posible correr más rápido con el código compilado. Rápidamente agregamos Iain Proctor y Minghui Yang al equipo para acelerar el ritmo del proyecto. Pasamos los siguientes diez meses terminando toda la codificación y los siguientes seis meses probando en servidores de producción. Nos enorgullece decir que en este momento, estamos atendiendo más del 90% de nuestro tráfico web utilizando HipHop, todo solo seis meses después de la implementación.

Cómo funciona HipHop

El principal desafío del proyecto fue cerrar la brecha entre PHP y C ++. PHP es un lenguaje de script con escritura dinámica y débil. C ++ es un lenguaje compilado con escritura estática. Si bien PHP le permite escribir características dinámicas mágicas, la mayoría de PHP es relativamente sencillo. Es más probable que veas if (...) {...} else {..}que ver function foo($x) { include $x; }. Aquí es donde ganamos en rendimiento. Siempre que sea posible, nuestro código generado utiliza enlaces estáticos para funciones y variables. También utilizamos la inferencia de tipos para elegir el tipo más específico posible para nuestras variables y así ahorrar memoria.

El proceso de transformación incluye tres pasos principales:

  1. Análisis estático donde recopilamos información sobre quién declara qué y dependencias,
  2. Inferencia de tipos donde elegimos el tipo más específico entre escalares C ++, String, Array, clases, Object y Variant, y
  3. Generación de código que, en su mayor parte, es una correspondencia directa de las declaraciones y expresiones de PHP a las declaraciones y expresiones de C ++.

También hemos desarrollado HPHPi, que es un intérprete experimental diseñado para el desarrollo. Al usar HPHPi no necesita compilar su código fuente PHP antes de ejecutarlo. Nos ayudó a detectar errores en HipHop y proporciona a los ingenieros una forma de usar HipHop sin cambiar la forma en que escriben PHP.

En general, HipHop nos permite mantener los mejores aspectos de PHP mientras aprovechamos los beneficios de rendimiento de C ++. En total, hemos escrito más de 300,000 líneas de código y más de 5,000 pruebas unitarias.

Trinidad
fuente
44
Esta es la respuesta, un poco de color hubiera sido agradable, pero básicamente se reduce al rendimiento. Quieren que su aplicación se escale mejor, pero también tienen gente más experta en PHP y sienten que PHP los hace más productivos. Por lo tanto, la solución permite la simplicidad de PHP con el rendimiento de C. Su código base es demasiado grande para traducirlo manualmente de todos modos.
Cervo
13

Respuesta corta: no, no necesitas C ++.

Creo que te refieres a HipHop . Si lees sobre las mejoras que ofrece, es aproximadamente el 50%. Esto es muy importante si eres Facebook, que tiene miles de servidores frontend. Reducir la carga sobre ellos significa millones en ahorros de costos en centros de datos. En el caso de una compañía que tiene 10-100 servidores frontend, el costo de desarrollo compensaría mucho los posibles ahorros. De todos modos, el procesamiento más pesado se realiza en el back-end, que generalmente es una solución RDBMS o NoSQL, desarrollada como código C / C ++ altamente optimizado.

Por supuesto, podría haber logrado ahorros mucho más altos simplemente volcando PHP por completo. Pero eso no es algo que pueda hacer con una gran base de código, como en el caso de Facebook.

Ahora, para otra parte de la pregunta: si realmente quieres saber cómo lidiar con grandes cargas, lee el blog de Alta Escalabilidad , especialmente la parte de Arquitecturas de la Vida Real.

Es posible con PHP, pero definitivamente no sería mi elección. Si desea un lenguaje dinámico, Python, Ruby o quizás Lua sería una opción mucho mejor.

vartec
fuente
2
+1, pero la escalabilidad prácticamente no tiene nada que ver con el lenguaje utilizado. La arquitectura de la base de datos tiene una influencia mucho mayor.
dan_waterworth
1
@Dan: por eso digo que es posible con PHP.
vartec
2
Según la entrada del blog @Trinidad citada, 50% es la mejora promedio , no la máxima.
Jerry Coffin
2
@Jerry: correcto, pero aún está muy, muy lejos de la diferencia de rendimiento real entre C ++ y PHP.
vartec
6

Lo bueno del enfoque de FB es que no tuvieron que decidir de inmediato. Deberías hacer lo mismo. Elija el idioma que lo haga más productivo, pero asegúrese de que interactúe fácilmente con C / C ++.

Una vez que tenga millones de usuarios y necesite reducir milisegundos los tiempos de respuesta, puede optimizar las rutas críticas utilizando C / C ++.

Roger escaso
fuente
0

El elemento C ++ utilizado por Facebook es el HHVM.

Esa es la máquina virtual HIPHOP. Aunque está escrito en C ++, es esencialmente un "mejor intérprete PHP".

El código php se compila en código de bytes que luego HHVM interpreta en el momento de la ejecución y está sujeto a optimizaciones "Just In Time" a medida que se ejecuta.

Los desarrolladores de Facebook todavía escriben principalmente en PHP, y, lo que ves en tu navegador es casi seguro que lo emite un programa PHP, todo lo cual ha sido compilado e interpretado por el tiempo de ejecución HHVM.

El HHVM real es de código abierto disponible gratuitamente. Entonces, si necesita servir un millón de fotos lindas de gatitos por hora, puede descargar el HHVM y acelerar su servidor con un cambio mínimo en su PHP.

James Anderson
fuente