PHP Barcelona Conference 2010 - Scaling Magento

3,366 views
3,272 views

Published on

Conference by Fernando Palomo , http://www.bluejaylabs.com

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,366
On SlideShare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
79
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

PHP Barcelona Conference 2010 - Scaling Magento

  1. 1. PHP Barcelona Conference 2010 SCALING MAGENTO Fernando Palomo García fernando@bluejaylabs.com
  2. 2. LO SIENTO NO EXISTE UN BOTON ”TURBO” EN MAGENTO
  3. 3. ÍNDICE ● Benchmarking: medir las mejoras ● Profiling: localizando el cuello de botella ● Monitoring: debemos ampliar la plataforma? ● Infrastructuras e-commerce ● Tunning de Servidores: Apache,PHP,MySQL ● Configuración de Magento ● Desarrollando Magento: consejos y eventos asíncronos ● Benchmarks!
  4. 4. Benchmarking ● Asume que nunca superarás ciertos límites: ● Los que marca el framework ● Otros: FS, BD, HTTP, Parsing, Regex... ● Optimizar código PHP vs Optimizar esos cuellos de botella externos ● Benchmark antes de lanzar el Site: conoce los límites de tu infrastructura
  5. 5. Benchmarking ● Qué medir? ● Tiempo de carga de página completa ● Tiempo de ejecución PHP: Conexiones cocurrentes Vs Tiempo de respuesta => Peticiones por segundo ● Magento: Pedidos por hora, páginas cms, product/list product/view
  6. 6. Benchmarking ● Cómo medir? ● Carga de Página: – Firebug for Firefox (Network Tab): Tamaño de página, elementos... ● https://addons.mozilla.org/es-es/firefox/addon/1843/ – Yslow for Firefox: Recomendaciones y estadísticas ● http://developer.yahoo.com/yslow/ – Google Chrome developer toolbar – Httperf con uso de sesiones ● Tests de Stress – Siege http://www.joedog.org/index/siege-home – Httperf http://www.hpl.hp.com/research/linux/httperf/docs.php
  7. 7. Benchmarking ● Consejos: ● Usar Tráfico real Vs carga sintética de magento: – Cms – Category/view – Product/view – Add to Cart / Confirm ● Benchmark dry-run antes del benchmark real: cache ● Eliminar ”Ruido”: Bandwidth del enlace, Cronjobs, Backups, tráfico real...
  8. 8. Benchmarking ● App server benchmark ● httperf --hog --server www.bluejaylabs.com --uri=/index.php --port 80 --timeout 5 --num- conns=5 –rate=10 ● Full Page benchmark: ● httperf --server www.bluejaylabs.com --port 80 --timeout 5 --wsesslog=100,0,httperf.test1 --ra 5
  9. 9. Profiling ● Encontrar cuellos de botella. Herramientas: ● Magento profiler. Simple, pero útil ● Xdebug, es un debugger en realidad ● XHProf, by facebook http://pecl.php.net/package/xhprof – Mage_log! http://localhost/index.php?run=4cbf18f9144c8&source=xhprof_foo – Parse XML http://localhost/index.php?run=4cbf23819e758&source=xhprof_foo ● XHProf no es demasiado pesado para ejecutarlo en live, pero con cuidado!
  10. 10. Monitoring ● Qué monitorizamos? En general: ● Tráfico de red (interfaz interna y externa): – Límite contratado – Límite de NIC – Network Outages , lost packages ● CPU: No debería haber un Server Load > 3 ● Memory: Nunca tocar swap ● Disk I/O: – Límite de velocidad de lectura? Disco más rapidos || RAID 1 – I/O Errors
  11. 11. Monitoring ● Web server ● Minimizar acceso a disco, php en APC ● Apache Max Threads Vs Current Threads ● Tiempo de carga de página (header) ● Db Server ● MySQL Threads Vs MySQL Max Connections ● MySQL Slow Queries ● MySQL Error log ● MySQL Slave Status ( si replicación ) ● opened_tables,opened_files,aborted_clients
  12. 12. Monitoring ● Herramientas: ● Nagios + munin (Monitorización y alerta) – Http://www.nagios.org – http://munin-monitoring.org/ ● Monit http://mmonit.com/monit/screenshots/ (Monitorización) ● Cacti (Monitorización) http://www.cacti.net/ ● Zabbix (Monitorización, gráficas amigables) http://www.zabbix.com/ ● Site Uptime monitoring: – Http://pingdom.com , http://www.host-tracker.com
  13. 13. Infrastructuras e-commerce ● Plataforma e-commerce partida en funcionalidades ● Al escalar debemos usar la mejor herramienta para cada necesidad, no hay una herramienta buena para todo ● División clara desde el principio para poder crecer ● Compromiso entre Alta Disponibilidad y Rendimiento: Virtualización Vs Servicios Físicos
  14. 14. Infrastructuras e-commerce
  15. 15. Infrastructuras e-commerce ● E-commerce es solo un elemento de una plataforma más grande ● Internamente SOA: Common Intercommunication Bus ● Servicio: Cada función independiente que por definición no depende del contexto o estado del resto de componentes para su ejecución
  16. 16. E-commerce ERP Business Intelligence Customer Support3rd Party Logistics / Manufacturing CIB
  17. 17. Tunning de Servidores ● Afinando Apache ● Apache threads , Apache keepalive ● Deshabilita los módulos que no uses (mod_ssl?) ● Módulos: – mod_expires: fecha de expiración lejana (ejemplo) – mod_gzip ó mod_deflate para contenido comprimible (css / html / js / doc …) – Configura FileETag ● Identifica en tus logs al cliente que hizo la petición, y al servidor que la respondió ● Facebook's Scribe http://github.com/facebook/scribe
  18. 18. Tunning de Servidores ● SSL en el Balanceador: Ojo , monitorizar carga ● AllowOverride None: Deshabilita .htaccess ● FileSystem: noatime (tambien para MySQL), tmpfs? ● APC opcode cache ● Refresca APC en tu script de deployment!
  19. 19. Tunning de Servidores Gráfica extraida de ”Magento enteprise edition White Paper”
  20. 20. Tunning de Servidores ● php.ini ● Minimiza y ordena tu ”include_path” ● realpath_cache_size > 512K (fuera open_basedir!) ● realpath_cache_ttl > 86400 ● E_NOTICE , display_errors, error_log ● Configurar Memcache redundancy ● Sesiones replicadas ● Datos replicados ● pecl php-memcache > 3.0.2
  21. 21. Tunning de Servidores Gráfica extraida de ”Magento Enterprise Edition White Paper”
  22. 22. Tunning de Servidores ● Reverse Proxy delante de los frontales, cacheando contenido estático ● Squid http://www.squid-cache.org/ ● Varnish http://www.varnish-cache.org/ ● Servidor de contenido estático (js/css/cdn) ● Lighttpd http://www.lighttpd.net/ ● Nginx http://nginx.org/ ● Administración de granjas: Puppet http://www.puppetlabs.com
  23. 23. Tunning de Servidores ● MySQL Alta Disponibilidad White Paper http://www.mysql.com/products/enterprise/high_availability.html ● MySQL Tunning: (consejo: http://mysqltuner.pl) ● sort_buffer_size = 8M # per connection ● table_cache || table_open_cache > Tablas de magento ● read_buffer_size = # solo para myisam , por conexion ● binlog_cache_size = # log cache para las hebras, cache de transacciones ● innodb_thread_concurrency = 2 * [numberofCPUs] + 2 ● read_rnd_buffer_size = # por conexion ● tmp_table_size = 32M # tablas en memoria, el menor de éste y el siguiente, ajuste dinámico ● max_heap_table_size = 32M # tablas en memoria , ajustar dinamicamente ● innodb_buffer_pool_size = Memory*3/4 # this is the most important parameter for innodb ● join_buffer_size = 8M # enable more space for joins without index ● innodb_file_per_table = 1 # 1 archivo por cada tabla, nada de fichero gigante
  24. 24. Tunning de Servidores MySQL Performance ● 0.- Descarga una versión compilada por intel (intel c++ compiler) o compila MySQL tú mismo ● 1.- Indexes: Afina el uso con ”explain” y minimiza el tamaño ● 2.- Usar MySQL Partitioning ● 3.- Sharding (experimental) – Spider engine http://forge.mysql.com/wiki/The_Spider_Storage_Engine – Spockproxy http://forge.mysql.com/projects/project.php?id=275 – HiveDB http://www.hivedb.org/
  25. 25. Configuración de Magento ● Habilita todas las cachés ● Habilita el Flat Catalog ● Deshabilita el módulo Mage_Log ● No uses Layered Navigation si no lo necesitas ● Habilita la combinación de CSS y JS en un único archivo ● No llenes los logs en live con Mage::log innecesarios
  26. 26. Configuración de Magento ● app/etc/local.xml ● <cache> magento cluster – Usar fast and slow backend para fallback en db ● Index management: manual update , reindexación controlada ● Rotate system.log! ● Apache Hadoop http://hadoop.apache.org/ para media/ ,var/export ,var/report ● Facebook's Scribe para Magento system.log?
  27. 27. Desarrollando Magento ● En general: ● Haz una página ligera y cacheable: – No uses varios Frameworks JS – CSS y JavaScript fuera del HTML – Intenta no hacer un DOM gigante – Todo lo que no sea imprescindible para visualizar tu página: al final (ajax?) – Javascript orientado a eventos – http://developer.yahoo.com/yui/ Yahoo! YUI library
  28. 28. Desarrollando Magento ● Siempre Actualiza a la última versión ● Releases 1.4.0.X – Optimized performance of search indexer – Optimized performance of sales reports, added new sales report types – Added ability to define arbitrary cache backends – Improved javascript files merging, added CSS files merging – Optimized cache initialization during startup – Flattened store_to_base_rate, store_to_order_rate, base_to_global_rate, base_to_order_rate order atttibutes – Added completely new Indexing functionality (and performance improvements) – Optimized export from grids in admin area – Improved customer id validation (run 1 query per request instead N) in customer session – Optimized EAV Entity Save performance (1 insert of multiple rows instead of multiple inserts into the same table)
  29. 29. Desarrollando Magento ● Release 1.4.1.X – Sales module database structure changed from EAV into flat tables – Reviewed logic of the sales reports: Orders, Tax, Invoiced, Shipping, Refunds, Coupons – Reimplemented bestsellers report – Optimized search reindex process
  30. 30. Desarrollando Magento ● Cachear Bloques
  31. 31. Desarrollando Magento ● Usar Magento Collections , Evitar Lanzar query a la BD directamente. Evitar SELECT * ● Al recorrer bucles, cargar todos los datos necesarios con la colección, evita cargar objetos en los bucles ● Usa observers, no extiendas la clase: no intrusivo ● Si hay 2 métodos, probablemente 1 es más rapido que el otro
  32. 32. Desarrollando Magento ● Podemos sacar elementos de la ejecución para hacer una aplicación más ágil ● RabbitMQ http://www.rabbitmq.com/ ● Gearman http://gearman.org/ ● Amazon SNS / SQS http://aws.amazon.com/ ● Sistema propio Basado en Magento y cronjobs
  33. 33. Desarrollando Magento Event: product_save Refrescar Imagen Refrescar Cache ... Notificar Clientes
  34. 34. Desarrollando Magento Event: sales_order_place_after Actualizar Credito Cliente Actualizar Stock ... E-Mail confirmación Procesar Detección de Fraude
  35. 35. Desarrollando Magento ● Búsquedas Full Text en Magento: ● Apache SOLR (incluido en enterprise) http://lucene.apache.org/solr/ ● SPHINX http://sphinxsearch.com/ ● 3rd party search providers http://www.fact-finder.es/ ● Full Page Cache: ● Incluido en Magento Enterprise ● Desarrollandolo tú mismo: Extendiendo el modelo Cache, generando un crawler. ● Genera HTML plano y carga las partes dinámicas con AJAX
  36. 36. Desarrollando Magento ● NoSQL para módulos donde no es necesaria und BD Relacional ● Apache CouchDB http://couchdb.apache.org/ ● MongoDB http://www.mongodb.org/ ● Apache Hadoop http://hadoop.apache.org/ ● Ejemplos: ● X% de usuarios q visitaron este producto compraron ● Y% de usuarios que compraron este producto compraron también … ● Logs, Listas de correo...
  37. 37. Hagamos un benchmark! ● Basado en Amazon Web Services ● Cargamos paso a paso las mejoras y vamos midiendo ● Cambios en Apache + php.ini ● Cambios en MySQL ● Añadiendo Varnish ● Añadiendo un nuevo frontend
  38. 38. Gracias! Q & A?For Samples or questions, fernando@bluejaylabs.com

×