Optimizar un Servidor de Alto Tráfico

optimizar-un-servidor-de-alto-tráfico

Si se están alcanzando los límites de un servidor ejecutando Apache, sirviendo una gran cantidad de contenido dinámico, puede cambiarse el mismo por un hardware más poderoso o primero intentar algunas técnicas para mejorar su rendimiento. Este punto cita las técnicas que pueden permitir esto último.

Problemas Comunes:

  • Swapping – Demasiados procesos en ejecución utilizando demasiada RAM
  • CPU ” Consultas a Bases de Datos mal optimizadas, código de programación mal optimizado, procesos fuera de control
  • Red – Límites de hardware, Ataques

Soluciones Básicas:

  • Utilizar el comando top d2c y ps axu para comprobar si hay procesos que utilizan mucha CPU o RAM.
  • Usar netstat -anp | sort -u para comprobar si hay problemas de red.

Mejorar el Uso de la RAM por el Apache

Los procesos del Apache pueden utilizar grandes cantidades de memoria RAM si no están bien optimizados.

  • Si el Apache sirve 100% archivos estáticos, cada proceso httpd utilizará alrededor de 2-3 megas de RAM.
  • Si el Apache sirve 99% archivos estáticos y 1% archivos dinámicos, cada proceso httpd utilizará desde 3-20 megas de RAM (dependiendo de la complejidad de las páginas dinámicas).

Esto ocurre porque un proceso crece para dar cabida a todo lo que debe servir y nunca disminuye nuevamente a menos que ese proceso muera. En forma sencilla, a menos que se tengan muy pocas páginas dinámicas y una fluctuación de tráfico importante, la mayoría de los procesos httpd ocuparán una cantidad de RAM igual al script dinámico más grande en el sistema. Un servidor web inteligente debería tratar esto automáticamente, sin embargo, se tiene varias opciones para mejorar el uso de la RAM de forma manual.

Reducir los procesos desperdicio mediante la adecuación de KeepAlive:

Se trata de un equilibrio. KeepAliveTimeout es la cantidad de tiempo que se permite un proceso cuando no hace nada, pero sigue ocupando espacio. Esos segundos se suman en gran medida. Pero usando KeepAlive puede aumentarse la velocidad tanto para usted como para el cliente (si se desactiva KeepAlive el servicio de archivos estáticos como las imágenes puede ser mucho más lento). Lo mejor es tener KeepAlive en On y KeepAliveTimeout con un valor bajo (como 1 ó 2 segundos).

Límitar los procesos totales con MaxClients:

Si se usa Apache para servir contenido dinámico, las conexiones simultáneas se hacen muy limitadas. Si se supera un determinado número, el sistema comienza a realizar intercambios caníbales, haciéndose más lento y más lento hasta que muere. Use el ensayo y error para averiguar cuántos procesos de Apache pueden manejar el servidor y establecer dicho valor en MaxClients.

Nota:

la documentación del Apache sobre esto es engañosa – si se alcanza este límite, los clientes no serán “bloqueados”, simplemente se colocarán en la cola y su acceso se vuelve más lento. Basándose en el valor de MaxClients, se pueden estimar los valores que se necesitan para StartServers, MinSpareServers y MaxSpareServers.

Forzar el reinicio de procesos con MaxRequestsPerChild:

Obligar que los procesos mueran después de un tiempo hace que luego empiecen con un bajo uso de RAM, y esto en muchas situaciones puede reducir el uso de la memoria total. A menor contenido dinámico que se tenga, más útil será este método. Esto crea un juego de aumento-disminución, con los archivos dinámicos constantemente aumentando el uso total de la RAM y el reinicio de procesos constantemente reducirlo. Experimente con la directiva MaxRequestsPerChild – incluso valores tan bajos como 20 pueden funcionar bien. Pero no la coloque demasiado baja, porque la creación de nuevos procesos causa sobrecarga. Es posible averiguar la mejor configuración de carga mediante la ejecución del comando ps axu –sort:rss .

Nota:

El uso de este método es delicado. Si la única manera de mantener el servidor en ejecución es mediante el uso de este parámetro, finalmente se caerá en problemas. Dicho esto, modificando MaxRequestsPerChild es posible aumentar MaxClients tanto como en un 50%.

Mayor Afinación del Apache:

Para sitios de propósito mixto (como galerías de imágenes, sitios de descarga, etc.), a menudo puede mejorarse el rendimiento mediante la ejecución de dos demonios de apache diferentes en el mismo servidor. Esto es una opción avanzada solo para servidores dedicados a sitios de muy alta carga

Uso de CPU y RAM de PHP:

Compilar scripts PHP es generalmente más caro que ejectuarlos. ¿Por qué no usar una herramienta sencilla que los mantenga precompilados?. Se recomienda el uso de Turck MMCache. Algunas alternativas son PHP Accelerator, APC y Zend Accelerator. Esto causará un aumento en la velocidad entre 2x a 10x.

Optimizar las consultas de la base de datos:

Esto se trata en detalle en diversas partes, algunas notas importantes son: una instrucción de consulta incorrecta, ejecutándose a menudo, puede hacer que un sitio se cuelgue. Si se optimiza solo una consulta no se puede ver gran mejora de velocidad de todo el servidor. Si se buscan y optimizan todas las consultas ineficientes puede llegarse a una mejora de velocidad del servidor equivalente a 5x. La característica log-slow-queries de MySQL puede ser muy útil.

Cómo reportar logs de consultas lentas:

Ejecutar:

# nano /etc/rc.d/init.d/mysqld

Buscar esta línea:

SAFE_MYSQLD_OPTIONS="--defaults-file=/etc/my.cnf"

Cambiar a:

SAFE_MYSQLD_OPTIONS="--defaults-file=/etc/my.cnf--log-slow-queries=/var/log/slow-queries.log"

Como se puede ver, se añade la opción de registrar todas las consultas lentas a /var/log/slow-queries.log

Cierre y guarde el archivo.

Ahora ejecutar:

touch /var/log/slow-queries.log
chmod 644 /var/log/slow-queries.log

Ahora debe re-arrancarse mysql:

service myslqd restart

mysqld registrará todas las consultas lentas a este archivo.