Solucion a un alto consumo de recursos en WordPress

Por | 2017-01-10T14:11:00+00:00 23/11/2014|Wordpress|16 Comentarios

Evidentemente, cualquier aplicación PHP como por ejemplo WordPress consume recursos de memoria RAM y procesamiento cada vez que se ejecutan los scripts que generan la página que es enviada al usuario, eso hace que por norma general, cuanto más tráfico tenga una web, mas aumente el consumo de recursos.

En este artículo quiero explicar más o menos como y porque WordPress consume recursos del servidor de hosting donde se encuentra instalado y cómo podemos “solucionar” esto de la forma más acertada posible dependiendo de la situación en la que nos encontremos.

 

Funcionamiento interno básico de WordPress

WordPress es una aplicación web desarrollada en PHP que guarda sus datos en una base de datos MySQL (normalmente) y por lo tanto funciona a nivel servidor como cualquier otra aplicación desarrollada en PHP.
Todo lo que voy a exponer a partir de aquí es partiendo de la base de que estamos entrando a un sitio web creado con WordPress pero sin ningún tipo de cache instalado y configurado.

cpu wordpress

Cuando un usuario accede a una página de un blog creado con WordPress se realizan los siguientes pasos algo resumidos y sin entrar a detalles tecnicos:

  1. El usuario accede a la web a través del navegador y se envía al servidor web una petición para obtener la página requerida (Impacto leve/medio de CPU y memoria RAM).
  2. El servidor web usa PHP para procesar el script PHP que genera la página estática que necesita el cliente e insertando también algunos datos de la base de datos MySQL (Impacto alto de CPU y memoria RAM).
  3. La página generada es enviada al visitante mediante el protocolo HTTP o HTTPS (Impacto bajo de CPU y memoria RAM).

Como puedes ver, el consumo que se hace al generar las paginas HTML estáticas procesando el código PHP y usando el compilador interno de PHP, puede ser muy alto, de hecho, puede ser lo que cause un alto consumo de CPU en cualquier instalación de WordPress.

 

Pico de tráfico o consumo continuo

Debemos diferenciar dos cosas antes de comenzar a “diagnosticar” que elemento de nuestro sitio web es el que realiza un alto consumo de CPU, ya que dependiendo de las circunstancias debemos aplicar unas soluciones u otras:

  • Pico de trafico: El impacto es durante tiempo reducido y durante ese tiempo una avalancha de visitantes visita nuestro sitio:

cpu wordpress

  • Carga continua: La web siempre tiene bastantes visitantes online y se producen muchos hits que hacen  que el consumo de CPU sea continuo, en este caso se deben aplicar técnicas completamente diferentes para conseguir balancear el impacto sin afectar a la usabilidad.

cpu wordpress

Normalmente todo esto de lo que estamos hablando solo es aplicable a instalaciones de sitios web que funcionan sobre un servidor dedicado o sobre un servidor VPS. En los hosting compartidos si tu consumo de CPU es muy alto, es muy posible que acabes baneado rápidamente, en cambio sí solo se trata de un pico de trafico eventual, no tendras problema (normalmente).

 

Diagnosticar que plugin o elemento consume muchos recursos

El diagnóstico es solo la primera parte que se necesita hacer para solventar el problema, ya que si no se realiza un correcto diagnóstico del problema no podremos solucionarlo.

Lo primero que debemos tener claro, es que tenemos un problema y que el alto consumo de recursos no corresponde exactamente con el tráfico que tenemos, por ejemplo: si tenemos un VPS de 1 GB de memoria RAM, es imposible o casi imposible que soporte 500 usuarios concurrentes y a la vez mantener una buena usabilidad de usuario, aunque optimices todo al máximo, la web no será estable.

Para diagnosticar el problema podemos recurrir a múltiples opciones entre las que se encuentran diferentes herramientas externas o plugins para WordPress. Estas son las herramientas que utilizo yo para diagnosticar este tipo de problemas de consumo de recursos de CPU en WordPress:

  • PingDom Tools: Además de comprobar la velocidad de carga de cualquier sitio web, también permite comprobar que elementos de la página web tardan más en descargarse desde el servidor y de esta forma saber que elemento es el que ralentiza toda la carga. Por ejemplo, en la siguiente imagen vemos como el javascript de Piwik ralentiza la carga de la web:

cpu wordpress

  • GTMetrix: Al igual que la anterior aplicación (PingDom Tools) nos permite saber que elementos tardan más en descargarse desde el servidor. Al igual que Pingdom Tools, GTMetrix carga los elementos Javascript, por lo que tendremos una visión más clara, GTMetrix muestra más información técnica que GTMetrix.

