¿ Como reducir los consumos de CPU / Memoria en un sitio web ?

En muchos casos han habido problemas o confusiones por este tema entre nuestros clientes, por lo cual me han pedido que les explicara como es que funciona, o mejor dicho, como resolver este tema con los sitios en php, preparen el lapiz y papel que vamos a empezar.

Antes que nada, les anuncio que este es un tema un tanto largo, y que trataré de explicarlo lo más claro y conciso posible, de forma que si estás buscando algo específico puedes basarte en este mini-indice:

1: ¿De qué se tratan los consumos?
2: ¿Por qué llegar al punto de la suspensión?
3: Ok, pero vamos a ¿Cómo solucionarlo?
- 3.1: Un volumen alto de visitas por día con Scripts Pre-Armados
- 3.2: Un volumen alto de visitas por día con Scripts Propios
- 3.3: Consumos muy altos y visitas medianas o bajas
- 3.4: Ninguno de los anteriores



1.- ¿De qué se tratan los consumos?

Para empezar, como (talvez no todos) saben, las computadoras o servidores funcionan de forma muy similar; para cada proceso se utiliza esencialmente el CPU para interpretar el código y la memoria Ram para almacenar los datos mientras se ejecutan. Esto mismo pasa con todos los sitios web.

En el caso de sitios HTML, el proceso es prácticamente nulo y se podría decir que al entrar al sitio web la página automáticamente se descarga y se muestra al usuario. En sitios con programación web (PHP, Perl u otros), el CPU debe primero procesar su código para poder mostrarle al usuario la página.


2.- ¿Por qué llegar al punto de la suspensión?

En ocasiones, ya sea por un descuido o error en la programación, por algún método ineficiente de tomar datos, o por mala administración de bases de datos / archivo de contenidos; podemos causar que el sitio consuma mucha memoria, o que ingrese a un loop (ciclo de repetición sin fín), en el cual termine trabando a toda la PC o a todo el Servidor, según el caso.

Este es el motivo por el cual se detiene el acceso a estos sitios que causan mal funcionamiento o conflictos, y luego se notifica apropiadamente con un aviso al propietario (o revendedor del dominio). Posiblemente sea la causa por la cual estas leyendo esto, esperemos que no lo sea.

Si no se hiciera esto, el servidor seguiría cargándose exponencialmente hasta el punto en el que sea totalmente inaccesible incluso para un administrador. Ni hablar que nadie quiere ver su página web caída por algo que hace otra persona que ni siquiera conoce o tiene relación.

 

3.- Ok, pero vamos a ¿Cómo solucionarlo?

Impacientes o no, lo que nos importa es evitar este tipo de problema, por lo tanto dividí las posibles razones entre 4 grupos, revisa los primeros renglones de cada uno para saber a cual te aplicas tú.


- CASO 1: Un volumen alto de visitas por día con Scripts Pre-Armados

Tomemos como referencia más de 2000 o 3000 visitas únicas por día (las visitas únicas se contabilizan una por cada IP), aunque es un número no muy alto, depende del horario en el que se produzcan todas las visitas dado que si se produce el 80% de visitas de 14 a 16 horas, posiblemente en esos horarios tu sitio sobrecargue el servidor y deba ser corregido por más que en el resto del día no se produzcan muchas visitas.

Si posees un CMS pre-armado (por ejemplo PHP-Nuke, PostNuke, Joomla!, Mambo, entre otros), o algún script avanzado como ser un foro (ejemplo vBulletin, IPB, phpBB), un blog (Wordpress, b2evolution, otros), o similar, lo más probable es que el mismo requiera una configuración más robusta de sistema y debas pensar en pasar a un plan mayor (si no lo tienes aún), como ser un Servidor Virtual (VPS) o un Servidor Dedicado, dependiendo del volumen de visitas.

La única alternativa sería dejar el sistema que utilizas y programar uno propio, más liviano y básico que el anterior, pero permitiendo que el sistema requiera menos CPU para procesarlo a pesar que no baje el número de visitas (volviendo al tema anterior, HTML no requiere casi proceso, comparado con PHP+MySQL que puede causar problemas con tales niveles de visitas).

