Optimizando apache al máximo

Hace poco tuve que enfrentarme con un servidor de un amigo que tenia varios sitios muy populares… mucho swapping, altos iowaits y se bloqueaba de manera aleatoria.

El server es un Celeron 1.7 con 512 MB RAM y cada uno de los sitios andan por el orden de varios de miles de hits al dia.

Despues de experimentar varios dias con estos problemas encontré una mezcla de soluciones que me permitio que el server no se caiga y mantenga el paso con las peticiones de clientes…

  • Instala eaccelerator para reducir la carga al compilar las paginas php. UPDATE Jul 2009 ( Ahora uso Xcache en lugar de Eaccelerator)
  • Desactiva el logging en el apache: si tienes trafico alto los logs pueden causarte pesadillas por el uso de disco. Al desactivarlo permites que se entreguen archivos mas rapidamente.
  • Descargué e instale Litespeed Webserver ( yo usé la version Standard, libre pero solo llega hasta 300 clientes concurrentes.. si son necesarios más… tendrias que comprar la version enterprise y ya no te costea $500 USD ) y lo configuré para correr en un puerto alto (8080) importando las configuraciones de virtual hosting del apache.
  • Usé una regla de redirección para que todo el contenido estatico ( imagenes, videos y swf ) sean redireccionados al servidor recien instalado en el puerto alto (8080)

Esto puede ser configurado directamente en el httpd.conf o un .htaccess en el directorio publico. ( Yo normalmente lo pongo en un .httaccess en la carpeta donde esta mi sitio mas usado )
RewriteEngine on
RewriteRule .*\.(gif|GIF|jpg|JPG|png|PNG|swf|SWF|pdf|PDF)$ http://%{HTTP_HOST}:8080%{REQUEST_URI}

(Son dos lineas )

  • Activa las opcionesde compresion en /etc/php.ini

output_buffering = On
output_handler = ob_gzhandler

  • Como ya no estoy enviando contenido estático con el apache, desactivo las opciones de Keepalive, ajusto MaxRequestsPerChild a un valor alto, MinSpareServers 10 MaxSpareServers 20 y StartServers a un valor inicial medio ( yo usé 80 )

El webserver en el puerto alto hace parte de la magia, corre practicamente sin demasiada memoria ( 20MB en horas pico pero solo en un proceso ) y sirve hasta 300 usuarios concurrentes con un gasto minimo de CPU ( mucho menos del 1% ), Apache aun sigue enviando contenido dinámico, usando esta combinación Apache aún usa de 10 a 20 MB de RAM por proceso pero el tiempo que un cliente utiliza el Apache es menor que en una configuración tradicional, esto reduce la concurrencia de clientes en el Apache.
Los cambios en KeepAlive permiten que el apache termine una peticion y atienda la siguiente sin esperar peticiones extra del cliente. ( las cuales son atendidas por el otro servidor ) bajando asi el numero de clientes concurrentes usando Apache

Estos ajustes redujeron dramaticamente la carga de el servidor
Ahora el server tiene un promedio de carga muy diferente…
load average: 0.68, 0.56, 0.59
manejando unos 140 procesos de apache ( muchos más en hora pico cerca de los 250 ) y aun tiene la mitad del procesador libre..
El load común antes de estos cambios era de más de 9
.

10:10pm up 36 days, 12:19, 1 user, load average: 0.68, 0.56, 0.59
203 processes: 193 sleeping, 10 running, 0 zombie, 0 stopped
CPU states: 15.9% user, 14.4% system, 11.1% nice, 58.3% idle
Mem: 506024K av, 468176K used, 37848K free, 0K shrd, 25916K buff
Swap: 1020116K av, 49596K used, 970520K free 195640K cached

. . . .total used free shared buffers cached
Mem: 494 455 38 0 23 181
-/+ buffers/cache: 250 243
Swap: 996 48 947

Adicionalmente una optimización del servidor mysql seria lo indicado….

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *