Hola soy Jordi, me gusta Magento
#magento #ecommerce #webperf 2012
#analytics #cro #seo #sysadmin #webmaster #ux #cloud
#developer 1982 #rod3 #barcelona #aiguafreda #blogger elnostreraco.com/blog
#working einnova.com
#webperf @webperfEs @jrosell @einnova
Magento, líder mundial ecommerce opensource
#webperf @webperfEs @jrosell @einnova
La plataforma Open Source para comercios electrónicos que quieren crecer
#webperf @webperfEs @jrosell @einnova
Prestashop líder en Espanya
Spain is different!
#webperf @webperfEs @jrosell @einnova
Resultados en hosting compartido
Rendimientos por versión con instalación por defectoApache HTTP server benchmarking tool$ ab -k -n 1000 -c 10 <url>
Versión Magento
-Cache -Compiler
+Cache+Compiler
1.4 4,1s 3,1s
1.7 5,4s 3,2s
2.0 - 2,1s
#webperf @webperfEs @jrosell @einnova
Rango de tiempos en la #ux
Velocidad en la experiencia usuario (#ux)· Operación instantánea en 0.1s· Navegación sin interrupción en 1s· Dejan la tarea en 10s· Finalizan la tarea en 1min
Jackob Nielsenuseit.com
#webperf @webperfEs @jrosell @einnova
Usuarios que tengo y que quiero
Horas pico en Google Analyticshttp://j.mp/horas-pico-analytics
VirtualUsers = (hourlyVisits * minTimeOnSite) / 60
Ejemplos:50 visitas/hora de 6 minutos = 5 usuarios concurrentes150 visitas/hora de 4 minutos = 10 usuarios concurrentes1200 visitas/hora de 2 minutos = 40 usuarios concurrentes
#webperf @webperfEs @jrosell @einnova
Arquitectura Magento
No es PHP 4, usa patrones de ingeniera del software
Más de 15k ficheros
Estructura modular extensible, Representación de layout y configuración en XML, Patrón Modelo Vista Controlador, Eventos (Observers), Entidades con atributos y valores (EAV), “Sobreescritura” de plantillas, multi*...
¿Cómo arreglamos esto?
#webperf @webperfEs @jrosell @einnova
Apache 2.2: El jefe
Módulos mínimos, comenta el restomod_expires, mod_deflate, mod_mime, mod_dir, mod_rewrite, mod_authz_host, mod_authz_user
MinSpareServers en Prefork MPMReserva tantos procesos como usuarios concurrentesAprox 30M por proceso, deja RAM para BBDD
Otras configuracionesKeepalive, mod_disk_cache, full page cache, nginx, Amazon S3...
#webperf @webperfEs @jrosell @einnova
PHP: El botleneck
; ajustar para adminmax_execution_time = 300
; defaultmemory_limit = 128M
; mas que numero de ficherosrealpath_cache_size=32k
; tiempo actualización 5hrealpath_cache_ttl=72000
; menos verificacionesopen_basedir = Off
Usa pdo_mysql, puedes deshabilitar;;;extension=mysqli.so;;;extension=mysql.so
También;;;extension=dbase.so;;;extension=json.so;;;extension=pdo_sqlite.so;;;extension=sqlite.so;;;extension=wddx.so;;;extension=xmlreader.so;;;extension=xmlwriter.so;;;extension=xsl.so;;;extension=zip.so
#webperf @webperfEs @jrosell @einnova
APC: El Acelerador
extension=apc.so; Ajustar con el monitor de APCapc.shm_size=256; Sin verificar tiempo modificaciónapc.stat = 0 ; Ficheros a incluirapc.num_files_hint=10000apc.user_entries_hint=10000apc.max_file_size=5M
Caché de código PHPEl interprete PHP compila el código y APC lo guarda en caché.
¿APC cómo fast caché?app/etc/local.xml<config><global>... <cache> <backend>apc</backend> <prefix>MAGEAPC</prefix> </cache>...</config></global>
#webperf @webperfEs @jrosell @einnova
Two level cache
#webperf @webperfEs @jrosell @einnova
Memcached: Cache rápida y distribuida
Fast cache con memcached y ficheros cómo slow_cache<config><global><cache><backend>memcached</backend><memcached><servers><server1> <host><![CDATA[127.0.0.1]]></host>
<port><![CDATA[11211]]></port><persistent><![CDATA[1]]></persistent><weight><![CDATA[2]]></weight> <timeout><!
[CDATA[10]]></timeout><retry_interval><![CDATA[10]]></retry_interval><status><![CDATA[]]></status></server1>...</servers></memcached></cache></global></config>
Gestión de sesiones distribuido cuando usamos más de un servidor<session_save><![CDATA[memcache]]></session_save><session_save_path><![CDATA[tcp://127.0.0.1:11211?persistent=1&weight;=2&timeout;=10&retry;_interval=10]]></session_save_path>
#webperf @webperfEs @jrosell @einnova
Ajustes MySql
innodb_buffer_pool_size 80% de la memoria libre (MaxClients)innodb_thread_concurrency (2 * [numberofCPUs] + 2)thread_cache_size innodb_thread_concurrency / 2max_connections relacionado MaxClients, mirar 'status'table_cache En Magento serian suficiente 1000 tablas abiertasquery_cache_size, sort_buffer_size, join_buffer_size innodb_autoextend_increment fijar tamaño datafile suficiente
Ejemplos de configuraciones MySql: http://j.mp/mysql-config
#webperf @webperfEs @jrosell @einnova
Monitorizar Apache, Cache, MySql
MySqlmysqltuner, innotop y 'mysql> show status;'
Memcached$ telnet 127.0.0.1 11211….stats… <conexiones, estadísticas, etc>quit
APChttp://pecl.php.net/package/APCapc.php
Apache workers<Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from 127.0.0.1</Location>
#webperf @webperfEs @jrosell @einnova
Pruebas en un servidor Amazon EC2
Prueba configuraciones Magento 1.7 (m1.large)Apache HTTP server benchmarking tool$ ab -k -n 1000 -c <usuarios> <url>
-APC +APC Compiler APC Cache Memcache
2,7s 1,6s 1,5s 1,8s 1,7s
#webperf @webperfEs @jrosell @einnova
Resultados Memcached en Amazon EC2
Memcache con 1 instancia m1.largePrueba con http://www.webpagetest.org
Resultados:- Primer byte recibido 0.526s- Inicio render 1.588s- Tiempo de carga 3.003s
#webperf @webperfEs @jrosell @einnova
Posibles mejoras infraestructura
- Separación de media, skin, js e integración AWS S3 o FTP- Cache de un sólo nivel con redis (cache_tags)- Magento Enterprise con Full Page Cache y Archives (x2)- Full Page Cache de Varnish para Magento CE 1.7 (y ESI tags)- Integrar la búsqueda de Solr en caso de muchos productos- Escalar con otra instancia de magento (x2)- Una BBDD para escritura y otra/s de lectura (tiempo replica)
#webperf @webperfEs @jrosell @einnova
Waterfall
#webperf @webperfEs @jrosell @einnova
Desarrollo
Las themes de Magento estan diseñadas para mostrar todas las funcionalidades, personaliza para mejoralo
Entorno de Desarrollo Eclipse IDE. En windows usa Zend Server (Zend Optimizer+)herramientas Configviewer y Layoutviewer (AlanStorm)
Debug: Mage::log
Testing: PHPUnit o scripts propios.
#webperf @webperfEs @jrosell @einnova
Desarrollo: Personalización en Magento
1. Módulos en app/etc/modules
2. Configuraciones y tabla core_config_data
3. Ajustes de layout.xml y ficheros .phtml
4. Módulo personalizado
#webperf @webperfEs @jrosell @einnova
Desarrollo: Configuraciones
Deshabilita modulos desde app/etc/modulesLos carga igual si sólo desactivas desde “Configuration > Advanced”
AtributosFlat Frontend Catalog: EAVLayered Navigation en búsquedas
Y el curioso caso de Merge CSS y JS...Descargas en paralelo y payloads
#webperf @webperfEs @jrosell @einnova
Desarrollo: Template Fallback
/app/design/frontend/base/default (también iphone y modern)/app/design/frontend/default/default (también iphone y modern)/app/design/frontend/tuiweb/default (una copia base)/app/design/frontend/tuweb/tuweb (aspecto de tu web)/app/design/frontend/tuweb/tuweb-1 (variante de tu web)/skin/frontend/...
Crear pack tuweb con plantilla por defecto de Magento y añades una carpeta tuweb sólo con ficheros modificados
Variantes para páginas, productos concretos, tests A/B, etc
#webperf @webperfEs @jrosell @einnova
Desarrollo: Layout y templates
En vez de eliminar y añadir se puede quitar e insertar<reference name=”parent1.name”>
<remove name=”eliminar.no.necesario” /><action method=”unsetChild”>
<name>mover.sin.eliminar</name></action></reference><reference name=”parent2.nameleft”>
<action method=”insert”><name>mover.sin.eliminar</name><sibling>bloque.anterior</sibling></action>
</reference>
Añadir templates y bloques<block name=”anadir.tmpl” type=”core/template” template=”anadir/tmpl.phtml”/><block name=”anadir.item” type=”modulo/item” template=”anadir/item.phtml”/>
#webperf @webperfEs @jrosell @einnova
Desarrollo: Módulos y override de classes
En vez de copiar ficheros en app/code/local usa rewrite de Blocks, Helpers y Modulos.
<config><global><blocks><checkout><rewrite>
<onpage_success>Jrosell_Checkout_Block_Sucess<onpage_success></rewrite><checkout></blocks></global></config>
class Jrosell_Checkout_Block_Sucess extends Mage_Checkout_Block_Sucess{
function metodo(){ Mage::log(...);return parent::metodo();
}}
#webperf @webperfEs @jrosell @einnova
Magento 2 y mejoras performance
Objetivos del equipo de desarrollo de Magento 2
-Cualquier versión deberá rendir mejor que la anterior-El número de módulos no deberá influir en el rendimiento-Herramientas para el análisis del rendimiento de escenarios-Ejecución en hostings compartidos y VPS-Poder usar varias instancias en un único código-APIS de módulos en JSON/SOAP/XM (SaaS)-Soporte para Oracle, Postgre SQL y MS SQL-Los que usan jQuery se podrán olvidar de prototype.-Extra: OWASP Top 10 Web Vulnerabilities
#webperf @webperfEs @jrosell @einnova
Muchas gracias
Abran juego, abran juego...
#webperf @webperfEs @jrosell @einnova