Rendimiento de Magento
Magento y Cloud
APC y Memcached
Combinación JS y CSS
Ineficiencia en módulos
Configuración de infraestructura
Uso de caché
Eliminar consultas innecesarias
Cuellos de botella con xhprof
4. La plataforma Open Source para comercios
electrónicos que quieren crecer
#webperf @webperfEs @jrosell @einnova
5. Prestashop líder en Espanya
Spain is different!
#webperf @webperfEs @jrosell @einnova
6. Resultados en hosting compartido
Rendimientos por versión con instalación por defecto
Apache HTTP server benchmarking tool
$ ab -k -n 1000 -c 10 <url>
Versión -Cache +Cache
Magento -Compiler +Compiler
1.4 4,1s 3,1s
1.7 5,4s 3,2s
2.0 - 2,1s
#webperf @webperfEs @jrosell @einnova
7. 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 Jackob Nielsen
· Finalizan la tarea en 1min useit.com
#webperf @webperfEs @jrosell @einnova
8. Usuarios que tengo y que quiero
Horas pico en Google Analytics
http://j.mp/horas-pico-analytics
VirtualUsers = (hourlyVisits * minTimeOnSite) / 60
Ejemplos:
50 visitas/hora de 6 minutos = 5 usuarios concurrentes
150 visitas/hora de 4 minutos = 10 usuarios concurrentes
1200 visitas/hora de 2 minutos = 40 usuarios concurrentes
#webperf @webperfEs @jrosell @einnova
9. 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
10. Apache 2.2: El jefe
Módulos mínimos, comenta el resto
mod_expires, mod_deflate, mod_mime, mod_dir,
mod_rewrite, mod_authz_host, mod_authz_user
MinSpareServers en Prefork MPM
Reserva tantos procesos como usuarios concurrentes
Aprox 30M por proceso, deja RAM para BBDD
Otras configuraciones
Keepalive, mod_disk_cache, full page cache, nginx,
Amazon S3...
#webperf @webperfEs @jrosell @einnova
11. PHP: El botleneck
; ajustar para admin
max_execution_time = 300 Usa pdo_mysql, puedes deshabilitar
;;;extension=mysqli.so
; default ;;;extension=mysql.so
memory_limit = 128M
También
; mas que numero de ficheros ;;;extension=dbase.so
realpath_cache_size=32k ;;;extension=json.so
;;;extension=pdo_sqlite.so
; tiempo actualización 5h ;;;extension=sqlite.so
realpath_cache_ttl=72000 ;;;extension=wddx.so
;;;extension=xmlreader.so
; menos verificaciones ;;;extension=xmlwriter.so
open_basedir = Off ;;;extension=xsl.so
;;;extension=zip.so
#webperf @webperfEs @jrosell @einnova
12. APC: El Acelerador
Caché de código PHP
El interprete PHP compila el código y APC lo guarda en caché.
extension=apc.so
; Ajustar con el monitor de APC
apc.shm_size=256 ¿APC cómo fast caché?
; Sin verificar tiempo modificación app/etc/local.xml
apc.stat = 0 <config><global>... <cache>
; Ficheros a incluir <backend>apc</backend>
apc.num_files_hint=10000 <prefix>MAGEAPC</prefix>
apc.user_entries_hint=10000 </cache>...</config></global>
apc.max_file_size=5M
#webperf @webperfEs @jrosell @einnova
14. 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
15. Ajustes MySql
innodb_buffer_pool_size 80% de la memoria libre (MaxClients)
innodb_thread_concurrency (2 * [numberofCPUs] + 2)
thread_cache_size innodb_thread_concurrency / 2
max_connections relacionado MaxClients, mirar 'status'
table_cache En Magento serian suficiente 1000 tablas abiertas
query_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
16. Monitorizar Apache, Cache, MySql
APC Memcached
http://pecl.php.net/package/APC $ telnet 127.0.0.1 11211
apc.php ….
stats
… <conexiones, estadísticas, etc>
quit
MySql Apache workers
mysqltuner, innotop y 'mysql> show status;' <Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
#webperf @webperfEs @jrosell @einnova
17. 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
18. Resultados Memcached en Amazon EC2
Memcache con 1 instancia m1.large
Prueba con http://www.webpagetest.org
Resultados:
- Primer byte recibido 0.526s
- Inicio render 1.588s
- Tiempo de carga 3.003s
#webperf @webperfEs @jrosell @einnova
19. 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
21. 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
22. 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
23. Desarrollo: Configuraciones
Deshabilita modulos desde app/etc/modules
Los carga igual si sólo desactivas desde “Configuration > Advanced”
Atributos
Flat Frontend Catalog: EAV
Layered Navigation en búsquedas
Y el curioso caso de Merge CSS y JS...
Descargas en paralelo y payloads
#webperf @webperfEs @jrosell @einnova
24. 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
25. 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
26. 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
27. 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