Ten en cuenta también que si posees muchos plugins / addons en estos scripts esto también aumenta el nivel de consumo que estos generan, por lo tanto es muy importante quitar los módulos o scripts innecesarios para depurar y evitar que el cpu se nos escape por lugares que no nos sirven para nada.

Es importante también que tus scripts y addons/plugins estén actualizados a la última o anteúltima versión dado que sino estarías en riesgo de ser atacado o hackeado y perder todos tus datos, o incluso que utilicen tu sitio como proxy para enviar spam / publicar sitios ilegales dentro del tuyo, y esto te comprometería a tu, y tu seguridad.


- CASO 2: Un volumen alto de visitas por día con Scripts Propios

Si no entras en el caso anterior, y NO posees ningún script pre-armado sino que está programado enteramente por tí o algún programador que conozcas; entonces lo que tienes que hacer es revisar todo tu código realizando pruebas para evitar bugs o problemas.

Si hiciste un cambio recientemente, vuelve todo atrás y empieza desde cero con ello, puede que no notes el problema si tratas de re-leer el código o que tal ves ya no recuerdes como funciona. También es posible que con el tiempo hayas aprendido mejores formas de ejecutarlo que solucionen el tema, las siguientes son varias recomendaciones que puedes tener en cuenta:

  • Realiza «querys» cortos y concisos:
    - Hay formas de realizar búsquedas avanzadas en MySQL entre 4 o 5 tablas, con 8 o 9 condiciones; pero esto eleva muchísimo los consumos y retarda en sobremanera al sitio.
    - Traer los datos necesarios y luego compararlos utilizando PHP puede ser que no sólo aliviane la carga, sino que el sitio cargaría muchísimo más rápido dado que el PHP puede realizar procesos de comparación a mayor velocidad que el MySQL compara datos entre distintas tablas. [1]
    - También es una buena idea evitar realizar selects completos ("SELECT * FROM...") y en su reemplazo tomar sólo las variables necesarias, por ejemplo "SELECT nombre,apellido FROM...".
    [1] Nota: Esto se hizo comparando los mejores métodos de MySQL, con una buena programación; si la programación es mala, demoraría incluso más.
  • Evita buscar entre miles de tablas y/o registros grandes:
    - Esto se puede solucionar utilizando tablas diferenciadas por letra inicial en lugar de solo una tabla para todo, en el caso de un listado de noticias o formularios.
    - También puede realizarse un archivo de notas o datos que no se actualizan o utilizan por un tiempo y enviarlos a otra tabla para evitar que siempre se pasen todos los datos cuando se utilizan sólo algunos.
    - Puede implementar algún caché de texto plano si la base de datos a la que te conectas no se actualiza constantemente (por ejemplo configuraciones de un script / datos de usuarios que puedan no actualizarse cada x tiempo, etcétera) y luego tome los datos desde el archivo de texto en lugar de conectarse con el MySQL. Ten en cuenta que actualizar este caché puede nuevamente elevar los consumos, por lo tanto puedes actualizar sólo los datos nuevos y no todos para evitar rehacer el archivo.
    - Fuera de esto, si las tablas poseen texto, es recomendable dividirlas en 2, una tabla que posea los títulos y/o datos del usuario, y otra que posea sólo el texto, ambas unidas entre sí por un único ID. Este funcionamiento es básico entre Foros y Portales reconocidos, de esta forma puedes pasar por sobre miles de datos sin tener que cargar el texto que seguramente ocupe varios Mb de espacio adicional.
    - Para búsquedas es recomendable realizar un indexado rápido de referencias, varios foros usan este método, que se trata de hacer una tabla (o base de datos) que posee 2 campos, palabras y ids. Las palabras son simplemente palabras que un usuario puede buscar, de más de 3 letras y menos de algún límite, referenciadas a un ID, que es el ID de la nota, noticia o el tipo de dato que se necesite a fin de no tener que buscar en todo el texto cuando ya se sabe que la palabra está allí. Esta tabla se puede rellenar automáticamente en el momento en que se agreguen nuevos datos o se borren datos viejos.
  • Evita Hacks y Abusos:
    - Es importante que las tareas que consumen muchos recursos (como las búsquedas), estén limitadas, por ejemplo en algunos foros no se puede realizar más de 1 búsqueda cada 5 o 10 segundos, ten en cuenta que una persona normal no necesitaría mucho más que eso, y sí lo haría un bot automático con intenciones de molestar. Puedes implementar el mismo limite para las descargas y evitar que los usuarios roben todo tu bandwidth (estos límites los puedes ver utilizandose varios sitios gratuitos de descarga como rapidshare o megaupload).
    - Es importante proteger tu sitio web para evitar que un spammer o hacker lo abuse, en AtlanticaDigital.net muchas de estas protecciones se cargan por defecto, pero es recomendable que las conozcas.
  • Programa eficientemente:
    - Nunca sabes si tu empresa crecerá y de pronto tendrás que enseñarles a subordinados como funciona tu código y como pueden mejorarlo, por lo tanto trata de manejarte con funciones comunes de PHP, si tienes que repetir código implementa funciones propias o clases, y siempre añade comentarios prolijamente sobre qué hace tu código, de forma que si alguien ingresa y necesita leer tu código pueda saber como ayudarte, estos comentarios y funciones no serán legibles por el usuario que visita a tu sitio web, por lo tanto no pierdes ningún tipo de seguridad sino que ganas ayuda.