cpu wordpress

  • Deshabilitar plugins uno por uno: La mayoría de los problemas que puedes encontratarte en un sitio WordPress es por culpa de los plugins, por esa razón una de las primeras cosas que debes hacer para detectar cual es el problema es desactivar los plugins uno por uno añadiéndole una letra a las carpetas de los plugins desde un cliente FTP (desde el panel puede ser imposible en algunos casos).
  • Comprobar los Widgets: Los widgets pueden ralentizar la carga en algunos casos, sobretodo sin incluimos código PHP en los widgets de texto. Con plugins como Widget Cache podemos conseguir cachear los plugins en disco.

Existen más formas de diagnosticar que nuestro WordPress tiene un problema que dificulta la carga del sitio web, pero en este artículo me sería imposible documentarlos todos, ya que algún método requiere conocimientos avanzados.

 

OPCode de PHP en WordPress 

Para entender lo que hace un cache OPCODE para PHP es necesario entender cómo funciona el intérprete o compilador de PHP cuando los visitantes acceden al sitio web y se realiza una petición para generar una página del sitio web.

Básicamente lo que hace un cache OPCode es cachear scripts PHP ya procesados y sirve lo que se obtiene con ellos posteriormente. Con esto se consigue ahorrar recursos, ya que cada vez que se ejecute un script PHP no se realizara todo el proceso de compilar y por lo tanto los resultados se servirán mucho más rápido.

Existen varios sistemas de cache OPCode para PHP, algunos más utilizados que otros y por lo tanto más efectivos.
En un análisis en forma de articulo redactado en el blog de Raiola Networks demostré que el sistema de cache OPCode más efectivo es Zend OPCache, integrado ahora en PHP5.5, pero existen otros sistemas OPCODE Cache como eAccelerator, APC o XCache.

Con un sistema de cache OPCODE para PHP conseguimos disminuir mucho el consumo de recursos y conseguiremos un consumo de recursos muchísimo más estable, de hecho he visto casos de sitios web WordPress instalados sobre dedicados que sin un sistema Zend OPCache se caía el sitio por desbordamiento.
El cache OPCode solo podras instalarlo y configurarlo si tu web funciona sobre un servidor VPS o servidor dedicado, si tu web está en un hosting compartido, deberás contratar con tu proveedor.

 

Cache de objetos en WordPress

El cache de objetos es otro cache que debe estar implementado en el servidor, por lo que solo podrás usarlo y configurarlo si tu web WordPress está instalado en un servidor dedicado o en un servidor VPS.

Con un sistema de cache de objetos conseguimos almacenar en memoria RAM o en disco el código de los elementos que forma la página web: imágenes, videos, y demás elementos que se carguen desde el servidor.
Con este tipo de cache, reduces el I/O de los discos duros y al mismo tiempo reduces los tiempos de respuesta al servir peticiones a los visitantes.

Este tipo de caches son indispensables para sitios web grandes, aunque también debemos tener en cuenta que cuantos más elementos tengas cacheados, mas memoria RAM deberías tener en el servidor.

Existen varios sistemas de cache de objetos que puedes usar para almacenar objetos cacheados en el servidor: APC (como cache de objetos), Memcached, XCache (como cache de objetos) o Redis.

Para usar un sistema de cache de objetos con WordPress tan solo tienes que instalar algunos plugins como por ejemplo EM Object Cache, W3 Total Cache, Cachify o WP-FFPC.
Además, con plugins como W3 Total Cache puedes cachear consultas a la base de datos en el almacenamiento de los sistemas de cache en memoria.

 

Cache de widgets en WordPress

Hace ya un par de semanas, uno de nuestros clientes de administración de servidores en Raiola Networks nos comentó que su sitio web consumía excesivos recursos de procesador para las visitas que tenía.
Hicimos un diagnóstico y nos dimos cuenta de que lo que generaba semejante consumo de recursos eran los widgets, pero no los podíamos cambiar ya que el cliente los necesitaba.

Implementamos un sistema de cache de widgets con refresco cada 5 minutos utilizando el plugin Widget Cache que guarda los elementos cacheados en disco, lo que produjo un aumento de I/O Wait de un 10% pero bajo la carga de procesador un 90%.

 

Cache de base de datos en WordPress

WordPress guarda todos los datos en base de datos MySQL por esa razon se realiza un uso intensivo del acceso a la base de datos y se consumen muchos recursos accediendo continuamente a datos que serán insertados en la web servida al visitante.

