47
20-22 junio 2013 Madrid ESCALABILIDAD Y ALTO RENDIMIENTO CON SYMFONY2 Ricard Clau de Symfony

Escalabilidad y alto rendimiento con Symfony2

Embed Size (px)

DESCRIPTION

En esta charla se pretenden tocar todas las cosas que debemos tener en cuenta para sacar el máximo rendimiento y poder escalar usando Symfony2. Se toca desde parámetros de configuración de PHP y APC, optimización de Composer, dónde optimizar, quick wins varios, cómo hacer profiling correctamente, BBDD NoSQL vs SQL y por supuesto lecciones aprendidas en mis anteriores trabajos

Citation preview

Page 1: Escalabilidad y alto rendimiento con Symfony2

20-22 junio 2013 Madrid

ESCALABILIDAD Y ALTO RENDIMIENTO CON SYMFONY2Ricard Clau

deSymfony

Page 2: Escalabilidad y alto rendimiento con Symfony2

¡muchas gracias a nuestros patrocinadores!

deSymfony

Page 3: Escalabilidad y alto rendimiento con Symfony2

RICARD CLAUTwitter @ricardclau / Gmail [email protected]

Emigrante en LondresA veces doy charlas

Y de vez en cuando me aceptan PR en Github

Page 4: Escalabilidad y alto rendimiento con Symfony2

VAMOS A HABLAR DE...

• Performance y escalabilidad

• Profiling y optimización

• Storage: SQL vs NoSQL

• ¡Basado en hechos reales!

• Casi todo sirve también en entornos sin Symfony2

• Symfony2 es suficientemente rápido. ¡De verdad!

Page 5: Escalabilidad y alto rendimiento con Symfony2

CONCEPTOSEscalabilidad, Disponibilidad, Balanceo, Sharding

Millones de Usuarios en

todo el mundo24x7x365

Page 6: Escalabilidad y alto rendimiento con Symfony2

ESCALANDO¿Qué modelo creéis que es mejor y más sostenible?

Page 7: Escalabilidad y alto rendimiento con Symfony2

DISPONIBLES 24X7X365Debemos podernos levantar rápido de cualquier problema

Page 8: Escalabilidad y alto rendimiento con Symfony2

BALANCEO DE CARGAPermite hacer cambios sin dejar de dar servicio

Page 9: Escalabilidad y alto rendimiento con Symfony2

SHARDINGLlega un momento en que hay que hacerlo...

¡Y puede ser muy doloroso!

Page 10: Escalabilidad y alto rendimiento con Symfony2

NO NOS PRECIPITEMOS...

• Evitad optimizaciones prematuras

• Las microoptimizaciones no sirven para nada

• Foco a cosas de impacto

• Mejoras incrementales

• Si no se factura, no sirve de nada

Page 11: Escalabilidad y alto rendimiento con Symfony2

NI ESPEREMOS AL DESASTRE...

• Monitorizad servidores: Ram, CPUs, Disco, red, procesos idle...

• Intentad implicar a negocio

• Cuando algo esté a la mitad de su capacidad, preparad plan B

• Morir de éxito es fatal

Page 12: Escalabilidad y alto rendimiento con Symfony2

MANOS A LA OBRA¿Por dónde empezamos?

Page 13: Escalabilidad y alto rendimiento con Symfony2

CUIDAD EL FRONTENDMinimizad las peticiones y su tamaño

Page 14: Escalabilidad y alto rendimiento con Symfony2

COSAS FÁCILES DE APLICAR

• La request más rápida es la que no se hace

• Iconos en base64 dentro del CSS

• CSS y JS minificados, imágenes con jpegoptim, pngcrush, ...

• Usad cabeceras HTTP para poder cachear

• La latencia de red importa más de lo que parece

• Se puede ganar muchísimo en experiencia de usuario

Page 15: Escalabilidad y alto rendimiento con Symfony2

ESCALANDO PHPFacebook, Wikipedia, WordPress, YouPorn, ...

Softonic, Emagister, Privalia, LetsBonus, SocialPoint, Tuenti, ...

Page 16: Escalabilidad y alto rendimiento con Symfony2

¿ESCALAR ES FÁCIL?

• PHP bootstrapea todo en cada Request, y escalar es tan fácil como añadir máquinas tras un Load Balancer

• Pero eso provoca peor rendimiento que otros lenguajes

• Hay cosas a compartir como las sesiones o el storage pero frameworks como Symfony nos lo ponen muy fácil

• Es una tecnología probada por sitios MUY grandes

• Los primeros problemas suelen estar en las BBDD

Page 17: Escalabilidad y alto rendimiento con Symfony2

VIDA MÁS ALLA DE LAMP

• Servidores web ligeros para los assets

• Usad reverse proxy cache como Varnish si podéis cachear páginas (o trozos, con ESI) durante un cierto tiempo