- CASO 3: Consumos muy altos y visitas medianas o bajas

Si notas que tus visitas caen, pero los consumos del sitio se van a las nubes, seguramente el código de tu sitio esté mal, y la gente se fastidie, o no pueda ingresar, y por más que no cargue tu sitio, el mismo se sigue ejecutando en el background (de fondo), y consume recursos para algo que no funciona.

Tendrás que revisar que todos los ciclos de repetición estén bien; por ejemplo, si el ciclo se ejecuta hasta que el total de firmas sea 5, revisa o razona acerca de qué ocurriría si las firmas sean más de 6 o menos de 4.

Revisa que todas las conexiones a MySQL estén bien y se cierren siempre al final con un mysql_close(); y NO utilices la función mysql_pconnect() dado que esta función crea una conexión persistente que no es recomendada para utilizar con PHP comúnmente.


- CASO 4: Ninguno de los anteriores

Si tu sitio se encuentra sobrecargado y no tienes idea de cual es la razón, puede que algún hacker o spammer haya subido archivos a tu sitio mediante algún xploit o bug desconocido en tu sitio. Deberás revisar todos los archivos con un script de antivirus + antispyware y chequear que no hayan scripts que tu no hayas puesto ahí.

Recuerda que SIEMPRE debes actualizar tus scripts a la última versión, dado que estas incluyen fixes de seguridad que talvez sean incomprensibles para tí, pero realmente detienen las acciones de hackers.

Si esto tampoco soluciona el caso, es hora de crecer, deberás pasar a un Servidor Semi-Dedicado, Servidor Virtual (VPS) o un Servidor Dedicado. Ten en cuenta que estos tienen otro tipo de configuración y/o limitaciones, que deberás aprender antes de dar el salto.

Was this answer helpful?

 Print this Article

Also Read

Para la optimizacion de Moodle Cache

Para la optimización del Moodle esta para trabajar desde la version 1.7 o anteriores....

Para la optimizacion de Joomla 1.0.x

Éstos son algunos consejos sobre cómo mejorar el rendimiento de su sitio web...

Como optimizar una base de datos MySQL

Uno de los requisitos más importantes para lograr el rendimiento óptimo de la base...

Para la optimizacion de Joomla 1.5

Joomla utiliza una configuracion para poder optimizar su sitio, esta en la opcion "Configuracion...

Para la optimizacion de Wordpress Cache

WP SUPER CACHE una breve descripcion de este plugin. Este plugin, como pueden ver en la foto...