El hospedaje de mis páginas web y blogs lo tengo con unos colegas en una empresa de Hosting. Empezamos con un VPS (Servidor Privado Virtual) Linux de 256 MB de RAM dedicados, pero en poco tiempo el sistema Virtuozzo empezó a tumbar el servicio web y otros servicios porque se consumía toda la memoria. Parece que Virtuozzo gestiona la memoria de esa forma, haciendo caer servicios para que la máquina no deje de funcionar (y siempre se pueda acceder a ella remotamente por SSH, por ejemplo). Puede parecer un poco chapuza pero se ve que Vituozzo trabaja así… Aunque no teníamos mucho tráfico y webs alojadas, decidimos ampliar a 512 MB, pero seguía pasando lo mismo. Los técnicos de la empresa de Hosting no sabían qué decirnos. Después de muchas pruebas y consultas, observamos que en memoria siempre habían muchos procesos de Apache cuando realmente el servidor no tenía tráfico en esos momentos. Al final, probando un poco, teníamos en httpd.conf:

<IfModule prefork.c>
StartServers       4
MinSpareServers    4
MaxSpareServers    20
ServerLimit       100
MaxClients        100
MaxRequestsPerChild  4000
</IfModule>

MaxSpareServers son los procesos en espera y según la web oficial de Apache, el valor por defecto es 10 y avisa “Fijar un valor alto para este parámetro es una mala idea casi siempre”. Así que lo cambiamos a 10 y desde entonces (hace 6 meses) todo ha ido bien.

Nos sorprendió que los técnicos de soporte fueran tan perdidos y no se les hubiera ocurrido una solución tan simple, aunque igual era una estrategia para que contratáramos más capacidad. No hemos vuelto a 256 MB porque siempre solemos tener 250-300 MB ocupados.

Para ver los procesos en memoria y la memoria ocupada se puede usar el comando “top” de Linux desde la línea de comandos del VPS. El panel Virtuozzo tiene una línea de comandos, una conexión SSH (Secure Shell) que va con Java. A mí personalmente no me funciona la conexión SSH por ahí, así que gasto un programa externo para realizar la conexión, como Putty. Nosotros ahora en el VPS tenemos varios WordPress con unas 1000 visitas diarias en total, una tienda Magento y otras webs menores… En total unos 60 dominios alojados + 40 alias… De correo no tenemos mucho. Pero como digo, no pasamos de 250-300 MB ocupados en memoria desde que cambiamos los MaxSpareServers, incluso ha aguantado dos “efectos menéame” de 7.000 y 13.000 visitas diarias en un sólo blog.

Etiquetas: , , , , , , , , , , , ,
8 Respuestas a “Pequeña optimización de Apache que evitó continuas caídas del servidor web en el VPS”
  1. Javier dice:

    Hola:

    Acabo de leer tu post y realmente me parece curioso que con tan poca optimización todo te esté funcionando bien ¿es un servidor windows? (yo uso linux).

    Yo tengo problemas de memoria/performance (me tarda muchísimo en responder el servidor una vez establecida la conexión) corriendo un VPS en 1and1 y la verdad que no lo puedo entender, de hecho estoy más o menos en la misma circunstancia, tengo unos 30 WP instalados pero no tienen tantas visitas como vosotros. ¿Estás utilizando plugins de caché en los WP? ¿Algo tipo APC para php?

    Una cuestión importante, ¿tienes el keepAlive ON? ¿ MaxKeepAliveRequests ? ¿KeepAliveTimeout ?

  2. admin dice:

    Hola Javier, gracias por comentar. He modificado el post para aclarar que es un VPS Linux, aunque ya lo comentaba cuando hablaba del comando “top” de Linux por SSH.

    Sobre tu problema ni idea, no utilizamos plugins de caché y lo del KeepAlive no lo sé, lo siento.

    Un saludo.

  3. Javier dice:

    Gracias igualmente, buen post.

  4. Max dice:

    Una consulta:
    Yo tengo el apache muy similar al tuyo, pero con el MySQL como has hecho?
    Wordpress consume muchos recursos.
    En el modulo perchild.c y worker.c como lo tienes configurado?
    Yo tengo 768 de ram y de a ratos se me va toda la swap libre en cuestion de segundos.
    Saludos!

  5. admin dice:

    Hola Max, del MySQL no tocamos nada porque no nos daba problemas, dime exactamente qué parámetros te interesan de perchild.c y worker.c y los puedo buscar.

  6. Max dice:

    MIra yo tengo la siguiente config:

    IfModule prefork.c
    StartServers 4
    MinSpareServers 4
    MaxSpareServers 10
    MaxClients 130
    MaxRequestsPerChild 4000

    IfModule worker.c
    #StartServers 2
    StartServers 3
    MaxClients 50
    MinSpareThreads 5
    MaxSpareThreads 10
    ThreadsPerChild 25
    MaxRequestsPerChild 1500

    IfModule perchild.c
    NumServers 5
    StartThreads 5
    MinSpareThreads 5
    MaxSpareThreads 10
    MaxThreadsPerChild 20
    MaxRequestsPerChild 20
    AcceptMutex

    ————–
    Aparte lo siguiente:
    Timeout 15
    KeepAlive On
    MaxKeepAliveRequests 100
    KeepAliveTimeout 5

    En algo debo estar errando porque el consumo se me va muy alto.
    Gracias por la ayuda!
    Espero leerte pronto..
    🙂

  7. admin dice:

    Nosotros tenemos:
    IfModule prefork.c
    StartServers 4
    MinSpareServers 4
    MaxSpareServers 10
    ServerLimit 100
    MaxClients 100
    MaxRequestsPerChild 4000

    IfModule worker.c
    StartServers 1
    MaxClients 10
    MinSpareThreads 1
    MaxSpareThreads 4
    ThreadsPerChild 25
    MaxRequestsPerChild 0

    IfModule perchild.c no tenemos.

    Timeout 120
    KeepAlive Off
    MaxKeepAliveRequests 100
    KeepAliveTimeout 15

  8. Max dice:

    Gracias , encontre que parte de mi problema estaba en el worker.c con el MaxRequestsPerChild alto..
    Igual sigo con gran consumo de mysql , a pesar de tenerlo tuneado para bajo consumo..
    Seguire probando como evitar tanto uso de swap.
    Se estabilizo bastante, pero debo quemarme un poco mas las pestañas leyendo 😛
    Saludos!

  9.  
Deja una Respuesta