• Cachead todo lo que podáis (APC, Memcached, Redis, ...). Caché 10 segundos -> ¡ Sólo 6 peticiones por minuto!

• MySQL aguanta MUCHO. Pero hay problemas que se solucionan mejor con bases de datos NoSQL

Page 18: Escalabilidad y alto rendimiento con Symfony2

PERFORMANCE PHPOpcode caches, composer, quick wins

Actualizar a PHP5.4 acelerará un 15-30%

Page 19: Escalabilidad y alto rendimiento con Symfony2

APC: NUESTRO MEJOR AMIGO

• Si no sabes qué es, nunca te has preocupado del rendimiento

• apc.stat -> Off (Apache reload para ver cambios)

• apc.serializer -> igbinary (compact_strings a Off)

• apc.shm_size -> Ajustar a las necesidades

• apc.write_lock -> Evita problemas con caches frías

• Revisad http://www.php.net/manual/en/apc.configuration.php

Page 20: Escalabilidad y alto rendimiento con Symfony2

ESTADO DE APChttp://svn.php.net/viewvc/pecl/apc/trunk/apc.php?view=markup

Page 21: Escalabilidad y alto rendimiento con Symfony2

ZEND OPCACHE

• Será incluido en distribución estándar de PHP5.5 (válido desde 5.2) y se evitarán problemas como PHP5.4+APC

• Mejor rendimiento que APC en todos los tests

• README https://github.com/zendtech/ZendOptimizerPlus

• APC Cache + Upload Hooks seguirán existiendo en APCU (https://github.com/krakjoe/apcu)

• En @EmagisterTech lo tienen en producción hace meses :)

Page 22: Escalabilidad y alto rendimiento con Symfony2

ESTADO DE OPCACHERasmus en estado puro :)

