Web Performance para
                Magento
                            Jordi Rosell
                        jrosell@einnova.es


#webperf   @webperfEs                        @jrosell   @einnova
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 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
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
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
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 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
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
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
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 / 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
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
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.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
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/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
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

Web Performance para Magento

  • 1.
    Web Performance para Magento Jordi Rosell jrosell@einnova.es #webperf @webperfEs @jrosell @einnova
  • 2.
    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
  • 3.
    Magento, líder mundialecommerce opensource #webperf @webperfEs @jrosell @einnova
  • 4.
    La plataforma OpenSource para comercios electrónicos que quieren crecer #webperf @webperfEs @jrosell @einnova
  • 5.
    Prestashop líder enEspanya Spain is different! #webperf @webperfEs @jrosell @einnova
  • 6.
    Resultados en hostingcompartido 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 tiemposen 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 tengoy 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: Eljefe 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
  • 13.
    Two level cache #webperf @webperfEs @jrosell @einnova
  • 14.
    Memcached: Cache rápiday 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 unservidor 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 enAmazon 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
  • 20.
    Waterfall #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 enMagento 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 ytemplates 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 yoverride 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 ymejoras 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
  • 28.
    Muchas gracias Abran juego, abran juego... #webperf @webperfEs @jrosell @einnova