Existe la posibilidad de guardar en cache algunas consultas utilizadas, tanto en memoria como en cache en disco, y se puede hacer mediante plugin o mediante configuración de Query Cache en MySQL.
Si editamos la configuración de MySQL del servidor debemos especificar el tamaño de Query Cache según la memoria RAM que tengamos disponible en el servidor, ya que es ahí donde se van a guardar las consultas cacheadas.

Si queremos podemos almacenar el cache de consultas en sistemas de cache de objetos como APC (como object cache), XCache (como object cache) o Memcached, para ello tan solo debemos utilizar un plugin como W3 Total Cache.

Si queremos guardar consultas a la base de datos en un cache en disco (para hostings compartidos) podemos utilizar el plugin DB Cache Reloaded Fix.

 

Cache de páginas estáticas en WordPress

Desde siempre se ha podido cachear paginas estáticas en WordPress, lo más normal es hacerlo con sistemas como WP SuperCache o W3 Total Cache, pero guardando en el disco las paginas estáticas cacheadas.
Pero cuando hablamos de sitios web con un altísimo consumo de recursos, leer y escribir grandes volúmenes de archivos estáticos en disco duro aumenta el I/O Wait del servidor y reduce el rendimiento general, consiguiendo un retraso importante en las peticiones a la hora de ser respondidas.

Como ya he escrito en otro artículo, existen multitud de plugins que permiten cachear paginas estáticas en disco en el servidor, tan solo tienes que encontrar el que mejor se adapte a tus necesidades y te permita seguir escalando y mantener la estabilidad en las visitas.

 

CloudFare y CDN

Otro de los artículo que he publicado en esta “nueva etapa de vida” del blog es la implementación de un sistema de CDN en WordPress.
A mí personalmente solo hay dos sistemas de CDN que me gustan, y ambos son completamente diferentes uno del otro: por un lado esta CloudFlare y por el otro esta Amazon CloudFront.

La implementación de CDN es una forma de estabilizar el consumo de recursos al reducirse las peticiones realizadas al servidor, con esto conseguiremos que a nuestro servidor no le toque servir los archivos estáticos, ya que el CDN se encargara de servirlos.

 

Proxy inverso – Nginx y Varnish

Apache es un servidor web muy estable y bastante flexible a la hora de escalar, pero tiene un gran problema, y es que tiene un alto consumo de recursos a la hora de servir peticiones, y si la mayoría de los archivos servidos son estáticos, el consumo será alto sin razón.

Por esta razón si no queremos perder la flexibilidad y los módulos que ofrece Apache, pero a la vez queremos ahorrar recursos al servir archivos estáticos, podemos implementar un sistema de proxy inverso o reverse proxy usando Nginx o Varnish.

Lo que haremos es poner Nginx o Varnish entre el visitante y el servidor Apache que sirve la web, y de esta forma todo el tráfico pasara por el proxy inverso consiguiendo servir la página de forma menos optimizada y usando menos recursos.

 

Test de carga de WordPress

Existen varias herramientas para probar la velocidad de carga de WordPress e incluso comprobar como maneja el servidor situaciones críticas donde la carga de usuarios puede llegar a causar problemas de estabilidad y caídas del servicio.

Para probar la velocidad de carga podemos utilizar:

  • Pingdom Tools: http://tools.pingdom.com/fpt/
  • GTMetrix: http://gtmetrix.com/

Para probar la estabilidad podemos usar:

  • Load Impact (de pago): http://loadimpact.com/
  • Blitz (de pago): https://www.blitz.io/
  • Apache Benchmark (incluido en Apache)

 

Conclusiones finales

WordPress es uno de los gestores de contenido más escalables que conozco, quizás es uno de los más escalables ya que tiene compatibilidad mediante plugins con algunos de los sistemas más avanzados para balancear carga o cachear partes de la web.

Creo que en este artículo queda muy claro que WordPress se puede utilizar perfectamente para sitios web con un gran volumen de visitas, tan solo debemos conocer cómo funciona WordPress para optimizar el servidor y conseguir unos resultados optimos.

Si necesitas ayuda para optimizar tu WordPress y conseguir controlar el consumo de recursos, contacta con nosotros sin compromiso y te ayudaremos.

[Total: 20 Promedio: 3.4]

About the autor:

Mi nombre es Alvaro Fontela, soy consultor Wordpress y blogger activo desde hace años. Co-Fundador de Raiola Networks, escribiendo sobre Wordpress en este blog día tras día.