XCACHE Magento – 2013
Bien volviendo después de un tiempo, nos topamos que nuestro servidor estaba siendo completamente agotado en el consumo de la CPU, los índices saltaban de 0% de consumo al 500% (100% era el tope), lo que nos provocaba que todos los servicios alojados en el servidor perdieran velocidad.
La culpa era de un tienda Magento muy éxitosa en visitas, 1800 visitas al día y no solo a una página estática, sino que estas 1.800 visitas recorrian muchas categorías de esta tienda, que posee más 1500 productos de alta demanda y sin nombrar a los robots de google que “chupan” mucha CPU al servidor.
La página estaba al nivel de carga “Page load Time” en 6,8 seg y bajó como promedio a 3 seg y fracción. Para que comprueben que mis palabras son reales, pueden verificarlos por ustedes mismos en: gtmetrix.com e ingresar está tienda Magento vinoswine.cl.
Lo que se hizo fue lo siguiente:
1.- Instalar Xcache versión 3.0.3
wget http://development.magento.cl/xcache-3.0.3.tar.gz tar -zxf xcache-*.tar.gz cd xcache-3.0.3 phpize ./configure --enable-xcache make make install
2.- Verás que extension=xcache.so quedó en
/usr/lib64/php/modules/extension=xcache.so
3.- Ingresar xcache.ini a tu php.ini y dejarlo de está manera (customizado por mi y funcionado bien en servidor Media Temple dv level 4.0 64 bits):
Primero respaldar nuestro php.ini
cp /etc/php.ini /etc/php.ini.bak31082013
Ahora ingresar xcache.ini
;; this is an example, it won't work unless properly configured into php.ini [xcache-common] ;; non-Windows example: extension = xcache.so ;; Windows example: ; extension = php_xcache.dll [xcache.admin] xcache.admin.enable_auth = On ;xcache.admin.user = "mOo" xcache.admin.user = "admin" ; set xcache.admin.pass = md5($your_password) ; login use $your_password xcache.admin.pass = "70980fdcc758341b5a9d73af096c8c78" [xcache] ; ini only settings, all the values here is default unless explained ; select low level shm implemenation xcache.shm_scheme = "mmap" ; to disable: xcache.size=0 ; to enable : xcache.size=64M etc (any size > 0) and your system mmap allows xcache.size = 260M ; set to cpu count (cat /proc/cpuinfo |grep -c processor) xcache.count = 1 ; just a hash hints, you can always store count(items) > slots xcache.slots = 8K ; ttl of the cache item, 0=forever xcache.ttl = 0 ; interval of gc scanning expired items, 0=no scan, other values is in seconds xcache.gc_interval = 0 ; same as aboves but for variable cache xcache.var_size = 224M xcache.var_count = 1 xcache.var_slots = 8K ; default value for $ttl parameter of xcache_*() functions xcache.var_ttl = 0 ; hard limit ttl that cannot be exceed by xcache_*() functions. 0=unlimited xcache.var_maxttl = 0 xcache.var_gc_interval = 300 ; mode:0, const string specified by xcache.var_namespace ; mode:1, $_SERVER[xcache.var_namespace] ; mode:2, uid or gid (specified by xcache.var_namespace) xcache.var_namespace_mode = 0 xcache.var_namespace = "" ; N/A for /dev/zero xcache.readonly_protection = Off ; for *nix, xcache.mmap_path is a file path, not directory. (auto create/overwrite) ; Use something like "/tmp/xcache" instead of "/dev/*" if you want to turn on ReadonlyProtection ; different process group of php won't share the same /tmp/xcache ; for win32, xcache.mmap_path=anonymous map name, not file path xcache.mmap_path = "/dev/zero" ; Useful when XCache crash. leave it blank(disabled) or "/tmp/phpcore/" (writable by php) xcache.coredump_directory = "/tmp/xcache" ; Windows only. leave it as 0 (default) until you're told by XCache dev xcache.coredump_type = 0 ; disable cache after crash xcache.disable_on_crash = Off ; enable experimental documented features for each release if available xcache.experimental = Off ; per request settings. can ini_set, .htaccess etc xcache.cacher = On xcache.stat = On xcache.optimizer = Off [xcache.coverager] ; enabling this feature will impact performance ; enabled only if xcache.coverager == On && xcache.coveragedump_directory == "non-empty-value" ; per request settings. can ini_set, .htaccess etc ; enable coverage data collecting and xcache_coverager_start/stop/get/clean() functions xcache.coverager = Off xcache.coverager_autostart = On ; set in php ini file only ; make sure it's readable (open_basedir is checked) by coverage viewer script xcache.coveragedump_directory = ""
Nota fijarse que el usuario está descrito en xcache.admin.user = “admin”
y la contraseña está en md5 ingresada en xcache.admin.pass = “70980fdcc758341b5a9d73af096c8c78”
la cual debes ingresar la suya.
4.- Luego copiamos el controlador de xcache al admin de un sitio y nos vamos a la carpeta “xcache-3.0.3” (cuando la descomprimimos), y entramos:
cd xcache-3.0.3 mkdir /var/www/vhosts/tiendamagento.cl/httpdocs/xcache cp -R htdocs/* /var/www/vhosts/tiendamagento.cl/httpdocs/xcache
5.- Ahora puedes ver como puedes controlar la cache de tus dominios a diestra y siniestra.
6.- Ahora nos vamos a Magento, que es lo que nos interesa optimizar con xcache:
Ir a app/etc/local.xml y antes de que acabe “/global” ingresamos lo siguiente:
xcache database 0 0
7.- Después ir a app/code/core/Mage/Core/Model/Cache.php y en la línea 181 comentar “$enable2levels = true”:
case 'xcache': if (extension_loaded('xcache')) { //$enable2levels = true; $backendType = 'Xcache'; }
Esto hay que realizarlo, porque Magento trabaja con 2 niveles de caché, las cuales no podemos controlar, y si trabajamos con APC y SERVER API cgi o fastcgi queda flor de desastre, y yo creo que Magento se equivoca en esto de recomedar APC, que alguna vez explicaré en detalle del porque no me gusta APC. Creo xcache es lo mejor que se puede utilizar para controlar de manera eficiente la cache de Magento. En el mismo tema, deben aplicar este punto 7 o sino les saldrá este error “fast_backend must implement the Zend_Cache_Backend”.
8.- Ahora se darán cuenta, si van a la carpeta var/cache y borran todo lo que hay dentro, que ya no estará grabando la “ineficiente caché de Magento, según mi criterio” cuando trabajas con tiendas de alto desempeño con muchas visitas y muchas peticiones a la base datos.
Verán además que tiendamagento.cl/xcache en la sección “List Var Data” está funcionando correctamente, como así también “List PHP” donde podemos de por fin, manejar la caché de magento de una manera transparente y eficiente. Y simplemente con nuestra caché habilitada en Magento, si nos pide refrescar, lo hacemos y refresca la caché de xcache… genial!
Atte
Boris Durán R.