(https://github.com/rlerdorf/opcache-status)

Page 23: Escalabilidad y alto rendimiento con Symfony2

COMPOSER AUTOLOAD

• Usáis todos Composer, ¿no?

• Autoload costoso ya que se suele acceder mucho al FileSystem

• composer.phar install --optimize-autoloader (-o) genera ClassMap

• Mismo rendimiento con apc.stat a Off que ApcUniversalClassLoader y muchas menos claves en APC!

Page 26: Escalabilidad y alto rendimiento con Symfony2

EXPRIMIENDO SYMFONY2

• Con Apache, app/console router :dump-apache

• SwiftMailer pesa bastante, intentad delegarlo a daemons

• Si podéis, usad SubRequests con ESI y Varnish

• Probad la extensión de Twig

• Podéis implementar incluso un Cache Warmer

Page 27: Escalabilidad y alto rendimiento con Symfony2

PROFILINGDiagnosticando cuellos de botella

Page 28: Escalabilidad y alto rendimiento con Symfony2

HERRAMIENTAS PROFILING

• ¿Cuánto tiempo dedicáis a hacer profiling?

• Existen xDebug (Derick Rethans) y XHProf (Facebook)

• Es muy conveniente tener alguna (o ambas) instaladas en producción y poderlas activar unos minutos

• En local también podemos ver muchas cosas

• Algunas cosas sólo pueden reproducirse con tráfico real

Page 29: Escalabilidad y alto rendimiento con Symfony2

XHPROF (DEV VS PROD)https://github.com/jonaswouters/XhprofBundle

Page 30: Escalabilidad y alto rendimiento con Symfony2

HELLO WORLD PHP y los frameworks...

Y las comparativas entre cosas que no tienen nada que ver

Page 31: Escalabilidad y alto rendimiento con Symfony2

¿FRAMEWORKS == LENTOS?

• Existe la creencia de que un framework propio escrito desde 0 será mucho mejor que coger uno existente

• También que los frameworks grandes consumen mucho. (ZF1 y Symfony2 funcionan con memory_limit 32M)

• Si ese es realmente tu problema, PHP tampoco es la solución

• ¡No os fiéis de los Hello World Performance Tests!

• ¡Nadie sabe más que la inteligencia colectiva!

Page 32: Escalabilidad y alto rendimiento con Symfony2

TECHEMPOWER BENCHMARK

• Symfony2 queda mal clasificado

• La comparación con otros FW PHP es algo injusta. Se cargan muchas cosas innecesarias (PR#229 de @beberlei) Hay incoherencias (frameworks PHP >> PHP)

• PHP nunca será más rápido que un lenguaje compilado

• Un buen acceso a los datos y cachear igualan las cosas

• Está en el roadmap intentar optimizar performance

Page 33: Escalabilidad y alto rendimiento con Symfony2

GUARDANDO DATOSUsa la herramienta correcta para el trabajo

Ninguno soluciona todos los problemas

Page 34: Escalabilidad y alto rendimiento con Symfony2

BBDD RELACIONALES

• Tecnologías maduras y buena performance

• Transacciones: Atomicidad, Consistencia, aIslamieto, Durabilidad

• Podemos usarlas como NOSQLs clave-valor usando campos BLOB con objetos serializados en el interior

• Soportan integridad referencial, Joins, querys complejas

• Millones de registros sin problemas

Page 35: Escalabilidad y alto rendimiento con Symfony2

SOLUCIONES NOSQL

• Soluciones a algunos problemas concretos

• Teorema CAP (Consistencia, Disponibilidad, Tolerancia a particionamiento). Solo se pueden tener 2.

• Inmadurez en muchas de ellas. Problemas escalando.

• ¿Big Data? 100 millones de registros NO lo es.

• Redis, Cassandra, Riak y Solr funcionan muy bien

Page 36: Escalabilidad y alto rendimiento con Symfony2

SISTEMAS DE COLASCasi nada tiene por qué ser REAL-TIME

Page 37: Escalabilidad y alto rendimiento con Symfony2

¿REAL-TIME? ¿ES NECESARIO?

• Intentad delegar todo lo que podáis a procesos en lote

• Ejemplos: Envío de mails, peticiones a APIs externas, redimensionado de imágenes, estadísticas, ...

• El 99% de estadísticas no hace falta que sean real-time

• ¡60 segundos de decalaje es real-time a todos los efectos!

• ¡Podemos usar varios lenguajes para maximizar rendimiento!

Page 38: Escalabilidad y alto rendimiento con Symfony2

PHP A VECES NO BASTAO no es la mejor herramienta para lo que necesitamos

Page 39: Escalabilidad y alto rendimiento con Symfony2

ESCENARIOS MALOS PHP

• Aplicaciones con daemons CLI corriendo 24x7

• Cálculos matemáticos, procesados masivos de datos, concursos de programación

• Escenarios de alta concurrencia de usuarios con peticiones no cacheables

• Threading, Forking

Page 40: Escalabilidad y alto rendimiento con Symfony2

LOOKING BEYOND PHP

• El futuro es la interacción continua cliente-servidor.

• JavaScript será el rey en cliente

• En el servidor, Erlang y Go cada vez tienen más presencia y está por ver la evolución de Node.JS

• Y siempre seguirán siendo necesarios lenguajes compilados como Go, C, C++ o Java para algunas cosas

• ¡Aprender otros lenguajes nos hace mejores!

Page 41: Escalabilidad y alto rendimiento con Symfony2

EL VIRUS ERLANG

• Es muy diferente a PHP. Además es divertido

• Problemas complejos solucionados hace más de 20 años por ingenieros de Ericsson

• Creemos que el futuro de Internet pasa por un uso masivo de Erlang en todas partes

• No os perdáis la charla de Jordi Llonch y Marcos Quesada en unos instantes!

Page 42: Escalabilidad y alto rendimiento con Symfony2

SYMFONY2Es suficientemente rápido para lo que quieres hacer

Page 43: Escalabilidad y alto rendimiento con Symfony2

¿POR QUÉ ELEGIR SYMFONY2?

• Symfony2 NO es el framework más rápido para Hello World pero es muy rápido para APIs y aplicaciones web

• Usar un framework tan grande es bueno, porque permite probar cualquier tecnología en 5 minutos

• Crear tu framework tiene costes y riesgos muy elevados!

• Tiene un roadmap de releases LTS, proyectos grandes en producción y una comunidad, madurez, número de bundles, y estabilidad envidiable

Page 44: Escalabilidad y alto rendimiento con Symfony2

DRAGONCITY: NÚMEROS

• ~7 millones de usuarios diarios (Facebook + iOS)

• ~300 millones de usuarios registrados

• Cientos de millones de registros diarios para analítica

• MySQL (32x2 + Analytics), Redis (~30), Cassandra (3)

• Las requests son tu partida -> No se puede cachear

• Y sí, casi todo el código es Symfony2! :)

Page 45: Escalabilidad y alto rendimiento con Symfony2

POWERED BY SYMFONY2Y creciendo...

Page 46: Escalabilidad y alto rendimiento con Symfony2

CONCLUSIONES

• PHP y Symfony2 sirve para la mayoría de proyectos

• La estrategia de caching nos ayudará

• Podemos mejorar el rendimiento con buen profiling

• La BBDD suele ser el primer cuello de botella al escalar

• Un buen diseño de arquitectura es lo más importante

• PHP no es la mejor solución para algunos problemas

Page 47: Escalabilidad y alto rendimiento con Symfony2

¿PREGUNTAS?

• Twitter: @ricardclau

• E-mail: [email protected]

• Github: https://github.com/ricardclau

• Blog de PHP y Symfony2: http://www.ricardclau.com

• Por favor, comentad en http://joind.in/talk/view/8845